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".
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill clay-observability명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... 이 저장소의 다른 Skills 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".
jeremylongshore
jeremylongshore/tons-of-skills-marketplace
GitHub 저장소 열기 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.