La mayoría de los ejercicios de ICP terminan en una sopa de adjetivos: “SaaS de mid-market en fintech, mentalidad de growth, conscientes de seguridad”. Las listas armadas a partir de un brief así o se quedan cortas (filtros muy apretados, te salen 30 cuentas obvias que ya tiene todo el mundo) o se pasan (filtros muy sueltos, te salen 4,000 logos y los AEs ignoran el archivo). El bundle que esta página entrega hace la inversión: en vez de describir el ICP, apuntas a diez o veinte cuentas closed-won y dejas que Claude haga ingeniería inversa de qué tienen en común, y luego dejas que Clay traduzca esa firma en filtros y enrichment.
El artefacto es un Claude Skill — icp-list-builder — que corre el loop seed-a-lista de punta a punta y escribe un draft rankeado a una tabla de Clay. Está diseñado para entregarle al revisor un reporte en markdown y una tabla de Clay lado a lado, no para empujar directo a outbound.
Cuándo usarlo
Usa este skill cuando puedas nombrar 10-20 cuentas closed-won que comparten una forma reconocible, y quieras que las próximas 100-500 candidatas se les parezcan. Los disparadores más comunes en la práctica:
Refresh trimestral de territorio — los AEs necesitan un draft de lista por región, recién scoreado contra señales públicas actuales
Lanzamiento de un nuevo producto wedge o de un nuevo tier de pricing y la semilla de “quienes dijeron que sí” es chica pero real
Un programa de outbound ya trabajó el ICP obvio y el equipo necesita una segunda ola informada por lo que cerró, no por lo que el founder originalmente imaginó que era el ICP
El skill asume una cuenta de Clay en plan Pro o superior. Por debajo de Pro la superficie de enrichment es demasiado angosta para que el loop de lookalike sea útil, y vas a terminar pagando por un workflow que hace aproximadamente lo que un spreadsheet más una búsqueda de LinkedIn harían.
Cuándo NO usarlo
ABM de cuentas nominadas tier-1. Las listas armadas a mano para 25-50 cuentas estratégicas involucran input de customer-success y de exec que el skill no puede modelar. Usa esto para outbound tier-2 y tier-3; la varianza del loop de lookalike es demasiado alta para selección de tier-1.
Auto-cargar a secuencias de outbound. El output es un draft rankeado. El skill escribe a una tabla de Clay y produce un reporte en markdown deliberadamente para que un AE o SDR tenga que mirarlo antes de cualquier envío. Si conectas el output a un trigger de secuencia, lo estás usando mal.
Re-scorear cuentas que ya están en tu CRM. Usa una herramienta de intent nativa del CRM para eso. Este skill escribe candidatos net-new; no re-rankea los conocidos.
Scoring sobre proxies de clase protegida. Género del founder, etnicidad del founder, alma mater, origen del nombre — nada de eso pertenece al rubric. El archivo de rubric de referencia enumera qué dimensiones están permitidas; no agregues otras.
Listas semilla de menos de ocho cuentas. El skill se rehúsa a proceder con menos de ocho seeds válidas porque la extracción de la firma no es confiable sobre una base más chica. Si solo tienes cinco wins, arma la lista a mano y vuelve cuando tengas más.
Setup
El bundle vive en apps/web/public/artifacts/icp-account-list-builder-clay/ y contiene:
SKILL.md — la definición del Claude Skill que orquesta el loop
references/1-icp-rubric-template.md — los gates firmográficos y los pesos de señal que llenas para tu equipo
references/2-signal-source-matrix.md — qué fuentes públicas cuentan como primarias vs corroborantes, y cuáles están explícitamente prohibidas
references/3-exclusion-criteria.md — dominios baneados, parent companies, y patrones firmográficos que nunca deben aparecer en el output
El setup toma aproximadamente 45 minutos la primera vez y 5 minutos en cada refresh.
Instala el Skill. Mete SKILL.md en tu directorio de Claude Skills (o cárgalo vía Claude Code con /skill load). Llena references/1-icp-rubric-template.md con tus gates firmográficos reales, señales technographic, y pesos de señal. Llena references/3-exclusion-criteria.md desde un export fresco del CRM de clientes, oportunidades activas, y cuentas closed-lost de los últimos 180 días.
Prepara la lista semilla. Un CSV con company_name, domain, y why_we_won (dos oraciones). Saca seeds de varios AEs, segmentos, y close-months — el skill avisa si más del 60% de las seeds comparten un solo AE, vertical, o close-month, porque eso produce una lista que se ve como el territorio de un solo rep.
Conecta Clay. El skill lee tu workspace de Clay vía API. Define el workspace ID y la API key en la config local del Skill (nunca commitees esto al bundle).
Primera corrida. Invoca el skill con tu CSV de seeds y un target_list_size de 100. La primera corrida es más lenta porque el universo firmográfico está sin filtrar; las corridas siguientes contra una vista guardada de Clay son más rápidas.
Revisa el reporte de markdown y la tabla de Clay juntos. El reporte explica la firma de la seed, el desglose por tipo de señal, y los conteos de exclusion-flag. La tabla de Clay es la superficie de trabajo para el AE.
Qué hace realmente el skill
Seis pasos, en orden. El orden importa — correr el scoring del LLM antes del filtro firmográfico desperdicia créditos y arrastra misfits obvios.
Carga y valida los inputs. Tira las seeds que no tienen why_we_won y se rehúsa a correr con menos de ocho seeds válidas.
Extrae la firma de la seed. Manda las seeds y el rubric de ICP a Claude, que devuelve una firma estructurada: códigos de industria, banda de headcount, banda de revenue, geografía, etapa de funding, marcadores technographic, y marcadores de intent. Las notas de why_we_won codifican señales que no son columnas de Clay (“tenían una página de seguridad y compliance”); por eso se necesita un pase de LLM antes del filtro determinístico.
Aplica el filtro firmográfico determinístico en Clay. Traduce los hard gates de la firma en filtros de Clay y los corre primero para reducir el universo a aproximadamente 500-3,000 candidatos. Tira cualquier cosa de la lista de exclusión en esta etapa. Hacer esto antes del scoring corta el costo de LLM aproximadamente en 30-100x porque la mayoría de los rechazos son misfits firmográficos obvios que no necesitan razonamiento.
Enriquece y corrobora señales de intent. Para cada candidato restante, pídele a Clay que enriquezca tech stack, deltas de hiring, y anuncios de los últimos 90 días, luego pídele a Claude scores de match por señal con citas. Cualquier señal individual de intent requiere una señal corroborante primaria — un cambio de trabajo en LinkedIn más un press release, por ejemplo. Las afirmaciones de intent de fuente única se scorean en 0 con razón “no corroborado” en lugar de adivinar.
Rankea, deduplica, y batch-write a Clay. Ordena por score total, deduplica sobre la columna de parent-company, y escribe las primeras target_list_size filas a una nueva tabla de Clay en un solo batch. Los writes por fila queman créditos y dejan estado inconsistente si hay interrupción; los writes por batch no.
Produce el reporte de output. Un documento de markdown con la firma de la seed arriba, la tabla de candidatos rankeada, un desglose por tipo de señal, conteos de exclusion-flag, y metadata de la corrida. El revisor lee esto antes de trabajar la tabla de Clay.
Realidad de costos
Las palancas grandes de costo son los créditos de enrichment de Clay y los tokens de Claude. Presupuestos aproximados por corrida, anclados a un target_list_size de 100 contra un universo firmográficamente filtrado de 1,800-2,200 candidatos:
Tokens de Claude (extracción de firma + scoring por candidato). Aproximadamente 500K-700K tokens de input y 80K-120K tokens de output en Claude Opus por corrida. Al pricing de lista de Opus 4.7 eso aterriza alrededor de $9-14 por corrida. En Claude Sonnet el mismo loop está alrededor de $1.50-$2.50 por corrida con pérdida medible de calidad en el paso de extracción de firma (el razonamiento de patrón sobre la seed se beneficia del modelo más grande). Recomendación: Opus en el paso de firma, Sonnet en el paso de scoring por candidato.
Créditos de Clay. Aproximadamente 800-1,000 créditos de enrichment por corrida para un output de 100 filas, asumiendo 2,000 candidatos entrando al paso de enrichment. Al pricing de Clay Pro eso es alrededor de $24-30 en costo de créditos por corrida; en el tier Explorer los créditos son más apretados y deberías bajar target_list_size a 50 o pre-filtrar más fuerte.
A escala. Un equipo corriendo esto semanalmente por región (digamos, cuatro pods de AE) aterriza alrededor de $1,300-$2,000 al mes combinados ($150-200 de Claude, el resto en créditos de Clay). Eso está muy por debajo del costo de un solo asiento de ZoomInfo SalesOS y produce una lista más fresca, pero requiere mantener actualizado el rubric y el archivo de exclusión — los inputs desactualizados son donde el costo se descontrola (pagas créditos para enriquecer cuentas que nunca debieron pasar el Paso 1).
El patrón dominante de blowup de costo es llamar al skill repetidamente con un gate firmográfico suelto y ver el universo de candidatos inflarse. La guarda está en el Paso 3: si Clay devuelve más de 5,000 candidatos, el skill aprieta una banda y vuelve a correr en lugar de enriquecer todo el set.
Métrica de éxito
La métrica para vigilar es la tasa a la que los AEs aceptan el draft de la lista a su working set sin retrabajo manual. Objetivo: 70%+ aceptados (es decir, de 100 candidatos rankeados, al menos 70 aterrizan en la cola de outbound de alguien sin ser borrados ni reetiquetados). Por debajo del 50% de aceptación, el rubric está mal, la lista de seeds está sesgada, o el archivo de exclusión está desactualizado — diagnostica en ese orden.
Secundaria: tasa de meeting-booked sobre las cuentas aceptadas comparada con la lista de outbound baseline del equipo. El skill está pagando su costo de créditos cuando esa tasa es al menos igual a la baseline; el value-add es la reducción del tiempo de armado de listas, no necesariamente un lift de conversión inmediato.
vs alternativas
vs LinkedIn Sales Navigator + filtrado manual. Sales Nav es la herramienta correcta para listas tier-1 armadas a mano y para prospección individual sobre un candidato. Es la herramienta equivocada para producir 100 lookalikes rankeados semanalmente — los filtros de saved-search no capturan señales de intent, y el tiempo de filtrado manual por lista es aproximadamente 3-5 horas de la semana de un SDR. Este skill reemplaza esas 3-5 horas con una revisión de 5 minutos sobre un draft rankeado.
vs ZoomInfo SalesOS Intent. SalesOS es maduro, tiene buena data de intent en cuentas enterprise, y es la respuesta correcta si tienes un motion enterprise y el presupuesto de $35K-$80K al año en asientos. Para un motion mid-market en un equipo más chico, este skill más Clay Pro es aproximadamente el 80% de la señal al 5-10% del costo, con el trade-off de que tú eres dueño del rubric y de la lista de exclusión en lugar de depender del scoring de un vendor.
vs Apollo Living Data. El feature de lookalike de Apollo es lo más cercano en forma a este skill y es un click en lugar de un setup de 45 minutos. El scoring de lookalike de Apollo es opaco (no puedes ver los pesos de señal ni overridearlos) y los outputs tienden a sobre-indexar en similitud firmográfica. Este skill hace inspeccionables el rubric y los pesos y obliga a la corroboración por señal; el costo es el tiempo de setup y el requisito de mantener los archivos de referencia actualizados.
vs nada (status quo, el AE arma la lista). Las listas armadas por AE son completas en las cuentas conocidas del AE y débiles en los lookalikes que el AE no ha escuchado. Este skill es lo opuesto — es malo en cuentas estratégicas nominadas y bueno sacando a la luz los próximos 100 lookalikes. El patrón honesto es correr ambos en paralelo: el AE es dueño de la lista nominada, el skill produce el draft de lookalikes.
Watch-outs
Datos firmográficos basura de fuentes públicas. Los números de headcount y revenue de los aggregators rezagan la realidad por 6-18 meses y están equivocados en 30-50% en empresas growth-stage. Defensa: el skill trata cualquier fuente firmográfica individual como direccional y requiere acuerdo entre dos fuentes independientes antes de aplicar un hard gate. Los conflictos salen en el reporte de output (“LinkedIn dice 120, BuiltWith dice 380 — marcado para revisión manual”) en lugar de resolverse en silencio.
Ruido de señal de intent. Una señal de “contrató a un VP of Sales” raspada de LinkedIn solo clasifica mal promociones, roles de contrato, y title inflation como new-hires. Defensa: el Paso 4 requiere una señal corroborante primaria (press release, evidencia de LinkedIn de un segundo ángulo) antes de que cualquier señal de intent score arriba de 0; las afirmaciones no corroboradas se scorean en 0 con la razón registrada para auditoría.
Envenenamiento de la lista por bases de datos desactualizadas. Algunas fuentes de enrichment de Clay traen empresas zombi — adquiridas, fusionadas, o difuntas — que pasan los filtros pero no pueden comprar. Defensa: tira cualquier candidato cuyo website devuelva un 4xx/5xx en el chequeo de homepage, no tenga actividad en LinkedIn en los últimos 90 días, o cuyo campo de parent-company resuelva a un adquirente conocido en el archivo de exclusión. El conteo de drops aparece en la metadata de la corrida para que el operador detecte un spike (señal de que el archivo de exclusión o la fuente del aggregator se está degradando).
Sesgo en la seed. Una lista semilla de 10 wins de un solo AE en un solo vertical produce una lista que se ve como el territorio de ese AE. Defensa: el skill avisa si más del 60% de las seeds comparten el mismo AE, vertical, o close-month, y le pide al operador que amplíe la seed antes de continuar.
Sobreajuste del filtro. Una firma tan apretada que solo coincide con las 14 seeds produce 0-30 candidatos y se siente precisa pero es inútil. Defensa: si el Paso 3 devuelve menos de 200 candidatos, el skill afloja las bandas de headcount y revenue un nivel y vuelve a correr en lugar de proceder con un universo hambriento.
Archivo de exclusión desactualizado. Si el export de la lista de clientes tiene dos meses, un cliente puede colarse y terminar en outbound. Defensa: el skill avisa en el reporte de output cuando last_refreshed en el archivo de exclusión tiene más de 14 días.
Stack
Clay (Pro o superior) — sustrato de enrichment, filtro firmográfico, y tabla destino. Pro es el piso práctico para el loop de lookalike.
Claude (Opus 4.7 para extracción de firma, Sonnet para scoring por candidato) — razonamiento de firma sobre las notas de why_we_won de la seed y scoring de corroboración por señal con citas. Dividir la selección de modelo entre los dos pasos es donde el trade-off costo-calidad aterriza mejor.
CRM (cualquiera) — fuente de la lista semilla, lista de clientes, lista de oportunidades, y lista closed-lost que alimenta el archivo de exclusión. El skill no lee el CRM directamente; el operador exporta CSVs.
Destino de outbound (Outreach, Salesloft, Apollo, custom) — donde sea que vaya la lista revisada después de la aceptación del AE. El skill se detiene en la tabla de Clay por diseño.
---
name: icp-list-builder
description: Build a ranked target-account list from public signals using a closed-won seed pattern. Input is a seed of 10-20 closed-won accounts plus an ICP rubric; output is a ranked list of 100-500 lookalike candidates with per-account evidence, ready to write to a Clay table for outbound or AE territory routing.
---
# ICP list builder (Clay + Claude)
## When to invoke
Invoke this skill when a RevOps or SDR leader needs a fresh target-account list grounded in what already worked — not in a generic "mid-market SaaS in fintech" description. The skill takes closed-won accounts as the ground truth, extracts the firmographic + technographic + intent signature shared across them, then proposes Clay filters that produce lookalikes plus a ranked candidate list with evidence.
Typical triggers:
- Quarterly territory refresh — AEs need a new draft list per region
- New product or new wedge launch — the seed list is small (10-20 wins) and you want the next 100 to look like them
- Outbound program needs more accounts after the obvious ICP has been worked
Do NOT invoke this skill for:
- Auto-loading the output into outbound sequences without rep review. The output is a ranked draft, not a send list. AE or SDR review is mandatory.
- Scoring on protected-class proxies (founder gender, ethnicity, school). Rubric weighting must be on firmographic and intent signals only.
- Account lists for ABM tier-1 named accounts — that work is hand-built and this skill's lookalike loop has too much variance for tier-1 selection.
- Buying-signal scoring inside an existing CRM record (use a CRM-native intent tool — this skill writes new candidates, it does not re-score known ones).
## Inputs
Required:
- `seed_accounts` — CSV with columns `company_name`, `domain`, `why_we_won` (two sentences). 10-20 rows. Rows with missing `why_we_won` are dropped with a warning rather than silently skipped.
- `icp_rubric` — path to `references/1-icp-rubric-template.md` filled in for your team. Defines hard firmographic gates and signal-weight ordering.
- `target_list_size` — integer, the number of ranked candidates to return. Default 100. Hard cap 500 (above that, Clay credits and signal noise both blow up).
Optional:
- `signal_sources` — path to `references/2-signal-source-matrix.md` to override which public sources Clay/Claude should query and which it should ignore. Defaults: company website, LinkedIn company page, BuiltWith, public hiring pages, last-90-day press/funding announcements.
- `exclusion_list` — path to `references/3-exclusion-criteria.md`. Domains, parent companies, or firmographic patterns that must never appear in the output (existing customers, active opportunities, do-not-contact, known losses inside last 6 months).
- `territory_filter` — geography or vertical filter applied after scoring, for splitting the output by AE territory.
## Reference files
Always read the following from `references/` before generating the list. They contain the team's actual ICP definition, source preferences, and exclusions. Without them, the list is generic and may write banned domains.
- `references/1-icp-rubric-template.md` — hard firmographic gates plus the signal-weight order used for scoring. Replace template contents with your real rubric before first run.
- `references/2-signal-source-matrix.md` — which public sources count as primary vs corroborating, and which are explicitly disallowed (low-quality scraped databases, stale aggregators). Replace with the team's source policy.
- `references/3-exclusion-criteria.md` — banned domains, parent companies, firmographic patterns to drop. Replace with the team's actual exclusion list before first run.
## Method
Run these six steps in order. The deterministic firmographic filter MUST run before any LLM scoring — running scoring across the full Clay universe wastes credits and pulls in obvious misfits.
### 1. Load and validate inputs
Read `seed_accounts`, `icp_rubric`, and `exclusion_list`. Drop seed rows with missing `why_we_won` and warn. Refuse to proceed if fewer than 8 valid seed rows remain — the signature extraction is unreliable below that floor.
### 2. Extract the seed signature
Send the validated seeds to Claude with the ICP rubric as context. Ask for a structured signature: industry codes, headcount band, revenue band (if known), geography, funding stage, technographic markers (specific tools), intent markers (hiring patterns, page additions, public announcements), and disqualifiers observed.
Why Claude here, not a SQL query: the `why_we_won` notes encode tacit signals ("they had a security and compliance page" — not a Clay column) that firmographic queries miss.
### 3. Apply deterministic firmographic filter in Clay
Translate the signature's industry, headcount, revenue, geography, and funding gates into Clay filters. Run them first to narrow the universe to ~500-3000 candidates before any LLM cost is spent. Drop anything in `exclusion_list` at this stage.
Why deterministic first, LLM second: a single LLM scoring pass at full Clay universe scale costs roughly 30-100x more than a filter pass, and 80-90% of the rejections are obvious firmographic misfits that need no reasoning.
### 4. Enrich and corroborate intent signals
For each remaining candidate, ask Clay to enrich tech stack, hiring page deltas, and last-90-day announcements. Pass each candidate to Claude with the seed signature and ask for a per-signal match score (0-3) plus a corroborating citation URL.
Constraint: any single intent signal (e.g. "hired a VP of Revenue") requires a primary corroborating signal (LinkedIn job change visible from a second angle, or a press release citing the hire). Single-source intent claims are scored 0 with reason "uncorroborated" rather than guessed. This is the guard against intent-signal noise.
### 5. Rank, dedupe, and batch-write to Clay
Sort by total signal-match score, descending. Dedupe by domain (parent companies via Clay's parent-company column where present — same parent counts once). Write the top `target_list_size` rows to a new Clay table, one batch write at the end rather than per-row.
Why batch + dedupe before write: Clay enrichment is metered per row, and duplicate parent writes burn credits without adding accounts. A single batch write also keeps the table consistent if the run is interrupted.
### 6. Produce the output report
Generate the markdown output (format below). Include a top section that explains the seed signature so the AE/SDR reviewer can sanity-check the shape of the list before working it.
## Output format
Output is a single markdown document, written to disk and surfaced to the caller. Literal example shape:
```markdown
# ICP list — {date}
## Seed signature
- Industry: B2B SaaS — DevTools and Observability (NAICS 5415)
- Headcount: 80-350
- Revenue (where known): $10M-$60M ARR
- Geo: US + Canada, EMEA-EN
- Funding: Series B and C
- Technographic markers: Stripe, Datadog OR New Relic, Notion (corroborator)
- Intent markers: hired VP of Revenue or Head of Sales in last 9 months, or
shipped a new public security/compliance page in last 6 months
- Disqualifiers observed: government contractor, parent in F500
## Ranked candidates (top 100 of 217 scored)
| Rank | Company | Domain | Score | Top signal | Exclusions flagged |
|---|---|---|---|---|---|
| 1 | Acme Observability | acme.io | 14/15 | Hired VP Rev (LinkedIn + Sept 2026 press release) | none |
| 2 | Beacon Logs | beaconlogs.com | 13/15 | Stripe + Datadog + Series B Aug 2026 | none |
| 3 | Ledger Trace | ledgertrace.dev | 12/15 | New SOC 2 page Oct 2026 | EU-only — territory split required |
| ... | ... | ... | ... | ... | ... |
## Signal-type breakdown across the top 100
- Hiring-signal-driven: 38
- Technographic-driven: 29
- Funding/announcement-driven: 22
- Multi-signal (3+): 11
## Exclusion-flag explanations
- 14 candidates flagged "EU-only — territory split required": these passed
ICP but fall outside US/CA territories and should route to the EMEA pod.
- 3 candidates flagged "parent in F500": these were dropped from the ranked
list per `exclusion_list`. Listed for audit only.
- 9 candidates flagged "uncorroborated intent": dropped per Step 4 guard.
## Run metadata
- Seeds used: 14 (2 dropped for missing why_we_won)
- Clay universe after firmographic filter: 1,847
- Candidates scored by Claude: 217
- Final ranked list: 100
- Clay credits consumed: ~870 (enrichment) + 217 (scoring lookups)
```
## Watch-outs
- **Junk firmographic data from public sources.** Aggregator headcount and revenue numbers lag reality by 6-18 months and are wrong by 30-50% on growth-stage companies. Guard: treat any single firmographic source as directional, require headcount or revenue agreement across two independent sources before applying a hard gate, and surface conflicts in the output ("LinkedIn says 120, BuiltWith says 380 — flagged for manual review").
- **Intent-signal noise.** A "hired a VP of Sales" signal scraped from LinkedIn alone misclassifies promotions, contract roles, and job-title inflation as net-new hires. Guard: Step 4 requires a primary corroborating signal (press release, second-angle LinkedIn evidence) before any intent signal scores above 0.
- **List poisoning from outdated databases.** Some Clay enrichment sources carry zombie companies (acquired, merged, defunct) that pass filters but cannot buy. Guard: drop any candidate whose website returns a 4xx/5xx, has no LinkedIn activity in last 90 days, or whose parent-company field resolves to a known acquirer. These are reported in the run metadata, not silently dropped.
- **Seed bias.** A seed list of 10 wins from one AE in one vertical produces a list that looks like that AE's territory, not the company's ICP. Guard: the skill warns if more than 60% of seeds share the same primary AE, vertical, or close-month, and asks the operator to broaden the seed before proceeding.
- **Filter over-fit.** A signature so tight it matches only the 14 seeds produces 0-30 candidates and feels precise but is useless. Guard: if the Clay firmographic-filter step returns fewer than 200 candidates, the skill loosens the headcount and revenue bands by one notch and re-runs rather than proceeding.
- **AE review is non-optional.** Skill output is a ranked draft. The output format is markdown (not a Clay-to-sequence webhook) deliberately to force a human review step before any send.
# ICP rubric — TEMPLATE
> Replace this template's contents with your team's actual ICP rubric
> before the first run of `icp-list-builder`. The skill reads this file to
> set hard firmographic gates and signal-weight ordering. Without your
> real values, the candidate list will be generic.
## Hard firmographic gates
These are AND-gates — a candidate failing any single gate is dropped before any LLM scoring runs. Keep this list short (5-8 dimensions max). Long gate lists shrink the candidate universe below the 200-row floor and force the skill to loosen filters anyway.
| Dimension | In-ICP | Stretch (allowed but downweighted) | Out (dropped pre-scoring) |
|---|---|---|---|
| Industry (NAICS or custom tag) | {list} | {list} | {list} |
| Headcount | {range, e.g. 80-500} | {range, e.g. 50-79 or 501-800} | {below/above} |
| Revenue (where known) | {range} | {range} | {range} |
| Geography | {regions, e.g. US/CA, EMEA-EN} | {regions, e.g. APAC-EN} | {regions, e.g. China, sanctioned countries} |
| Funding stage | {stages, e.g. Series B-D} | {stages, e.g. Series A late or Series E} | {stages, e.g. pre-seed, IPO+} |
| Business model | {e.g. B2B SaaS subscription} | {e.g. usage-based} | {e.g. consulting, services} |
## Technographic signals
Tools that signal a fit (we win when these are present). Each entry should name a specific product, not a category.
- {Tool 1 — e.g. "Stripe (billing) — strong"}
- {Tool 2 — e.g. "Datadog or New Relic — strong"}
- {Tool 3 — e.g. "Notion (corroborator only, not a primary signal)"}
Tools that signal misfit. The skill downweights candidates with these.
- {Tool A — e.g. "Salesforce + manual CPQ — competing internal build"}
- {Tool B — e.g. "Legacy ERP with no API surface"}
## Intent signals
The signals the skill looks for in Step 4. Each must specify the primary source AND the required corroborating source. Single-source intent counts as zero per the skill's guard.
| Signal | Primary source | Required corroborator |
|---|---|---|
| Hired VP Rev / Head of Sales (last 9 months) | LinkedIn job change | Press release, company blog, or 2nd-angle LinkedIn evidence (e.g. announcement post) |
| New compliance page (SOC 2, ISO 27001, HIPAA) | Company website diff | Trust center URL or vendor listing |
| Funding round (Series A+) last 6 months | Crunchbase / company press | TechCrunch, PitchBook, or filed 8-K |
| Active hiring 5+ GTM roles | Public careers page | LinkedIn jobs cross-reference |
## Signal weights
The skill ranks candidates on a 0-15 scale across five signal categories. Set the per-category weights here. Total must equal 15.
- Industry + business-model match: weight {N, e.g. 4}
- Headcount + revenue match: weight {N, e.g. 3}
- Technographic match: weight {N, e.g. 3}
- Intent signal (corroborated): weight {N, e.g. 4}
- Geography + funding stage match: weight {N, e.g. 1}
## Disqualifiers (skill flags prominently if found)
Single signals that drop a candidate regardless of other fit. Keep narrow.
- {Disqualifier 1 — e.g. "Parent company in Fortune 500 (procurement model wrong for our motion)"}
- {Disqualifier 2 — e.g. "Government contractor (compliance posture we cannot meet)"}
- {Disqualifier 3 — e.g. "Active acquisition in last 90 days (buying frozen)"}
## Last edited
{YYYY-MM-DD} — update on every material change so the skill can warn when the rubric is stale (more than 6 months old triggers a stale-rubric notice in the output report).
# Signal source matrix — TEMPLATE
> Replace this template's contents with your team's actual source policy.
> The `icp-list-builder` skill reads this file to decide which public sources
> count as primary vs corroborating, and which to skip entirely.
## Why this file exists
The skill's intent-signal scoring (method Step 4) requires a primary source plus a corroborating source for any signal to count above 0. This matrix is where you encode which source plays which role for your team. Without it the skill defaults to a generic ordering that under-weights signals you trust and over-weights ones you've found unreliable.
## Source roles
For each public source the skill may query, assign one role:
- **primary** — a signal originating here can anchor a score (still needs one corroborator)
- **corroborator** — only counts as the second source confirming a primary signal; cannot anchor on its own
- **skip** — never query this source; results are too noisy or stale to trust
## Source × signal-type matrix
| Source | Firmographic | Technographic | Hiring | Funding | Compliance/security | Notes |
|---|---|---|---|---|---|---|
| Company website (homepage, About, careers, trust center) | corroborator | corroborator | primary | corroborator | primary | Source of truth for own claims; queried first |
| LinkedIn company page | primary | skip | primary | corroborator | skip | Strongest for headcount + role changes; rate-limited |
| LinkedIn jobs | skip | skip | corroborator | skip | skip | Volume signal only; titles are noisy |
| BuiltWith | skip | primary | skip | skip | corroborator | Strong for tech stack, weak for everything else |
| Crunchbase | corroborator | skip | skip | primary | skip | Funding date + amount only; org charts are stale |
| Public press releases (last 90 days) | skip | skip | corroborator | corroborator | corroborator | Date-stamped; cite URL + date |
| TechCrunch / industry press | skip | skip | corroborator | corroborator | skip | Use for funding corroboration |
| G2 / Capterra reviews | skip | corroborator | skip | skip | skip | Reviewer-self-reported; treat as weak signal only |
| Wayback Machine | corroborator | corroborator | corroborator | skip | corroborator | Use to date page additions (compliance pages, jobs page changes) |
| Generic data aggregators (ZoomInfo, Apollo passive scrape) | skip | skip | skip | skip | skip | High noise; use a paid product directly if needed, do not let the skill scrape |
## Sources explicitly disallowed
The skill must never query these. Add domains here as you discover sources that have produced bad data for your team.
- {Domain 1 — e.g. "scraped-data-aggregator-x.example"}
- {Domain 2}
## Refresh windows
How fresh a signal must be to count. Anything older than the window is dropped to corroborator-only or to 0.
| Signal type | Max age to count as primary | Max age to count as corroborator |
|---|---|---|
| Hiring announcement | 9 months | 18 months |
| Funding round | 6 months | 12 months |
| Compliance page addition | 6 months | 24 months |
| Tech-stack signal | 6 months (BuiltWith last-seen) | 12 months |
| Headcount snapshot | 90 days | 12 months |
## Last edited
{YYYY-MM-DD}
# Exclusion criteria — TEMPLATE
> Replace this template's contents with your team's actual exclusion list
> before the first run of `icp-list-builder`. The skill reads this file in
> method Step 1 and Step 3, and refuses to write any matched domain to the
> output Clay table.
## Why this file matters
A list builder that writes existing customers, active opportunities, or known-loss accounts back into outbound is worse than no list — it burns trust with AEs, with the prospect (who gets contacted as a stranger), and with CS (who finds out when the customer escalates). This file is the backstop. The skill treats it as a hard filter, not a downweighting signal.
## Banned domains
Exact-match domains that must never appear in the output. The skill matches on root domain and known parent-company domains.
```
# Existing customers
{customer1.com}
{customer2.com}
# Active opportunities (export from CRM monthly and paste here)
{opp1.com}
{opp2.com}
# Closed-lost in last 6 months (do not re-engage from outbound; route to AE for hand-touch)
{lost1.com}
{lost2.com}
# Do-not-contact requests honored
{dnc1.com}
{dnc2.com}
# Internal / partners / investors (never outbound)
{partner1.com}
{investor1.com}
```
## Banned parent companies
If the skill's enrichment step resolves a candidate to a parent in this list, the candidate is dropped regardless of root-domain match.
- {Parent 1 — e.g. "BigCo Inc — all subsidiaries flagged"}
- {Parent 2}
## Firmographic exclusion patterns
Patterns broader than a single domain. The skill applies these in Step 3 after firmographic enrichment.
- {Pattern 1 — e.g. "Any company tagged as government contractor by NAICS prefix 5417"}
- {Pattern 2 — e.g. "Any company headquartered in {sanctioned-country-list}"}
- {Pattern 3 — e.g. "Any company with active M&A announcement in last 90 days"}
## Audit posture
Excluded candidates are not silently dropped. The skill's run metadata section reports counts per exclusion category. This lets RevOps verify the exclusion file is current and catches the case where the customer list export was forgotten and a customer slipped through.
## Refresh cadence
This file is regenerated from CRM exports on a fixed cadence. Stale exclusion files are the most common source of bad list output.
- Customers: refresh weekly (every Monday)
- Active opportunities: refresh weekly (every Monday)
- Closed-lost: refresh monthly (first of month)
- DNC: refresh on every request received
- Partners / investors: refresh quarterly
## Last refreshed
{YYYY-MM-DD} — exports as of this date. The skill warns in its output report if this date is more than 14 days old.