ooligo
claude-skill

Enrich Clay leads with Claude: sample, scoring, and review

Run the free offline example

20 fictional companies. Python 3.9 or later. No account, API key or network connection needed.

  1. Download and unzip the bundle.

    Download the example ZIP
  2. Open a terminal in the folder containing pipeline.py, then run:

    python3 pipeline.py demo
  3. Check the result.

    Expect PASS and 20 rows, including examples that need review or fail the evidence checks. PASS means the saved examples match their expected output.

Open the bundle README →
After running the local demo, how did it go?

Synthetic example From company facts to a review decision
Supplied facts
ledgerleaf.example
Industry
B2B SaaS
Employees
120
Region
US
Sample result
Ready for review
Sample ICP score 10/10

Example rubric: industry 4 + company size 3 + region 3. Threshold: 7/10.

See the supplied source text (English)
Industry: B2B SaaS. We have 120 employees. Region: US. We build scheduling software for restaurant teams.
What happens when evidence fails?
company-10.example
Needs reviewNo score

The candidate extraction omits headcount. The row stays unscored.

company-18.example
Evidence rejectedNo score

The headcount quote adds text absent from the source. The row stays unscored.

Fictional data, fixed rules. Every row still needs review. This is not a live Clay or Claude result.

Difficulty
intermediate
Live setup estimate
30-60 min
For
revops · sdr-leader
RevOps

Tools for live adaptation

Use this downloadable Claude skill to turn supplied company evidence into an ICP score and a draft opener for review. Start with the included 20-row synthetic example, then adapt the same evidence checks to your Clay table. The bundle includes a local validator, scoring rules, prompts, and expected output.

Download the complete bundle or read the setup guide. The sample runs with Python and makes no network requests. It needs no Clay account, API key, or paid model call.

Test status: the offline example checks supplied fixtures and deterministic scoring. It does not demonstrate a live Claude run, a working Clay integration, factual accuracy on real companies, or improved reply rates. The workflow remains marked human_tested: false.

When to use it

Pick this workflow when you already have company evidence and need a consistent, inspectable rule for deciding which rows deserve rep attention. A RevOps operator owns the rubric; a rep reviews each proposed opener before anything reaches a sequencer. Keep source text alongside extracted facts so someone can challenge a score without reconstructing the research.

Skip it if you need a contact database, verified email addresses, automatic web research, or an unattended CRM sync. None of those is implemented here. For a handful of accounts, reading the sources and writing notes manually is less setup. For continuous enrichment, use your existing provider and evaluate its output against the same evidence rules. The enrichment strategy guide covers that choice.

What you download

The bundle lives at apps/web/public/artifacts/lead-enrichment-clay-claude/. Its files have distinct jobs:

  • README.md explains setup and the test boundary; SKILL.md gives Claude Code the procedure.
  • references/1-icp-rubric.md, references/2-opener-style-guide.md, and references/3-source-quality-matrix.md hold the policies you adapt.
  • pipeline.py validates supplied extraction evidence and calculates scores. rubric.example.json contains the executable sample criteria.
  • prompts/extract.md, prompts/opener.md, and extraction.schema.json define the manual model handoff.
  • examples/leads.jsonl, examples/extractions.jsonl, and examples/expected-output.jsonl contain synthetic inputs, candidate extractions, and expected results.

Read the files before installing the skill. The reference documents are instructions; the Python validator enforces only the checks its code implements.

Run the example first

Unzip the download, open a terminal in the directory containing pipeline.py, and run:

python3 pipeline.py demo
python3 pipeline.py validate --leads examples/leads.jsonl --extractions examples/extractions.jsonl --rubric rubric.example.json --as-of 2026-11-01

The fixed date makes the example reproducible. For real data, use the actual evaluation date. The demo compares its results with examples/expected-output.jsonl; changing a fixture or rubric changes the expected result, so keep your own experiments separate.

