Uma skill do Claude (lead-enrichment) que recebe uma linha de tabela do Clay com chave em domain e retorna três campos derivados em uma única passagem estruturada: um resumo da empresa em 2 frases, um score de adequação ao ICP de 1 a 10 com um motivo em uma linha, e um abridor de cold email com menos de 50 palavras que cita um sinal específico do perfil público da empresa. O abridor é sempre um rascunho para revisão do rep — a skill se recusa a ser conectada a uma etapa de envio automático.
O bundle do artefato é entregue em apps/web/public/artifacts/lead-enrichment-clay-claude/ e contém o corpo da skill (SKILL.md) mais três templates de referência que o operador preenche uma vez e a skill carrega em cada execução.
Quando usar
Você tem uma tabela no Clay (ou um CSV de leads exportável para o Clay) com pelo menos uma coluna domain preenchida e precisa enviar registros enriquecidos para HubSpot, Salesforce, Attio ou um sequenciador.
O volume é da ordem de centenas a dezenas de milhares por batch. Abaixo disso, escrever abridores manualmente é mais rápido. Acima disso, a disciplina de custo nesta skill (geração de abridores filtrada por ICP, extração em chamada única, caps de fetch por host) é o que mantém o gasto por linha razoável.
Os reps estão dispostos a ler o rascunho do abridor antes de enviá-lo. Todo o design assume um olhar humano entre o rascunho e o envio, e degrada mal sem ele.
Você quer uma única skill que a equipe possa chamar tanto de colunas de AI do Clay quanto de uma sessão do Claude Code executando a Anthropic Batch API sobre uma lista exportada — o corpo da skill é idêntico em ambas as superfícies.
Quando NÃO usar
Sequenciadores com envio automático. Se o plano é “conectar opener_draft direto na primeira etapa da sequência”, pare. O abridor tem um campo opener_confidence por um motivo: cerca de um em cinco rascunhos precisa de reescrita. Enviá-los automaticamente é exatamente o modo de falha contra o qual a skill foi projetada.
Listas sem uma base jurídica documentada para processamento. Contatos da UE ou do Reino Unido raspados sem consentimento prévio, leads do Quebec sob a Lei 25, dados de consumidores da Califórnia sem um caminho pela CCPA — a skill enriquecerá qualquer coisa para a qual você apontar, e é exatamente por isso que o operador precisa verificar antes. A página MDX inclui um bloco “Do NOT invoke” no SKILL.md cobrindo isso; não o comente.
Briefings de descoberta em nível de conta. Use a skill account-research. Essa faz mapeamento profundo de persona e hipóteses de dor; esta otimiza para volume em batch e custo por linha.
Decisões que requerem dados financeiros licenciados (S&P, Pitchbook). Esta skill lê apenas a web pública e não fabricará números de receita a partir do texto da homepage.
Listas em que os dados de origem são lixo. Domínios ruins entram, rascunhos ruins saem. Execute a coluna de validação de domínio do Clay antes; domínios estacionados e 404s são ignorados pela skill, mas você ainda paga créditos para descobrir isso.
Setup
Coloque a skill no seu ambiente. Para Claude.ai, importe o SKILL.md de apps/web/public/artifacts/lead-enrichment-clay-claude/SKILL.md e faça upload dos três arquivos em references/. Para Claude Code, copie o diretório para ~/.claude/skills/lead-enrichment/.
Substitua cada marcador {...} em references/1-icp-rubric.md pelo ICP real da sua equipe. A skill detecta marcadores não substituídos e se recusa a pontuar com um template — score: null, reason: "rubric not configured" em vez de adivinhar. Isso é intencional; um rubric errado é pior do que nenhum rubric.
Edite references/2-opener-style-guide.md com a voz da sua equipe e frases proibidas. Os padrões proíbem os sinais óbvios de LLM (“I noticed”, “love what you’re doing”, qualquer superlativo); adicione proibições específicas da empresa à medida que seus reps as sinalizam.
Edite references/3-source-quality-matrix.md para declarar a ordem de preferência entre os fornecedores de enriquecimento conectados à sua tabela do Clay antes desta skill. Sem uma ordem declarada, a etapa de snapshot alterna entre Apollo e Clearbit a cada execução, e os scores de ICP oscilam.
No Clay, crie três colunas de AI referenciando a skill: summary, icp_fit_score, opener_draft. Mapeie os inputs conforme a seção “Inputs” do SKILL.md. Configure o push de destino para HubSpot (ou seu CRM) e roteie opener_draft para uma variável de sequência em uma etapa que requer aprovação manual, não envio automático.
Execute em uma amostra de 20 linhas. Faça verificações: os fatos do snapshot rastreiam para o texto real da homepage, os scores de ICP caem em uma distribuição razoável, os abridores passam no guia de estilo. Ajuste o rubric e o guia de estilo antes de escalar. As primeiras 100 linhas são dados de calibração; trate-as assim.
O que a skill realmente faz
Por linha, quatro subtarefas em ordem:
Resolver e buscar.https://{domain} com timeout de 10 segundos e um hop de redirecionamento, depois melhor esforço em /about, /company, /customers. Domínios estacionados/404/corpo vazio retornam status: unreachable e pulam o restante. O cap de concorrência por host é 2, com um atraso mínimo de 250ms e uma única tentativa de backoff em 429.
Extrair snapshot estruturado em uma chamada ao Claude: setor, size_signal, value_prop, recent_signal opcional com URL. Uma única chamada em vez de três porque a contagem de round-trips é o principal driver de custo por linha em escala e o prompt de extração permanece confiável em uma única passagem.
Pontuar contra o rubric de ICP. Carrega references/1-icp-rubric.md, retorna 1-10 com um motivo em uma linha que nomeia a dimensão do rubric que direcionou o score.
Gerar abridor — somente se o score superar o threshold (padrão 6/10). Regras rígidas no prompt: cap de 50 palavras, referencia exatamente um fato do snapshot, sem superlativos, sem afirmações inventadas sobre a empresa, sem fechamento de pergunta de dor falsa. Retorna opener_confidence de 0,0 a 1,0; abaixo de 0,5 é sinalizado para reescrita.
O output de uma linha é um bloco JSON embutido em Markdown — a coluna de AI do Clay o analisa, e um humano lendo o log de execução pode escaneá-lo. O schema completo e um exemplo prático estão na seção “Output format” do apps/web/public/artifacts/lead-enrichment-clay-claude/SKILL.md.
Custo real
Há duas linhas de custo: tokens da Anthropic e créditos do Clay.
Tokens da Anthropic com preço do Sonnet (input $3/MTok, output $15/MTok na data de criação):
Etapas 1+2 (fetch + extração): ~3,5K tokens de input (homepage + about truncados para ~8K chars) + ~250 tokens de output. Aproximadamente $0,014/linha.
Etapa 3 (score de ICP): ~1K input + ~80 output. Aproximadamente $0,004/linha.
Etapa 4 (abridor, somente quando score >= threshold): ~1,2K input + ~120 output. Aproximadamente $0,005/linha.
Assim, uma linha que supera o threshold custa cerca de $0,023; uma que não supera custa cerca de $0,018. Execute via Anthropic Batch API para ~50% de desconto quando a carga de trabalho não for urgente (o enriquecimento noturno de MQLs inbound é o caso ideal) — isso coloca as linhas na faixa de $0,01-0,012.
Em escala: um batch semanal de 100K linhas com ~40% superando o threshold custa ~$1.500-2.000/mês na Anthropic antes do desconto de batch, ~$800-1.000 depois.
Créditos do Clay dependem de quais colunas de fornecedores estão conectadas antes. O Apollo custa cerca de 1 crédito por domínio resolvido; o Clearbit Reveal é 2-3; o ZoomInfo (passthrough pago) é mais. Empilhar três fornecedores e uma única linha pode chegar a 8-12 créditos do Clay antes de a skill rodar. O plano Starter inclui 5K créditos/mês; o Pro, 25K. Um batch de 100K linhas sob esse stack de fornecedores precisa do tier Enterprise ou de uma matriz mais restrita em references/3-source-quality-matrix.md. A matriz existe especificamente para eliminar o fornecedor de ranking mais baixo quando o teto de custo por linha é atingido.
Se a matemática parecer imprecisa, o ponto de alavancagem é o threshold de ICP. Elevá-lo de 6 para 7 tipicamente suprime a geração de abridores em 25-35% mais linhas; elevá-lo para 8 elimina mais 20%. A skill registra a distribuição de scores ao final de cada batch para que o operador possa ajustar empiricamente, não por intuição.
Métrica de sucesso
Taxa de resposta nos abridores revisados pelo rep, segmentada por bucket de opener_confidence. O objetivo da skill não é “mais abridores por hora” — é “abridores bons o suficiente para que os reps parem de reescrevê-los do zero”. Duas sub-métricas que valem ser instrumentadas:
Taxa de reescrita — que fração dos valores de opener_draft o rep envia sem alteração vs. reescreve materialmente. Meta: abaixo de 35% nas linhas com confiança 0,7+ após as primeiras 500 linhas de calibração. Acima disso significa que o guia de estilo está errado, o rubric está errado, ou a etapa de snapshot está alucinando.
Taxa de resposta por bucket de confiança. A taxa de resposta em opener_confidence >= 0,7 deve ser pelo menos 1,5x a taxa de resposta no bucket abaixo de 0,5. Se forem semelhantes, o score de confiança não é um sinal — investigue antes de confiar nele como input de roteamento.
vs alternativas
vs personalização nativa de sequência do Apollo. O Apollo gera abridores a partir de seus próprios dados de enriquecimento. É mais rápido de configurar, mas os abridores são visivelmente templados, pontuados na heurística de ICP do Apollo (não a sua), e sem rastro de auditoria de qual fato direcionou o rascunho. Esta skill leva mais tempo para configurar e custa mais por linha, mas os abridores referenciam URLs datadas que você pode verificar em um clique e o rubric é um arquivo que você controla.
vs Clearbit + Smart Variables do Outreach. Smart Variables alimentadas pelo Clearbit produzem mala direta factual ("their industry is ${X}"), não abridores — precisam que um humano escreva a frase real em torno da variável. Mais barato que esta skill se seus reps já estão escrevendo as frases; mais caro no geral se não estiverem, porque o tempo do rep domina o custo de token.
vs escrita manual de abridores. Um SDR sênior escreve um cold opener de alta qualidade em 4-7 minutos por conta a ~$60/hora com todos os custos — chame de $5 de tempo de rep por abridor. A skill custa no máximo ~$0,025 por abridor. O problema: o rep também fez algum raciocínio sobre a conta enquanto escrevia. A skill não faz isso. O formato certo para a maioria das equipes é a skill no volume do topo do funil (tudo abaixo da lista de contas tier-1) e abridores escritos pelo rep na lista de contas nomeadas.
vs status quo (sem enriquecimento, abridores genéricos). As taxas de resposta em abridores genéricos ficam em torno de 1-2%; abridores levemente personalizados vinculados a um sinal recente ficam em 4-8% nos benchmarks publicados. A skill mira no segundo grupo. Vale a pena apenas se a equipe estiver disposta a configurar o rubric e o guia de estilo; sem eles, os outputs da skill não são materialmente melhores que o status quo.
Pontos de atenção
Desvio de qualidade de fonte entre fornecedores. Quando Apollo, Clearbit e ZoomInfo enriquecem a mesma linha e discordam sobre headcount ou setor, a etapa de snapshot alterna entre eles a cada execução. Proteção: references/3-source-quality-matrix.md declara a ordem de preferência; o snapshot cita qual fornecedor (ou valor da homepage) usou por campo, então o desvio é auditável no log conflicts por linha.
Abridor inventando afirmações que não estão nos dados. Sem prompting rigoroso, os abridores fabricam fatos convincentes (“parabéns pela Série C” sem nenhuma Série C). Proteção: o prompt do abridor recebe o snapshot inline com uma regra explícita de “fatos que não estão no snapshot são proibidos”; recent_signal traz uma URL para verificação em um clique; abridores com opener_confidence abaixo de 0,5 são sinalizados para reescrita, nunca enviados automaticamente.
Escalada de custo por linha quando o filtro de ICP está frouxo. Um rubric que pontua a maioria das linhas em 7+ anula o gate do threshold; a geração de abridores roda em cada linha e o custo por linha aumenta 3-4x. Proteção: a skill emite um resumo de score_distribution por batch; se mais de 60% de uma amostra de 1K linhas cair em 7+, a skill imprime um aviso e recomenda apertar o rubric antes do próximo batch.
recent_signal desatualizado. Um sinal extraído há 90 dias se torna um risco — reps escrevendo “vi o lançamento de março” em agosto parecem desatualizados. Proteção: todo registro carrega enriched_at; a coluna do Clay é configurada para reexecutar quando mais antiga que 30 dias; a etapa do abridor se recusa a usar um recent_signal cuja data de URL é mais de 60 dias antes de enriched_at.
Consentimento e base jurídica. A skill enriquece qualquer coisa que você apontar para ela. O bloco “Do NOT invoke” no SKILL.md existe para lembrar o operador de verificar a base jurídica da lista de origem antes de executar. Não o exclua.
Stack
Clay — substrato de tabela, stack de fornecedores de enriquecimento, push de CRM de destino. O plano Starter suporta a primitiva de coluna de AI na qual a skill se conecta; o Pro é necessário para o volume de créditos de qualquer batch sério.
Claude (Sonnet por padrão) — a camada de inferência para extração de snapshot, pontuação de ICP e geração de abridores. Execute via coluna de AI nativa do Clay ou via Anthropic Batch API a partir de uma sessão do Claude Code para batches não urgentes pela metade do preço.
HubSpot, Salesforce ou Attio — CRM de destino. Mapeie summary → propriedade personalizada, icp_fit_score → propriedade personalizada + filtro de visualização, opener_draft → variável de sequência de primeiro contato em uma etapa de aprovação manual.
---
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}