Un Claude Skill (lead-enrichment) qui prend une ligne de table Clay clé sur domain et retourne trois champs dérivés en un seul pass structuré : un résumé de l’entreprise en 2 phrases, un score d’adéquation ICP de 1-10 avec une raison en une ligne, et un opener d’email froid de moins de 50 mots qui cite un signal spécifique de l’empreinte publique de l’entreprise. L’opener est toujours un draft pour révision du commercial — le skill refuse d’être câblé dans une étape d’envoi automatique.
Le bundle d’artifact est disponible dans apps/web/public/artifacts/lead-enrichment-clay-claude/ et contient le corps du skill (SKILL.md) plus trois modèles de référence que l’opérateur remplit une fois et que le skill charge à chaque exécution.
Quand l’utiliser
Vous avez une table Clay (ou un CSV de leads exportable vers Clay) avec au moins une colonne domain remplie, et vous avez besoin de pousser des enregistrements enrichis dans HubSpot, Salesforce, Attio ou un séquenceur.
Le volume est dans les centaines à dizaines de milliers par batch. En dessous, écrire des openers manuellement est plus rapide. Au-dessus, la discipline de coût de ce skill (génération d’opener filtrée par ICP, extraction en un seul appel, plafonds de requêtes par hôte) est ce qui maintient un coût par ligne raisonnable.
Les commerciaux sont prêts à lire le draft de l’opener avant qu’il ne s’envoie. Toute la conception suppose un œil humain entre le draft et l’envoi, et se dégrade fortement sans cela.
Vous voulez un seul skill que l’équipe peut appeler depuis les colonnes IA Clay et depuis une session Claude Code exécutant l’API Batch Anthropic sur une liste exportée — le corps du skill est identique dans les deux surfaces.
Quand NE PAS l’utiliser
Séquenceurs à envoi automatique. Si le plan est « câblez opener_draft directement dans la première étape de séquence », arrêtez. L’opener porte un champ opener_confidence pour une raison : environ un draft sur cinq nécessite une réécriture. Les envoyer automatiquement est le mode d’échec contre lequel le skill est conçu.
Listes sans base légale documentée pour le traitement. Contacts UE ou UK scrapés sans consentement préalable, leads Québec sous la Loi 25, données consommateurs California sans voie CCPA — le skill enrichira tout ce que vous lui pointez, et c’est exactement pourquoi l’opérateur doit vérifier d’abord. La page MDX livre un bloc « Ne PAS invoquer » dans SKILL.md couvrant cela ; ne le commentez pas.
Briefs de découverte au niveau compte. Utilisez plutôt le skill account-research. Celui-là fait un mapping de persona approfondi et des hypothèses de douleur ; celui-ci optimise pour le volume de batch et le coût par ligne.
Décisions qui nécessitent des données financières sous licence (S&P, Pitchbook). Ce skill lit le web public uniquement et ne fabriquera pas de chiffres de revenus depuis le contenu de la page d’accueil.
Listes où les données sources sont de mauvaise qualité. Domaines pourris en entrée, drafts pourris en sortie. Lancez la colonne de validation de domaine de Clay en amont ; les domaines garés et les 404 sont sautés par le skill mais vous payez quand même des crédits pour le découvrir.
Configuration
Déposez le skill dans votre environnement. Pour Claude.ai, importez le SKILL.md depuis apps/web/public/artifacts/lead-enrichment-clay-claude/SKILL.md et uploadez les trois fichiers dans references/. Pour Claude Code, copiez le répertoire dans ~/.claude/skills/lead-enrichment/.
Remplacez chaque placeholder {...} dans references/1-icp-rubric.md par le vrai ICP de votre équipe. Le skill détecte les placeholders non remplacés et refuse de scorer contre un modèle — score: null, reason: "rubric not configured" au lieu de deviner. C’est intentionnel ; un mauvais rubric est pire qu’aucun rubric.
Modifiez references/2-opener-style-guide.md avec la voix de votre équipe et les phrases bannies. Les valeurs par défaut bannissent les tells LLM évidents (« j’ai remarqué », « j’adore ce que vous faites », tout superlatif) ; ajoutez des bans spécifiques à l’entreprise à mesure que vos commerciaux les signalent.
Modifiez references/3-source-quality-matrix.md pour déclarer l’ordre de préférence entre les fournisseurs d’enrichissement câblés dans votre table Clay en amont de ce skill. Sans ordre déclaré, l’étape de snapshot bascule entre Apollo et Clearbit d’une exécution à l’autre, et les scores ICP dérivent.
Dans Clay, créez trois colonnes IA référençant le skill : summary, icp_fit_score, opener_draft. Mappez les inputs selon la section « Inputs » de SKILL.md. Définissez la destination push vers HubSpot (ou votre CRM) et routez opener_draft dans une variable de séquence sur une étape qui nécessite une approbation manuelle, pas un envoi automatique.
Exécutez sur un échantillon de 20 lignes. Vérification spot : les faits du snapshot tracent-ils vers du vrai contenu de page d’accueil, les scores ICP atterrissent-ils dans une distribution sensée, les openers passent-ils le guide de style. Affinez le rubric et le guide de style avant de monter en charge. Les 100 premières lignes sont des données de calibration ; traitez-les comme telles.
Ce que le skill fait réellement
Par ligne, quatre sous-tâches dans l’ordre :
Résolution et récupération.https://{domain} avec un timeout de 10 secondes et un saut de redirection, puis au mieux /about, /company, /customers. Les domaines garés / 404 / corps vide retournent status: unreachable et sautent le reste. Le plafond de concurrence par hôte est 2, avec un délai minimum de 250ms et une seule tentative de back-off sur 429.
Extraction de snapshot structuré en un seul appel Claude : secteur, size_signal, value_prop, optionnel recent_signal avec URL. Un seul appel plutôt que trois car le nombre d’aller-retours est le driver de coût par ligne dominant à l’échelle et le prompt d’extraction reste fiable en un seul pass.
Score par rapport au rubric ICP. Charge references/1-icp-rubric.md, retourne 1-10 avec une raison d’une ligne qui nomme la dimension du rubric qui a conduit le score.
Génération d’opener — uniquement si le score dépasse le seuil (défaut 6/10). Règles strictes dans le prompt : plafond de 50 mots, référence exactement un fait du snapshot, pas de superlatifs, pas d’affirmations inventées sur l’entreprise, pas de question-close de fausse douleur. Retourne opener_confidence 0,0-1,0 ; en dessous de 0,5 est signalé pour réécriture.
L’output d’une ligne est un bloc JSON intégré dans du Markdown — la colonne IA de Clay le parse, et un humain lisant le journal d’exécution peut le scanner. Le schéma complet et un exemple travaillé se trouvent dans la section « Output format » de apps/web/public/artifacts/lead-enrichment-clay-claude/SKILL.md.
Réalité des coûts
Il y a deux lignes de coût : les tokens Anthropic et les crédits Clay.
Tokens Anthropic au tarif Sonnet (entrée 3 $/MTok, sortie 15 $/MTok à la date de rédaction) :
Étapes 1+2 (récupération + extraction) : ~3,5k tokens d’entrée (page d’accueil + about tronqués à ~8k char) + ~250 tokens de sortie. Environ 0,014 $/ligne.
Étape 4 (opener, uniquement si score >= seuil) : ~1,2k entrée + ~120 sortie. Environ 0,005 $/ligne.
Ainsi une ligne qui dépasse le seuil atterrit autour de 0,023 $ ; une ligne qui ne le dépasse pas autour de 0,018 $. Exécutez via l’API Batch Anthropic pour ~50 % de réduction quand la charge de travail n’est pas urgente (l’enrichissement nocturne des MQLs inbound est l’utilisation idéale) — ça fait descendre les lignes dans la plage 0,01-0,012 $.
À l’échelle : un batch hebdomadaire de 100k lignes avec ~40 % de franchissement du seuil représente ~1 500-2 000 $/mois chez Anthropic avant remise batch, ~800-1 000 $ après.
Crédits Clay dépendent des colonnes de fournisseurs câblées en amont. Apollo coûte environ 1 crédit par domaine résolu ; Clearbit Reveal 2-3 ; ZoomInfo (passthrough payant) davantage. Empilez trois fournisseurs et une seule ligne peut atteindre 8-12 crédits Clay avant que le skill lui-même ne s’exécute. Le plan Starter livre 5k crédits/mois ; le plan Pro 25k. Un batch de 100k lignes sous cette stack de fournisseurs nécessite le niveau Enterprise ou une matrice plus serrée dans references/3-source-quality-matrix.md. La matrice existe spécifiquement pour délester le fournisseur le moins bien classé quand le plafond de coût par ligne se déclenche.
Si les maths semblent approximatifs, le levier est le seuil ICP. Le passer de 6 à 7 supprime typiquement la génération d’opener sur 25-35 % de lignes supplémentaires ; le passer à 8 en élimine encore 20 %. Le skill journalise la distribution des scores à la fin de chaque batch pour que l’opérateur puisse affiner empiriquement plutôt que par intuition.
Métriques de succès
Taux de réponse sur les openers révisés par le commercial, segmentés par bucket opener_confidence. Le point du skill n’est pas « plus d’openers par heure » — c’est « des openers assez bons pour que les commerciaux arrêtent de les réécrire de zéro ». Deux sous-métriques à instrumenter :
Taux de réécriture — quelle fraction des valeurs opener_draft le commercial envoie inchangée vs réécrit substantiellement. Cible : sous 35 % sur les lignes confidence 0,7+ après les 500 premières lignes de calibration. Plus élevé signifie que le guide de style est faux, le rubric est faux, ou l’étape de snapshot hallucine.
Taux de réponse par bucket de confiance. Le taux de réponse sur opener_confidence >= 0,7 devrait être au moins 1,5x le taux de réponse sur le bucket sous 0,5. S’ils sont similaires, le score de confiance n’est pas un signal — examinez avant de l’utiliser comme input de routage.
Alternatives
vs la personnalisation native de séquence d’Apollo. Apollo générera des openers depuis ses propres données d’enrichissement. C’est plus rapide à déployer mais les openers sont visiblement basés sur des modèles, scorés sur l’heuristique ICP d’Apollo (pas la vôtre), et n’ont aucune piste d’audit sur quel fait a conduit le draft. Ce skill prend plus longtemps à configurer et coûte plus par ligne, mais les openers référencent des URLs datées que vous pouvez vérifier en un clic et le rubric est un fichier que vous contrôlez.
vs Clearbit + Outreach Smart Variables. Les Smart Variables alimentées par Clearbit produisent des publipostages factuels ("leur secteur est ${X}"), pas des openers — ils nécessitent qu’un humain écrive la phrase réelle autour de la variable. Moins cher que ce skill si vos commerciaux écrivent déjà les phrases ; plus cher globalement s’ils ne le font pas, car le temps commercial domine le coût en tokens.
vs rédaction manuelle d’opener. Un SDR senior écrit un opener froid de haute qualité en 4-7 minutes par compte à ~60 $/heure entièrement chargé — appelons ça 5 $ de temps commercial par opener. Le skill coûte au maximum ~0,025 $ par opener. L’inconvénient : le commercial a aussi fait de la réflexion au niveau compte pendant qu’il écrivait. Le skill ne le fait pas. La bonne forme pour la plupart des équipes est le skill sur le volume top-of-funnel (tout ce qui est sous la liste de comptes tier-1) et des openers rédigés par les commerciaux sur la liste de comptes nommés.
vs statu quo (pas d’enrichissement, openers génériques). Les taux de réponse sur les openers génériques se situent quelque part dans la plage 1-2 % ; les openers légèrement personnalisés liés à un signal récent atteignent 4-8 % dans les benchmarks publiés. Le skill cible ces derniers. Vaut la peine seulement si l’équipe est prête à mettre en place le rubric et le guide de style ; sans ceux-là, les outputs du skill ne sont pas matériellement meilleurs que le statu quo.
Points de vigilance
Dérive de qualité des sources entre fournisseurs. Quand Apollo, Clearbit et ZoomInfo enrichissent tous la même ligne et sont en désaccord sur l’effectif ou le secteur, l’étape de snapshot bascule entre eux d’une exécution à l’autre. Protection : references/3-source-quality-matrix.md déclare l’ordre de préférence ; le snapshot cite quel fournisseur (ou valeur de page d’accueil) il a utilisé par champ, pour que la dérive soit auditale dans le journal conflicts par ligne.
Opener inventant des affirmations qui ne sont pas dans les données. Sans prompt strict, les openers fabriquent des faits à consonance confiante (« félicitations pour la Série C » sans Série C). Protection : le prompt d’opener reçoit le snapshot en ligne avec une règle explicite « les faits absents du snapshot sont interdits » ; recent_signal porte une URL pour une vérification en un clic ; les openers sous opener_confidence 0,5 sont signalés pour réécriture, jamais auto-envoyés.
Escalade du coût par ligne quand le filtre ICP est lâche. Un rubric qui score la plupart des lignes 7+ défait la porte du seuil ; la génération d’opener s’exécute sur chaque ligne et le coût par ligne monte de 3-4x. Protection : le skill émet un résumé score_distribution par batch ; si plus de 60 % d’un échantillon de 1k lignes atterrit à 7+, le skill affiche un avertissement et recommande de resserrer le rubric avant le prochain batch.
recent_signal obsolète. Un signal extrait il y a 90 jours devient un passif — des commerciaux écrivant « j’ai vu votre lancement de mars » en août paraissent endormis au volant. Protection : chaque enregistrement porte enriched_at ; la colonne Clay est configurée pour se ré-exécuter si plus ancienne de 30 jours ; l’étape opener refuse d’utiliser un recent_signal dont la date URL est plus de 60 jours en retard sur enriched_at.
Consentement et base légale. Le skill enrichit tout ce que vous lui pointez. Le bloc « Ne PAS invoquer » dans SKILL.md existe pour rappeler à l’opérateur de vérifier la base légale de la liste source avant l’exécution. Ne le supprimez pas.
Stack
Clay — substrat de table, stack de fournisseurs d’enrichissement en amont, push CRM de destination. Le plan Starter supporte la primitive de colonne IA dans laquelle le skill se branche ; le Pro est requis pour le volume de crédits de tout batch sérieux.
Claude (Sonnet par défaut) — la couche d’inférence pour l’extraction de snapshot, le scoring ICP et la génération d’opener. Exécutez via la colonne IA native de Clay ou via l’API Batch Anthropic depuis une session Claude Code pour les batchs non urgents à moitié prix.
HubSpot, Salesforce ou Attio — CRM de destination. Mappez summary → propriété personnalisée, icp_fit_score → propriété personnalisée + filtre de vue, opener_draft → variable de séquence premier contact sur une étape d’approbation manuelle.
---
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}