Each lead supplies source documents with source_id, url, text, and checked_at. Each candidate extraction names row_id, industry, headcount, region, and value_prop, with evidence quotes attached to the fields. The validator checks those quotes against the supplied documents. It does not visit the URLs or independently confirm what a company does.

The example rubric awards 4 points for B2B SaaS, 3 for headcount from 50 to 500 inclusive, and 3 for US or CA. The threshold is 7. Fictional ledgerleaf.example, row demo-01, has B2B SaaS, 120 employees, and US, so it scores 10. These criteria illustrate arithmetic; they are not a recommendation for your ICP.

Missing firmographic evidence produces needs_review with a null score. Other results include ready_for_review, below_threshold, unreachable, and invalid_evidence. Every result retains review_required=true. The offline opener quotes supplied product text; it is a demonstration of routing, not a model-generated personalization benchmark.

Use the skill in Claude Code

Copy the extracted bundle into ~/.claude/skills/lead-enrichment/, with SKILL.md directly inside that directory. Invoke /lead-enrichment in a local Claude Code session. This installation follows Claude Code’s skill documentation.

Adapt both the written rubric and rubric.example.json before evaluating real leads. Give Claude the source documents and extraction prompt, save the candidate output, and run the validator before requesting an opener. The model proposes facts; the local checks decide whether the supplied evidence meets the configured rules. A passing quote check still needs human interpretation: a quoted employee count can describe a customer rather than the prospect.

Adapt it to Clay deliberately

Clay’s Use AI documentation describes prompts and structured outputs. Its content transformation and web research modes are separate. A local SKILL.md directory is not a Clay column import.

Create a small test table containing your row identifiers and supplied source text. Adapt prompts/extract.md to those columns and use extraction.schema.json for the output contract. Choose a Claude model available in your account, record its identifier, and keep automatic runs off during setup. Export candidate extractions in the documented JSONL shape and validate them locally.

Only rows that pass the checks and meet your threshold should proceed to prompts/opener.md. Keep the draft, source quote, and review decision together. Export to HubSpot or another CRM only after review; this download supplies neither a CRM connector nor a sending step. Budget an estimated 30-60 minutes for initial configuration, then measure your own review time. This setup estimate excludes building an unattended integration.

Cost arithmetic you can replace

The offline demo uses 0 paid API calls. Live work has separate bills: Clay usage, your model account if using your own key, upstream data, and reviewer time. Clay documents that personal API keys still consume Actions while model usage is billed by the provider. Check your account’s rates before running a table.

Use measured inputs:

model_cost = input_tokens / 1000000 * input_rate
           + output_tokens / 1000000 * output_rate
run_cost = model_cost + data_cost + platform_cost
review_hours = rows_reviewed * seconds_per_review / 3600

For an explicitly hypothetical all-in processing cost of $0.02 per row, 20 rows cost $0.40 and 100000 rows cost $2000 per run. Four weekly runs cost $8000, before any costs excluded from that assumption. This is arithmetic, not a quoted Clay or Anthropic price. Count failed attempts and reruns when calculating your actual cost per accepted row.

Failure checks and a useful acceptance test

  • Unsupported facts: retain the exact source quote; reject missing or mismatched evidence instead of inventing a score.
  • Stale evidence: check checked_at against the evaluation date. The sample’s 30-day limit is a configurable policy, not proof that a fact remains current.
  • Misleading quotes: review what each quote describes. Text matching does not establish truth or resolve conflicting providers.
  • Spend surprises: keep auto-run off, start with a fixed row limit, and inspect the bill before expanding.
  • Accidental outreach: retain review_required=true and keep sending outside this workflow.

For your first real 20-row pilot, record validation failures, incorrect facts found during review, accepted drafts, elapsed review time, and total spend. Success means you can explain each accepted score and opener from its evidence and show the actual cost. A synthetic demo cannot establish sales lift. Compare that effort with manually reviewing the same kind of accounts before expanding the run.

Files in this artifact

Download all (.zip)