Skip to main content الرئيسية المنشئون jeremylongshore tons-of-skills-marketplace clay-observability
clay-observability Monitor Clay enrichment pipeline health, credit consumption, and data quality metrics.
Use when setting up dashboards for Clay operations, configuring alerts for credit burn,
or tracking enrichment success rates.
Trigger with phrases like "clay monitoring", "clay metrics", "clay observability",
"monitor clay", "clay alerts", "clay dashboard", "clay credit tracking".
الانتقال إلى التثبيت سوق المهارات اكتشف واستكشف مهارات الذكاء الاصطناعي التي بناها المجتمع.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
نسخ Promptعرض تفاصيل Prompt يتجاوز الأمر المباشر Prompt المخصّص للمراجعة. افحص المصدر قبل تشغيله.
npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill clay-observabilityيبقى الأمر في سطر واحد. مرّر أفقيًا لمراجعته كاملًا قبل النسخ.
تفضّل نسخة محلية؟ نزّل الملفات المتاحة حاليًا لدى SkillsMP.
تحميل Zip جاري التحميل... المزيد من هذا المستودع langchain-deploy-integration Deploy a LangChain 1.0 / LangGraph 1.0 app to Cloud Run, Vercel, or LangServe correctly — with timeouts sized for chain length, cold-start mitigation, SSE anti-buffering headers, and Secret Manager over .env. Use when prepping a first production deploy, debugging a stream that hangs behind a proxy, or diagnosing p99 latency spikes. Trigger with "langchain deploy", "langchain cloud run", "langchain vercel python", "langchain langserve", or "langchain docker".
langchain-langgraph-agents Build a correct LangGraph 1.0 ReAct agent with create_react_agent — typed tools, error propagation, recursion caps, and stop conditions that actually stop. Use when writing a first tool-calling agent, migrating from AgentExecutor or initialize_agent, or diagnosing an agent that loops on vague prompts. Trigger with "langgraph agent", "create_react_agent", "langgraph tool calling", "AgentExecutor migration", or "agent loop cost".
langchain-langgraph-human-in-loop Build LangGraph 1.0 human-in-the-loop approval flows with interrupt_before /
interrupt_after and Command(resume=...) — JSON-serializable state, clean
resume semantics, and UI wiring for approval decisions. Use when adding an
approval gate before an expensive tool call, wiring a Slack/web UI for agent
approvals, or debugging a graph that crashes on interrupt.
Trigger with "langgraph human in loop", "langgraph interrupt_before",
"langgraph approval flow", "Command resume", "langgraph HITL".
name clay-observability description Monitor Clay enrichment pipeline health, credit consumption, and data quality metrics.
Use when setting up dashboards for Clay operations, configuring alerts for credit burn,
or tracking enrichment success rates.
Trigger with phrases like "clay monitoring", "clay metrics", "clay observability",
"monitor clay", "clay alerts", "clay dashboard", "clay credit tracking".
allowed-tools Read, Write, Edit, Bash(curl:*) version 1.14.0 license MIT author Jeremy Longshore <jeremy@intentsolutions.io> tags ["saas","clay","monitoring","observability","dashboard"] compatibility Designed for Claude Code
Clay Observability
Overview
Monitor Clay data enrichment pipeline health across four dimensions: credit consumption velocity, enrichment success rates (hit rates), data quality scores, and CRM sync reliability. Clay's credit-based pricing model makes observability essential for cost control.
Prerequisites
Clay account with table access
Metrics infrastructure (Prometheus/Grafana, Datadog, or custom)
Webhook receiver that logs enrichment results
Understanding of your enrichment column configuration
Instructions
Step 1: Instrument Your Clay Webhook Handler
interface ClayMetrics {
enrichmentsReceived : number ;
enrichmentsWithEmail : number ;
enrichmentsWithCompany : number ;
enrichmentsWithPhone : number ;
estimatedCreditsUsed : number ;
averageICPScore : number ;
leadsTier : { A : number ; B : number ; C : number ; D : number };
}
class ClayMetricsCollector {
private metrics : ClayMetrics = {
enrichmentsReceived : 0 ,
enrichmentsWithEmail : 0 ,
enrichmentsWithCompany : 0 ,
enrichmentsWithPhone : 0 ,
estimatedCreditsUsed : ,
: ,
: { : , : , : , : },
};
scoreSum = ;
( ) {
. . ++;
(lead. ) . . ++;
(lead. ) . . ++;
(lead. ) . . ++;
. . += creditsPerRow;
score = lead. || ;
. += score;
. . = . / . . ;
(score >= ) . . . ++;
(score >= ) . . . ++;
(score >= ) . . . ++;
. . . ++;
}
(): {
m = . ;
emailRate = m. >
? ((m. / m. ) * ). ( )
: ;
companyRate = m. >
? ((m. / m. ) * ). ( )
: ;
[
,
,
,
,
,
,
,
,
]. ( );
}
}
0
averageICPScore
0
leadsTier
A
0
B
0
C
0
D
0
private
0
record
lead : Record <string , any >, creditsPerRow : number = 6
this
metrics
enrichmentsReceived
if
work_email
this
metrics
enrichmentsWithEmail
if
company_name
this
metrics
enrichmentsWithCompany
if
phone_number
this
metrics
enrichmentsWithPhone
this
metrics
estimatedCreditsUsed
const
icp_score
0
this
scoreSum
this
metrics
averageICPScore
this
scoreSum
this
metrics
enrichmentsReceived
if
80
this
metrics
leadsTier
A
else
if
60
this
metrics
leadsTier
B
else
if
40
this
metrics
leadsTier
C
else
this
metrics
leadsTier
D
getReport
string
const
this
metrics
const
enrichmentsReceived
0
enrichmentsWithEmail
enrichmentsReceived
100
toFixed
1
'0'
const
enrichmentsReceived
0
enrichmentsWithCompany
enrichmentsReceived
100
toFixed
1
'0'
return
`=== Clay Enrichment Report ===`
`Total processed: ${m.enrichmentsReceived} `
`Email find rate: ${emailRate} %`
`Company match rate: ${companyRate} %`
`Avg ICP score: ${m.averageICPScore.toFixed(1 )} `
`Lead distribution: A=${m.leadsTier.A} B=${m.leadsTier.B} C=${m.leadsTier.C} D=${m.leadsTier.D} `
`Estimated credits used: ${m.estimatedCreditsUsed} `
`Cost per email found: ${(m.estimatedCreditsUsed / Math .max(m.enrichmentsWithEmail, 1 )).toFixed(1 )} credits`
join
'\n'
Step 2: Set Up Prometheus Metrics (Optional)
import { Counter , Gauge , Histogram } from 'prom-client' ;
const clayEnrichmentsTotal = new Counter ({
name : 'clay_enrichments_total' ,
help : 'Total enrichments received from Clay' ,
labelNames : ['table' , 'status' ],
});
const clayCreditsUsed = new Counter ({
name : 'clay_credits_used_total' ,
help : 'Estimated Clay credits consumed' ,
labelNames : ['table' , 'enrichment_type' ],
});
const clayHitRate = new Gauge ({
name : 'clay_enrichment_hit_rate' ,
help : 'Enrichment hit rate percentage' ,
labelNames : ['table' , 'field' ],
});
const clayCreditBalance = new Gauge ({
name : 'clay_credit_balance' ,
help : 'Remaining Clay credits' ,
});
const clayICPScore = new Histogram ({
name : 'clay_icp_score' ,
help : 'Distribution of ICP scores' ,
buckets : [20 , 40 , 60 , 80 , 100 ],
labelNames : ['table' ],
});
function recordEnrichment (table : string , lead : Record <string , any > ) {
clayEnrichmentsTotal.inc ({ table, status : lead.work_email ? 'enriched' : 'empty' });
clayCreditsUsed.inc ({ table, enrichment_type : 'waterfall' }, 6 );
clayICPScore.observe ({ table }, lead.icp_score || 0 );
}
Step 3: Configure Alerting Rules
groups:
- name: clay-enrichment
rules:
- alert: ClayCreditBurnHigh
expr: rate(clay_credits_used_total[1h]) > 200
for: 15m
labels:
severity: warning
annotations:
summary: "Clay credit burn rate > 200/hour. Monthly projection: {{ $value | humanize }} credits"
- alert: ClayLowEmailHitRate
expr: clay_enrichment_hit_rate{field="email"} < 40
for: 30m
labels:
severity: warning
annotations:
summary: "Email find rate below 40% on table {{ $labels.table }} . Check input data quality."
- alert: ClayCreditBalanceLow
expr: clay_credit_balance < 500
labels:
severity: critical
annotations:
summary: "Clay credit balance below 500. Enrichments will stop when credits run out."
- alert: ClayWebhookFailureRate
expr: rate(clay_enrichments_total{status="error"}[15m]) > 0.1
labels:
severity: warning
annotations:
summary: "Clay webhook callback failure rate > 10%"
Step 4: Build a Dashboard Key panels for a Clay observability dashboard:
dashboard_panels:
row_1:
- name: "Credit Balance"
type: gauge
metric: clay_credit_balance
thresholds: [500 , 1000 , 5000 ]
- name: "Credits Used Today"
type: stat
metric: increase(clay_credits_used_total[24h])
- name: "Email Hit Rate"
type: gauge
metric: clay_enrichment_hit_rate{field="email"}
thresholds: [40 , 60 , 80 ]
row_2:
- name: "Credit Burn Rate (hourly)"
type: timeseries
metric: rate(clay_credits_used_total[1h])
- name: "ICP Score Distribution"
type: histogram
metric: clay_icp_score
row_3:
- name: "Lead Tier Breakdown"
type: piechart
metric: clay_enrichments_total by (tier)
- name: "Cost per Enriched Lead"
type: stat
metric: clay_credits_used_total / clay_enrichments_total{status="enriched"}
Step 5: Daily Summary Report
function generateDailyReport (collector : ClayMetricsCollector ): void {
console .log (collector.getReport ());
if (process.env .SLACK_WEBHOOK_URL ) {
fetch (process.env .SLACK_WEBHOOK_URL , {
method : 'POST' ,
headers : { 'Content-Type' : 'application/json' },
body : JSON .stringify ({
text : `*Daily Clay Enrichment Report*\n\`\`\`\n${collector.getReport()} \n\`\`\`` ,
}),
}).catch (console .error );
}
}
Error Handling Issue Cause Solution Credits depleting fast High waterfall depth or uncapped tables Add credit burn alert, reduce waterfall Hit rate near 0% Invalid input data (personal domains, typos) Add data quality monitoring, pre-filter Missing metrics Webhook handler not instrumented Add metrics collection to callback handler Dashboard shows stale data Metrics not being pushed Verify Prometheus scrape config
Resources
Next Steps For incident response, see clay-incident-runbook.