Ein Claude Skill (lead-enrichment), der eine Clay-Tabellenzeile mit dem Schlüsselfeld domain verarbeitet und drei abgeleitete Felder in einem einzigen strukturierten Durchlauf zurückgibt: eine 2-Satz-Unternehmenszusammenfassung, einen ICP-Fit-Score von 1–10 mit einer einzeiligen Begründung und einen Cold-Email-Opener mit weniger als 50 Wörtern, der ein konkretes Signal aus dem öffentlichen Auftritt des Unternehmens zitiert. Der Opener ist stets ein Entwurf zur Prüfung durch den Vertriebsmitarbeiter — der Skill lehnt es ab, in einen Auto-Send-Schritt eingebunden zu werden.
Das Artefakt-Bundle wird unter apps/web/public/artifacts/lead-enrichment-clay-claude/ bereitgestellt und enthält den Skill-Body (SKILL.md) sowie drei Referenzvorlagen, die der Operator einmalig ausfüllt und die der Skill bei jedem Durchlauf lädt.
Wann verwenden
Sie haben eine Clay-Tabelle (oder eine als CSV exportierbare Lead-Liste) mit mindestens einer befüllten domain-Spalte und möchten angereicherte Datensätze in HubSpot, Salesforce, Attio oder einen Sequencer übertragen.
Das Volumen liegt im Bereich von Hunderten bis Zehntausenden pro Batch. Darunter ist das manuelle Verfassen von Openern schneller. Darüber sorgt die Kostendisziplin dieses Skills (ICP-gesteuertes Opener-Generation, Single-Call-Extraktion, Host-bezogene Fetch-Limits) dafür, dass der Preis pro Zeile vertretbar bleibt.
Vertriebsmitarbeiter sind bereit, den Entwurfs-Opener vor dem Versand zu lesen. Das gesamte Design geht von einem menschlichen Auge zwischen Entwurf und Versand aus — ohne diese Prüfung funktioniert das System schlecht.
Sie wünschen einen einzigen Skill, den das Team sowohl aus Clay-KI-Spalten als auch aus einer Claude Code-Session aufrufen kann, die die Anthropic Batch API über eine exportierte Liste nutzt — der Skill-Body ist auf beiden Oberflächen identisch.
Wann NICHT verwenden
Auto-Send-Sequencer. Wenn geplant ist, opener_draft direkt in den ersten Sequenzschritt einzubinden, stoppen Sie hier. Das Feld opener_confidence existiert aus gutem Grund: Etwa jeder fünfte Entwurf muss überarbeitet werden. Das automatische Versenden ist genau der Fehlerfall, gegen den der Skill konzipiert ist.
Listen ohne dokumentierte Rechtsgrundlage zur Verarbeitung. Gescrapte EU- oder UK-Kontakte ohne vorherige Einwilligung, Quebec-Leads unter Law 25, California Consumer Data ohne CCPA-Pfad — der Skill reichert alles an, worauf Sie ihn richten, und genau deshalb muss der Operator vorab prüfen. Die MDX-Seite liefert in SKILL.md einen „Do NOT invoke”-Block für diesen Zweck; kommentieren Sie ihn nicht aus.
Account-Level-Discovery-Briefings. Verwenden Sie stattdessen den account-research-Skill. Dieser führt tiefes Persona-Mapping und Schmerzpunkt-Hypothesen durch; dieser Skill optimiert für Batch-Volumen und Kosten pro Zeile.
Entscheidungen, die lizenzierte Finanzdaten erfordern (S&P, Pitchbook). Dieser Skill liest nur öffentliche Web-Inhalte und erfindet keine Umsatzzahlen aus Homepage-Texten.
Listen mit minderwertigen Quelldaten. Schlechte Domains rein, schlechte Entwürfe raus. Führen Sie Clay’s Domain-Validierungsspalte vorgelagert aus; geparkte Domains und 404-Fehler werden vom Skill übersprungen, aber Sie zahlen dennoch Credits dafür.
Setup
Fügen Sie den Skill in Ihre Umgebung ein. Für Claude.ai importieren Sie SKILL.md aus apps/web/public/artifacts/lead-enrichment-clay-claude/SKILL.md und laden Sie die drei Dateien aus references/ hoch. Für Claude Code kopieren Sie das Verzeichnis nach ~/.claude/skills/lead-enrichment/.
Ersetzen Sie jeden {...}-Platzhalter in references/1-icp-rubric.md durch das tatsächliche ICP Ihres Teams. Der Skill erkennt nicht ersetzte Platzhalter und lehnt es ab, gegen eine Vorlage zu bewerten — score: null, reason: "rubric not configured" statt zu raten. Das ist beabsichtigt; eine falsche Rubrik ist schlimmer als keine.
Bearbeiten Sie references/2-opener-style-guide.md mit der Stimme und den verbotenen Phrasen Ihres Teams. Die Standardeinstellungen verbieten offensichtliche LLM-Hinweise (“I noticed”, “love what you’re doing”, jede Superlativform); fügen Sie unternehmensspezifische Verbote hinzu, sobald Ihre Vertriebsmitarbeiter diese melden.
Bearbeiten Sie references/3-source-quality-matrix.md, um die Präferenzreihenfolge zwischen den Anreicherungsanbietern zu definieren, die in Ihrer Clay-Tabelle vorgelagert eingebunden sind. Ohne eine deklarierte Reihenfolge wechselt der Snapshot-Schritt zwischen Apollo und Clearbit und ICP-Scores driften.
Erstellen Sie in Clay drei KI-Spalten, die auf den Skill verweisen: summary, icp_fit_score, opener_draft. Ordnen Sie die Eingaben gemäß dem Abschnitt „Inputs” in SKILL.md zu. Richten Sie den Ziel-Push auf HubSpot (oder Ihr CRM) ein und leiten Sie opener_draft in eine Sequenzvariable bei einem Schritt, der manuelle Genehmigung erfordert — kein Auto-Send.
Führen Sie den Skill auf einer 20-Zeilen-Stichprobe aus. Stichprobenprüfung: Lassen sich die Snapshot-Fakten auf echten Homepage-Text zurückverfolgen, liegen die ICP-Scores in einer sinnvollen Verteilung, bestehen die Opener die Style-Guide-Prüfung? Passen Sie Rubrik und Style Guide an, bevor Sie skalieren. Die ersten 100 Zeilen sind Kalibrationsdaten; behandeln Sie sie entsprechend.
Was der Skill tatsächlich tut
Pro Zeile vier Teilaufgaben der Reihe nach:
Auflösen und Abrufen.https://{domain} mit 10-Sekunden-Timeout und einem Redirect-Hop, dann bestmögliches Abrufen von /about, /company, /customers. Geparkte / 404 / leere Domains liefern status: unreachable und überspringen den Rest. Pro-Host-Concurrent-Cap ist 2, mit einem Mindestverzug von 250 ms und einem einzelnen Backoff-Retry bei 429.
Strukturierten Snapshot extrahieren in einem Claude-Call: Industry, size_signal, value_prop, optionales recent_signal mit URL. Ein einziger Call statt drei, weil die Round-Trip-Anzahl der dominante Kosten-pro-Zeile-Treiber im großen Maßstab ist und der Extraktionsprompt in einem Durchlauf zuverlässig bleibt.
Scoring gegen die ICP-Rubrik. Lädt references/1-icp-rubric.md, gibt 1–10 mit einer einzeiligen Begründung zurück, die die Rubrik-Dimension nennt, die den Score bestimmt hat.
Opener generieren — nur wenn der Score den Schwellenwert überschreitet (Standard 6/10). Harte Regeln im Prompt: 50-Wörter-Limit, referenziert genau eine Tatsache aus dem Snapshot, keine Superlative, keine erfundenen Unternehmensbehauptungen, kein falscher Schmerzfragen-Abschluss. Gibt opener_confidence 0,0–1,0 zurück; unter 0,5 wird zur Überarbeitung markiert.
Die Ausgabe einer Zeile ist ein JSON-Block eingebettet in Markdown — Clays KI-Spalte parst ihn, und ein Mensch, der das Laufprotokoll liest, kann ihn überscannen. Vollständiges Schema und ein ausgearbeitetes Beispiel befinden sich im Abschnitt „Output format” in apps/web/public/artifacts/lead-enrichment-clay-claude/SKILL.md.
Kostenrealität
Es gibt zwei Kostenpositionen: Anthropic-Token und Clay-Credits.
Anthropic-Token zu Sonnet-Preisen (Input $3/MTok, Output $15/MTok zum Zeitpunkt der Erstellung):
Schritt 4 (Opener, nur wenn Score >= Schwellenwert): ~1,2K Input + ~120 Output. Ungefähr $0,005/Zeile.
Eine Zeile, die den Schwellenwert überschreitet, kostet also etwa $0,023; eine Zeile, die ihn nicht überschreitet, etwa $0,018. Verwenden Sie die Anthropic Batch API für ~50% Rabatt bei nicht dringenden Workloads (nächtliche Anreicherung eingehender MQLs ist der Lehrbuchfall) — das senkt die Zeilen in den Bereich $0,01–0,012.
Im großen Maßstab: Ein wöchentlicher Batch von 100.000 Zeilen mit ~40% Schwellenwert-Clearern kostet vor dem Batch-Rabatt ~$1.500–2.000/Monat bei Anthropic, ~$800–1.000 danach.
Clay-Credits hängen davon ab, welche Anbieter-Spalten vorgelagert eingebunden sind. Apollo kostet etwa 1 Credit pro aufgelöster Domain; Clearbit Reveal 2–3; ZoomInfo (bezahlter Passthrough) mehr. Drei Anbieter gestapelt und eine einzelne Zeile kann 8–12 Clay-Credits kosten, bevor der Skill selbst läuft. Der Starter-Plan liefert 5K Credits/Monat; der Pro-Plan 25K. Ein 100K-Zeilen-Batch unter diesem Anbieter-Stack benötigt den Enterprise-Tier oder eine engere Matrix in references/3-source-quality-matrix.md. Die Matrix dient genau dazu, den am niedrigsten bewerteten Anbieter zu entfernen, wenn das Pro-Zeilen-Kostenlimit ausgelöst wird.
Wenn die Mathematik rau erscheint, ist der ICP-Schwellenwert der Hebel. Eine Erhöhung von 6 auf 7 unterdrückt typischerweise die Opener-Generierung bei 25–35% mehr Zeilen; eine Erhöhung auf 8 eliminiert weitere 20%. Der Skill protokolliert am Ende jedes Batches die Score-Verteilung, damit der Operator empirisch statt nach Bauchgefühl abstimmen kann.
Erfolgsmetrik
Antwortrate auf die vom Vertriebsmitarbeiter geprüften Opener, segmentiert nach opener_confidence-Bucket. Der Zweck des Skills ist nicht „mehr Opener pro Stunde” — sondern „Opener, die gut genug sind, dass Vertriebsmitarbeiter aufhören, sie von Grund auf neu zu schreiben”. Zwei Teilmetriken, die es sich lohnt zu instrumentieren:
Überarbeitungsrate — welcher Anteil der opener_draft-Werte wird vom Vertriebsmitarbeiter unverändert gesendet vs. materiell überarbeitet. Ziel: unter 35% bei Confidence-0,7+-Zeilen nach der ersten 500-Zeilen-Kalibrierung. Höher bedeutet, dass der Style Guide falsch ist, die Rubrik falsch ist oder der Snapshot-Schritt halluziniert.
Antwortrate nach Confidence-Bucket. Die Antwortrate bei opener_confidence >= 0,7 sollte mindestens das 1,5-Fache der Antwortrate beim Sub-0,5-Bucket betragen. Wenn sie ähnlich sind, ist der Confidence-Score kein Signal — untersuchen Sie dies, bevor Sie ihm als Routing-Input vertrauen.
Vergleich mit Alternativen
vs. Apollo’s native Sequenz-Personalisierung. Apollo generiert Opener aus eigenen Anreicherungsdaten. Schneller aufzubauen, aber die Opener sind sichtbar vorlagenbasiert, auf Apollos ICP-Heuristik (nicht Ihrer) bewertet und haben keinen Audit-Trail, welche Tatsache den Entwurf bestimmt hat. Dieser Skill dauert länger beim Setup und kostet mehr pro Zeile, aber die Opener referenzieren datierte URLs, die Sie mit einem Klick verifizieren können, und die Rubrik ist eine Datei, die Sie kontrollieren.
vs. Clearbit + Outreach Smart Variables. Clearbit-basierte Smart Variables erzeugen faktisches Mail-Merge ("their industry is ${X}"), keine Opener — sie benötigen einen Menschen, der den eigentlichen Satz um die Variable herum schreibt. Günstiger als dieser Skill, wenn Ihre Vertriebsmitarbeiter die Sätze bereits schreiben; insgesamt teurer, wenn nicht, weil die Vertriebsmitarbeiterzeit die Token-Kosten dominiert.
vs. manuelles Opener-Schreiben. Ein erfahrener SDR schreibt einen hochwertigen Cold-Opener in 4–7 Minuten pro Account bei ~$60/Stunde Vollkosten — etwa $5 SDR-Zeit pro Opener. Der Skill kostet höchstens ~$0,025 pro Opener. Der Haken: Der SDR hat beim Schreiben auch etwas Account-Level-Denken betrieben. Der Skill tut das nicht. Die richtige Form für die meisten Teams ist der Skill für Top-of-Funnel-Volumen (alles unterhalb der Tier-1-Account-Liste) und vom Vertriebsmitarbeiter geschriebene Opener für die Named-Account-Liste.
vs. Status quo (keine Anreicherung, generische Opener). Antwortrate bei generischen Openern liegt irgendwo im Bereich 1–2%; leicht personalisierte Opener, die auf ein aktuelles Signal eingehen, liegen bei 4–8% in veröffentlichten Benchmarks. Der Skill zielt auf Letzteres ab. Lohnenswert nur, wenn das Team bereit ist, Rubrik und Style Guide aufzubauen; ohne diese sind die Skill-Ausgaben nicht wesentlich besser als der Status quo.
Fallstricke
Quellqualitätsdrift zwischen Anbietern. Wenn Apollo, Clearbit und ZoomInfo dieselbe Zeile anreichern und bei Mitarbeiterzahl oder Branche nicht übereinstimmen, wechselt der Snapshot-Schritt zwischen ihnen hin und her. Schutz: references/3-source-quality-matrix.md deklariert die Präferenzreihenfolge; der Snapshot zitiert pro Feld, welcher Anbieter (oder Homepage-Wert) verwendet wurde, sodass Drift im Zeilen-conflicts-Log prüfbar ist.
Opener erfindet Behauptungen, die nicht in den Daten stehen. Ohne strikte Prompting-Regeln fabrizieren Opener zuversichert klingende Fakten („Glückwunsch zur Series C” ohne Series C). Schutz: Der Opener-Prompt erhält den Snapshot inline mit einer expliziten Regel „Fakten, die nicht im Snapshot stehen, sind verboten”; recent_signal trägt eine URL zur One-Click-Verifizierung; Opener unter opener_confidence 0,5 werden zur Überarbeitung markiert, nie automatisch gesendet.
Kosteneskalation pro Zeile, wenn der ICP-Filter zu locker ist. Eine Rubrik, die die meisten Zeilen mit 7+ bewertet, überwindet die Schwellenwert-Sperre; die Opener-Generierung läuft für jede Zeile und die Pro-Zeilen-Kosten steigen um das 3–4-Fache. Schutz: Der Skill gibt am Ende jedes Batches eine score_distribution-Zusammenfassung aus; wenn mehr als 60% einer 1K-Zeilen-Stichprobe bei 7+ landen, gibt der Skill eine Warnung aus und empfiehlt, die Rubrik vor dem nächsten Batch zu verschärfen.
Veraltetes recent_signal. Ein vor 90 Tagen extrahiertes Signal wird zur Haftung — Vertriebsmitarbeiter, die im August „saw your March launch” schreiben, wirken eingeschlafen. Schutz: Jeder Datensatz trägt enriched_at; die Clay-Spalte ist so konfiguriert, dass sie erneut ausgeführt wird, wenn sie älter als 30 Tage ist; der Opener-Schritt weigert sich, ein recent_signal zu verwenden, dessen URL-Datum mehr als 60 Tage hinter enriched_at liegt.
Einwilligung und Rechtsgrundlage. Der Skill reichert alles an, worauf Sie ihn richten. Der „Do NOT invoke”-Block in SKILL.md erinnert den Operator daran, die Rechtsgrundlage der Quellliste vor der Ausführung zu prüfen. Löschen Sie ihn nicht.
Stack
Clay — Tabellen-Substrat, vorgelagerter Anreicherungsanbieter-Stack, Ziel-CRM-Push. Der Starter-Plan unterstützt das KI-Spalten-Primitiv, in das der Skill eingebunden wird; Pro ist für das Credit-Volumen jedes ernsthaften Batches erforderlich.
Claude (standardmäßig Sonnet) — die Inferenzschicht für Snapshot-Extraktion, ICP-Scoring und Opener-Generierung. Über Clays native KI-Spalte oder über die Anthropic Batch API aus einer Claude Code-Session für nicht dringende Batches zum halben Preis ausführen.
HubSpot, Salesforce oder Attio — Ziel-CRM. summary → Custom Property, icp_fit_score → Custom Property + View-Filter, opener_draft → First-Touch-Sequenzvariable bei einem manuellen Genehmigungsschritt zuordnen.
---
name: lead-enrichment
description: Enrich a Clay table row with company summary, ICP fit score, and a personalized cold-email opener. Use this skill from Clay AI columns or from a Claude Code session driving the Anthropic Batch API over an exported lead list. Returns structured fields plus a draft opener for rep review — never auto-sends.
---
# Lead enrichment
## When to invoke
Whenever a Clay table or exported CSV of leads needs three derived fields in one pass: a 2-sentence company summary, an ICP fit score with one-line reasoning, and a sub-50-word cold-email opener that cites a real signal from the company's public footprint. Take a domain (and optionally a LinkedIn URL or a free-text ICP rubric) as input and produce a structured JSON-shaped Markdown record per row.
Do NOT invoke this skill for:
- Auto-sending email. The opener is a draft for rep review. Wiring the output directly into a sequence-send step bypasses the guardrail this skill exists to enforce.
- Enriching leads that have not consented to processing. If the source list was scraped from a region with prior-consent rules (EU/UK GDPR, Quebec Law 25, etc.) without a documented lawful basis, stop and surface the concern to the operator. This skill will not silently process unconsented data.
- Account-level research briefs for discovery calls — use the `account-research` skill instead. This one optimizes for batch volume and cost-per-row, not depth.
- Public-company financial scoring or any decision that needs licensed data (S&P, Pitchbook). This skill reads public web only.
## Inputs
- Required: `domain` — the company's primary domain (e.g. `acme.com`). Must resolve and serve HTML; parked or dead domains are returned with `status: unreachable` and skipped.
- Required at config time: a Clay table reference (table ID + column map) OR a CSV path if running outside Clay. The skill assumes the table has at least `domain`; `first_name`, `title`, and `linkedin_url` improve opener quality if present.
- Required at config time: `references/icp-rubric.md` populated with your real rubric. Without it, `icp_fit_score` is omitted (not guessed).
- Optional: `references/opener-style-guide.md` — your team's voice, banned phrases, max length override.
- Optional: `references/source-quality-matrix.md` — vendor preference order when multiple enrichment columns upstream of this skill disagree.
- Optional: `recent_news` — pre-fetched by an upstream Clay column. When present, the opener step uses it instead of re-fetching.
## Reference files
Always read the following from `references/` before generating any row. They encode the operator's positioning and quality bar — without them output is generic.
- `references/icp-rubric.md` — the rubric the score uses. Replace template content with your actual ICP definition before first run.
- `references/opener-style-guide.md` — voice, length cap, banned phrases (e.g. "I noticed", "love what you're doing", any superlative).
- `references/source-quality-matrix.md` — preference order for resolving conflicts between upstream enrichment vendors (Apollo vs. Clearbit vs. ZoomInfo vs. Clay's native People/Company API).
## Method
Run these four sub-tasks in order per row. Steps 1-3 produce the structured fields; step 4 only runs when the ICP score clears the configured threshold.
### 1. Resolve and fetch
Hit `https://{domain}` with a 10-second timeout and one redirect hop. On non-2xx, parked-domain heuristics, or empty body, mark `status: unreachable` and skip steps 2-4. Do not retry indefinitely — parked domains are a meaningful share of any scraped list and the skill should fail fast on them rather than burn API spend.
If the homepage resolves, additionally fetch `/about`, `/company`, and `/customers` (best-effort, ignore 404s). Concatenate cleaned text up to ~8K tokens; truncate from the end of the longest section, not the front, to preserve the homepage hero copy.
### 2. Extract structured snapshot
In one Claude call, extract:
- `industry` — single noun phrase, derived from copy not guessed
- `size_signal` — one of `solo | smb | mid | ent`, justified by a cited copy fragment (employee count claim, customer-logo density, funding mention) or `unknown`
- `value_prop` — one sentence in the company's own framing
- `recent_signal` — at most one verifiable fact (a launch, hire, funding round, customer win) with a URL anchor. If none found in the fetched pages, return `null` rather than inventing one.
Engineering choice: extraction is a single structured Claude call, not three. Each additional round-trip multiplies cost-per-row at 100K-row scale; the extraction prompt is small enough to stay reliable in one pass.
### 3. Score against ICP rubric
Load `references/icp-rubric.md`. Score the snapshot 1-10 with a one-line justification that names which rubric dimension drove the score. If the rubric file still contains template placeholders (`{...}` literals), return `score: null` and `reason: "rubric not configured"` rather than scoring against nothing.
Engineering choice: ICP scoring runs before opener generation, not after. Rationale: opener generation is the most expensive step (longer output, more careful prompt). Skipping it for sub-threshold rows is where the cost savings live. A common misconfiguration is to generate openers for every row "in case the rep wants to override" — that defeats the filter.
### 4. Generate opener (only if score >= threshold)
Default threshold: 6/10. Configurable per run.
Inputs to the opener step: `value_prop`, `recent_signal` (if non-null), the lead's `first_name` and `title` if present, and the style guide.
Hard rules baked into the opener prompt:
- Max 50 words.
- Must reference exactly one specific thing from `recent_signal` or `value_prop`. If both are null, return `opener: null` rather than writing flattery.
- No superlatives ("amazing", "incredible", "love").
- No invented company claims. The opener may only reference facts present in the snapshot. The prompt includes the snapshot inline and explicitly forbids facts not in it.
- No question close that pretends to know an internal pain ("how are you handling X?" without evidence X is happening).
The opener is always returned as a draft with a `confidence` field (0-1) reflecting how strong the cited signal was. Reps see the confidence; low-confidence openers are surfaced for rewrite, not auto-sent.
## Output format
One record per row, emitted as a fenced JSON block inside Markdown so Clay's AI column can parse it and a human reading the log can scan it.
```markdown
### acme.com
```json
{ "domain": "acme.com", "status": "ok", "industry": "Workforce management software", "size_signal": "mid", "size_signal_evidence": "About page cites '350+ employees across 4 offices'", "value_prop": "Schedules and pays hourly workforces for restaurants and retail.", "recent_signal": { "summary": "Launched a payroll module in March 2026.", "url": "https://acme.com/blog/payroll-launch" }, "icp_fit_score": 8, "icp_fit_reason": "Mid-market, hourly-workforce vertical — direct match on rubric line 2.", "opener_draft": "Saw the March payroll launch — folding pay into the same surface as scheduling is the move most ops leaders ask us about. Worth a 20-min on whether the multi-state tax piece is hitting the same wall others have?", "opener_confidence": 0.78, "sources": [ "https://acme.com/", "https://acme.com/about", "https://acme.com/blog/payroll-launch" ] }
```
```
For unreachable rows the record collapses to `{ "domain": "...", "status": "unreachable" }` with no other fields — no placeholder strings.
## Watch-outs
- **Source-quality drift across vendors.** When a Clay table has both Apollo and Clearbit enrichment columns upstream and they disagree on headcount or industry, this skill's snapshot can flip-flop run to run. Guard: `references/source-quality-matrix.md` declares a preference order; the snapshot step cites which vendor (or homepage-derived value) it used per field, so drift is auditable.
- **Opener inventing claims that aren't in the data.** Without strict prompting, openers drift toward confident-sounding fabrications ("congrats on your Series C" when there was no Series C). Guard: the opener prompt receives the snapshot inline and has an explicit "facts not in the snapshot are forbidden" rule; `recent_signal` carries a URL so a reviewer can verify in one click; openers with `opener_confidence` under 0.5 are flagged for rewrite, not sent.
- **Cost-per-row escalation if the ICP filter is loose.** A rubric that scores most rows 7+ defeats the threshold gate; opener generation runs on every row and per-row cost rises 3-4x. Guard: the skill logs a `score_distribution` summary at the end of each batch (`{ "1-3": N, "4-6": N, "7-10": N }`); if more than 60% of rows land 7+ across a 1K-row sample, the skill prints a warning to tighten the rubric before the next batch.
- **Rate limits on homepage fetches.** Hitting one root domain per row is fine; hitting `/about` and `/customers` triples the request count and some hosts throttle. Guard: per-host concurrency capped at 2, per-host minimum delay 250ms, and 429s are honored with a single back-off retry before the row is marked `status: unreachable`.
- **Stale enrichment.** A row enriched 90 days ago is not the same signal as one enriched today; reps treating old `recent_signal` values as fresh write embarrassing openers. Guard: every record carries an `enriched_at` timestamp, and the Clay column is configured to re-run when `enriched_at` is older than 30 days.
# ICP rubric — TEMPLATE
> Replace every `{...}` placeholder with your team's real values before
> the first run. The lead-enrichment skill checks for unsubstituted
> placeholders and refuses to score against a template — it returns
> `score: null, reason: "rubric not configured"` instead of guessing.
## Firmographics
| Dimension | In-ICP | Stretch | Out |
|---|---|---|---|
| Industry | {list, e.g. "B2B SaaS, fintech, vertical SaaS"} | {adjacent industries} | {hard out, e.g. "consumer, agencies, edu"} |
| Headcount | {range, e.g. "200-2000"} | {range, e.g. "100-200, 2000-5000"} | {below/above, e.g. "<100, >5000"} |
| Revenue | {range, e.g. "$25M-$500M ARR"} | {range} | {below/above} |
| Geo | {regions, e.g. "US, Canada, UK"} | {regions, e.g. "EU, ANZ"} | {regions, e.g. "China, Russia, sanctioned"} |
| Funding stage | {stages, e.g. "Series B-D, public"} | {stages} | {stages, e.g. "pre-seed, bootstrapped <$5M"} |
## Technographics
Tools whose presence on the prospect's stack signals fit (we win when they have these because the integration story is short or the pain is acute):
- {Tool 1 — e.g. "Salesforce + Outreach"}
- {Tool 2 — e.g. "dbt + Snowflake"}
- {Tool 3 — e.g. "Segment"}
Tools whose presence signals misfit (we lose to them, or their presence implies a build-not-buy culture):
- {Tool A — e.g. "Hightouch (we lose to)"}
- {Tool B — e.g. "in-house reverse-ETL (build-not-buy)"}
## Pain ranking
When the skill produces an ICP score, it weights against this priority order. Higher = more important to surface first.
1. {Pain category — e.g. "outbound data quality blocking pipeline"} — weight 5
2. {Pain category — e.g. "rep ramp time eating quota"} — weight 4
3. {Pain category — e.g. "RevOps reporting backlog"} — weight 3
4. {Pain category — e.g. "tooling sprawl / consolidation push"} — weight 2
5. {Pain category — e.g. "compliance / data-residency"} — weight 1
## Score interpretation
The skill returns `1-10`. Suggested interpretation (override per team):
- **9-10** — direct ICP, multiple positive signals, no disqualifiers. Send.
- **7-8** — strong fit on firmographics, signal is plausible. Send after rep glance.
- **5-6** — adjacent. Default threshold cuts here. Opener may not generate.
- **3-4** — stretch fit, weak signal. Skip unless rep has specific reason.
- **1-2** — out of ICP. Suppress.
## Disqualifiers
Single signals that drop a row out regardless of other fit. The skill flags these with `disqualifier: "..."` in the output and forces score to 1.
- {Disqualifier 1 — e.g. "uses {Competitor} as system of record"}
- {Disqualifier 2 — e.g. "regulated industry without our SOC 2 + HIPAA"}
- {Disqualifier 3 — e.g. "headcount under 50 — wrong motion"}
## Last edited
{YYYY-MM-DD} — bump on every material change. The skill prepends a "rubric may be stale" note when this date is more than 90 days old.
# Opener style guide — TEMPLATE
> Replace the placeholders with your team's actual voice rules. The
> lead-enrichment skill loads this file on every opener generation.
> Treat it as the single source of truth — do not duplicate rules into
> the prompt itself, where they will drift.
## Voice
One sentence on register: {e.g. "direct, plain, no jargon, no exclamation marks, no questions in the close unless the question is specific"}.
One sentence on stance: {e.g. "we're peers solving the same problem, not vendors selling at"}.
## Length
- Hard cap: 50 words. The skill enforces this and truncates with an ellipsis warning if the model overshoots.
- Soft target: 30-40 words. Three sentences max.
- No greeting line ("Hi {name},"). The sequence step adds the greeting; baking one into the opener double-greets.
## What every opener must contain
1. A specific reference to one thing from the snapshot — preferably `recent_signal`. If there is no recent signal, the opener references the `value_prop` and labels itself low-confidence.
2. A reason the reference matters to the operator's persona. Not "I noticed X" — "X is the move ops leaders ask us about".
3. A single, specific close. Either a 20-min ask or a question that would be answerable only by someone inside the company.
## Banned phrases
The prompt rejects any opener containing these. Add team-specific additions over time.
- "I hope this email finds you well"
- "I noticed"
- "I came across your"
- "love what you're doing"
- "quick question"
- "circling back" (in a first touch)
- Any superlative — "amazing", "incredible", "best-in-class", "leading"
- Any em-dash trio that reads as an LLM tic — "X — Y — Z"
- Compliments on growth/funding without a cited source
## Banned structures
- The "I was just on your website" opener. Always reads false.
- The "we work with companies like {logo}" name-drop in sentence one.
- The "are you the right person?" close. Wastes the reply.
## Confidence signal
The skill returns `opener_confidence: 0.0-1.0`:
- **0.8+** — opener references a dated `recent_signal` with a URL and the rep's persona is in `references/1-icp-rubric.md` buying committee.
- **0.5-0.8** — opener references `value_prop` only, or `recent_signal` is older than 60 days.
- **<0.5** — opener is generic; rep should rewrite or skip the row.
Threshold for auto-queueing into a sequence: configure per-team. Default recommendation: **never auto-queue**. The opener is a draft.
## Worked example
Snapshot: industry "scheduling for restaurants", recent_signal "March payroll launch", value_prop "schedules and pays hourly workforces".
Opener (35 words, confidence 0.78):
> Saw the March payroll launch — folding pay into the same surface as
> scheduling is the move most ops leaders ask us about. Worth a 20-min
> on whether the multi-state tax piece is hitting the same wall others
> have?
Why it scores 0.78 not 1.0: the close assumes a pain ("multi-state tax piece is hitting the same wall") that the snapshot does not directly evidence. A 1.0 opener would tie the close to a fact in the snapshot.
## Last edited
{YYYY-MM-DD}
# Source quality matrix — TEMPLATE
> Replace placeholders with the vendors actually wired into your Clay
> table. The lead-enrichment skill consults this matrix when two
> upstream sources disagree on the same field, and cites which source
> won in the per-row output for audit.
## Why this exists
Clay tables routinely stack 2-3 enrichment vendors per field — Apollo on industry, Clearbit on headcount, ZoomInfo on funding. They disagree often: Apollo will say a 200-person company is 50, Clearbit will assign the wrong industry, ZoomInfo will lag a recent acquisition by a quarter.
Without a declared preference order, the skill's snapshot step flip-flops between vendors run to run, ICP scores oscillate, and operators cannot reproduce the same row twice.
## Field-by-field preference order
Per field, list vendors top-to-bottom in trust order. The skill takes the highest-ranked vendor that returned a non-empty value. The homepage-derived value (extracted by the skill itself in step 1) is always the tiebreaker if all vendors disagree with each other.
### Industry / sector
1. {e.g. "Homepage About-page extraction (skill step 1)"}
2. {e.g. "Clearbit Reveal"}
3. {e.g. "Apollo Company"}
4. {e.g. "ZoomInfo Industry"}
### Headcount
1. {e.g. "LinkedIn employee count via Clay's Linked-In Profile column"}
2. {e.g. "Apollo employee_count"}
3. {e.g. "Clearbit metrics.employees"}
4. Skill homepage extraction (last resort — copy claims often inflated)
### Revenue / ARR
1. {e.g. "ZoomInfo revenue (paid only)"}
2. {e.g. "Clearbit metrics.annualRevenue (estimated, low confidence)"}
3. Omit (do not extract from homepage; vanity metrics are not revenue)
### Funding stage / last round
1. {e.g. "Crunchbase via Clay's native column"}
2. {e.g. "Press-release fetch in skill step 1, only if dated within 90d"}
3. Omit
### Recent signal (launches, hires, news)
1. Skill homepage / blog fetch in step 1 — must carry a dated URL
2. {e.g. "Clay's Built-With column for tech-stack changes"}
3. {e.g. "Google News column, capped to last 60 days"}
Important: a vendor returning "we don't know" is treated as missing, not as a contradicting value. The next vendor in the list is consulted.
## Conflict logging
When two vendors return different values for the same field, the skill adds a `conflicts` block to the per-row output:
```json
"conflicts": [
{ "field": "headcount", "values": { "linkedin": 380, "apollo": 120 }, "chose": "linkedin" }
]
```
Operators should sample 10-20 conflict rows weekly. If one vendor is consistently wrong, demote it in this matrix. The matrix is the control surface, not the prompt.
## Vendor cost ceiling
Each vendor has a per-row cost (Clay credits or external API spend). Set a soft cap here — if a row's combined enrichment cost exceeds the cap, skip the lowest-ranked vendor and accept lower confidence.
- Soft cap per row: {e.g. "12 Clay credits"}
- Hard cap per row: {e.g. "20 Clay credits — abort row"}
The skill respects these caps and emits `cost_ceiling_hit: true` when the hard cap fires, so the batch summary surfaces the count.
## Last edited
{YYYY-MM-DD}