Most ICP exercises drift into adjective soup — “mid-market SaaS in fintech, growth mindset, security-aware.” Lists built from that kind of brief either undershoot (filters too tight, you get 30 obvious accounts everyone already has) or overshoot (filters too loose, you get 4,000 logos and the AEs ignore the file). The bundle this page ships does the inversion: instead of describing the ICP, you point at ten to twenty closed-won accounts and let Claude reverse-engineer what they have in common, then you let Clay translate that signature into filters and enrichment.
The artifact is a Claude Skill — icp-list-builder — that runs the seed-to-list loop end to end and writes a ranked draft to a Clay table. It is designed to hand a reviewer a markdown report and a Clay table side by side, not to push straight into outbound.
When to use
Use this skill when you can name 10-20 closed-won accounts that share a recognizable shape, and you want the next 100-500 candidates to look like them. The most common triggers in practice:
Quarterly territory refresh — AEs need a draft list per region, freshly scored against current public signals
A new wedge product or new pricing tier launches and the seed of “people who said yes” is small but real
An outbound program has worked the obvious ICP and the team needs a second wave that is informed by what closed, not by what the founder originally imagined the ICP to be
The skill assumes a Clay account on the Pro plan or higher. Below Pro the enrichment surface is too narrow for the lookalike loop to be useful, and you will end up paying for a workflow that does roughly what a spreadsheet plus LinkedIn search would do.
When NOT to use
Tier-1 named-account ABM. Hand-built lists for 25-50 strategic accounts involve customer-success and exec input the skill cannot model. Use this for tier-2 and tier-3 outbound; the variance on the lookalike loop is too high for tier-1 selection.
Auto-loading into outbound sequences. The output is a ranked draft. The skill writes to a Clay table and produces a markdown report deliberately so an AE or SDR has to look at it before any send. If you wire the output into a sequence trigger, you are using this wrong.
Re-scoring accounts already in your CRM. Use a CRM-native intent tool for that. This skill writes net-new candidates; it does not re-rank known ones.
Scoring on protected-class proxies. Founder gender, founder ethnicity, alma-mater, name origin — none of these belong in the rubric. The reference rubric file enumerates which dimensions are allowed; do not add others.
Seed lists under eight accounts. The skill refuses to proceed below eight valid seeds because the signature extraction is unreliable on a smaller base. If you only have five wins, build the list by hand and come back when you have more.
Setup
The bundle lives at apps/web/public/artifacts/icp-account-list-builder-clay/ and contains:
SKILL.md — the Claude Skill definition that orchestrates the loop
references/1-icp-rubric-template.md — the firmographic gates and signal weights you fill in for your team
references/2-signal-source-matrix.md — which public sources count as primary vs corroborating, and which are explicitly disallowed
references/3-exclusion-criteria.md — banned domains, parent companies, and firmographic patterns that must never appear in the output
Setup is roughly 45 minutes the first time and 5 minutes on every refresh.
Install the Skill. Drop SKILL.md into your Claude Skills directory (or load it via Claude Code with /skill load). Fill in references/1-icp-rubric-template.md with your real firmographic gates, technographic signals, and signal weights. Fill in references/3-exclusion-criteria.md from a fresh CRM export of customers, active opportunities, and last-180-day closed-lost accounts.
Prepare the seed list. A CSV with company_name, domain, and why_we_won (two sentences). Pull seeds across multiple AEs, segments, and close-months — the skill warns if more than 60% of seeds share a single AE, vertical, or close-month, because that produces a list that looks like one rep’s territory.
Connect Clay. The skill reads your Clay workspace via API. Set the workspace ID and API key in the Skill’s local config (never commit these to the bundle).
First run. Invoke the skill with your seed CSV and a target_list_size of 100. The first run is slower because the firmographic universe is unfiltered; subsequent runs against a saved Clay view are faster.
Review the markdown report and the Clay table together. The report explains the seed signature, signal-type breakdown, and exclusion-flag counts. The Clay table is the working surface for the AE.
What the skill actually does
Six steps, in order. The order matters — running LLM scoring before the firmographic filter wastes credits and pulls in obvious misfits.
Load and validate inputs. Drops seeds with missing why_we_won and refuses to run below eight valid seeds.
Extract the seed signature. Sends the seeds and the ICP rubric to Claude, which returns a structured signature: industry codes, headcount band, revenue band, geography, funding stage, technographic markers, and intent markers. The why_we_won notes encode signals that aren’t Clay columns (“they had a security and compliance page”); that is why an LLM pass is needed before the deterministic filter.
Apply deterministic firmographic filter in Clay. Translates the signature’s hard gates into Clay filters and runs them first to narrow the universe to roughly 500-3,000 candidates. Drops anything in the exclusion list at this stage. Doing this before scoring cuts the LLM cost by roughly 30-100x because most rejections are obvious firmographic misfits that need no reasoning.
Enrich and corroborate intent signals. For each remaining candidate, asks Clay to enrich tech stack, hiring deltas, and last-90-day announcements, then asks Claude for per-signal match scores with citations. Any single intent signal requires a primary corroborating signal — a LinkedIn job change plus a press release, for example. Single- source intent claims are scored 0 with reason “uncorroborated” rather than guessed.
Rank, dedupe, and batch-write to Clay. Sorts by total score, dedupes on parent-company column, and writes the top target_list_size rows to a new Clay table in a single batch. Per-row writes burn credits and leave inconsistent state on interruption; batch writes do not.
Produce the output report. A markdown document with the seed signature at the top, the ranked candidate table, a signal-type breakdown, exclusion-flag counts, and run metadata. The reviewer reads this before working the Clay table.
Cost reality
The big cost levers are Clay enrichment credits and Claude tokens. Rough budgets per run, anchored to a target_list_size of 100 against a firmographic-filtered universe of 1,800-2,200 candidates:
Claude tokens (signature extraction + per-candidate scoring). Roughly 500K-700K input tokens and 80K-120K output tokens on Claude Opus per run. At Opus 4.7 list pricing that lands around $9-14 per run. On Claude Sonnet the same loop is around $1.50-$2.50 per run with measurable quality loss on the signature extraction step (the seed-pattern reasoning benefits from the larger model). Recommendation: Opus on the signature step, Sonnet on the per-candidate scoring step.
Clay credits. Roughly 800-1,000 enrichment credits per run for a 100-row output, assuming 2,000 candidates entering the enrichment step. At Clay Pro pricing that is about $24-30 in credit cost per run; on the Explorer tier credits are tighter and you should drop target_list_size to 50 or pre-filter harder.
At scale. A team running this weekly per region (say, four AE pods) lands at roughly $1,300-$2,000 per month combined ($150-200 of Claude, the rest Clay credits). That is well under the cost of a single ZoomInfo SalesOS seat and produces a fresher list, but it requires the rubric and exclusion file to be kept current — stale inputs are where the cost goes wrong (you pay for credits to enrich accounts that should never have made it past Step 1).
The dominant cost-blowup pattern is calling the skill repeatedly with a loose firmographic gate and watching the candidate universe balloon. The guard is in Step 3: if Clay returns more than 5,000 candidates, the skill tightens one band and re-runs rather than enriching the whole set.
Success metric
The metric to watch is the rate at which AEs accept the draft list into their working set without manual rework. Target: 70%+ accepted (i.e. of 100 ranked candidates, at least 70 land in someone’s outbound queue without being deleted or relabeled). Below 50% acceptance, the rubric is wrong, the seed list is biased, or the exclusion file is stale — diagnose in that order.
Secondary: meeting-booked rate on the accepted accounts compared with the team’s baseline outbound list. The skill is earning its credit cost when that rate is at least equal to baseline; the value-add is the reduction in list-building time, not necessarily an immediate conversion lift.
vs alternatives
vs LinkedIn Sales Navigator + manual filtering. Sales Nav is the right tool for hand-built tier-1 lists and for individual prospecting on a candidate. It is the wrong tool for producing 100 ranked lookalikes weekly — the saved-search filters do not capture intent signals, and the manual filter time per list is roughly 3-5 hours of an SDR’s week. This skill replaces that 3-5 hours with a 5-minute review of a ranked draft.
vs ZoomInfo SalesOS Intent. SalesOS is mature, has good intent data on enterprise accounts, and is the right answer if you have an enterprise motion and the budget for $35K-$80K per year of seats. For a mid-market motion at a smaller team, this skill plus Clay Pro is roughly 80% of the signal at 5-10% of the cost, with the trade-off that you own the rubric and the exclusion list rather than relying on a vendor’s scoring.
vs Apollo Living Data. Apollo’s lookalike feature is closest in shape to this skill and is one click instead of a 45-minute setup. Apollo’s lookalike scoring is opaque (you cannot see the signal weights or override them) and the outputs tend to over-index on firmographic similarity. This skill makes the rubric and weights inspectable and forces per-signal corroboration; the cost is the setup time and the requirement to keep the reference files current.
vs nothing (status quo, AE builds the list). AE-built lists are comprehensive on the AE’s known accounts and weak on the lookalikes the AE has not heard of. This skill is the opposite — it is bad at named strategic accounts and good at surfacing the next 100 lookalikes. The honest pattern is to run both in parallel: AE owns the named list, the skill produces the lookalike draft.
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: the skill treats any single firmographic source as directional and requires agreement across two independent sources before applying a hard gate. Conflicts surface in the output report (“LinkedIn says 120, BuiltWith says 380 — flagged for manual review”) rather than being silently resolved.
Intent-signal noise. A “hired a VP of Sales” signal scraped from LinkedIn alone misclassifies promotions, contract roles, and 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; uncorroborated claims are scored 0 with the reason recorded for audit.
List poisoning from outdated databases. Some Clay enrichment sources carry zombie companies — acquired, merged, or defunct — that pass filters but cannot buy. Guard: drop any candidate whose website returns a 4xx/5xx on the homepage check, has no LinkedIn activity in the last 90 days, or whose parent-company field resolves to a known acquirer in the exclusion file. The drop count appears in run metadata so the operator can spot a spike (a sign the exclusion file or aggregator source is degrading).
Seed bias. A seed list of 10 wins from one AE in one vertical produces a list that looks like that AE’s territory. Guard: the skill warns if more than 60% of seeds share the same AE, vertical, or close-month, and asks the operator to broaden the seed before continuing.
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 Step 3 returns fewer than 200 candidates, the skill loosens the headcount and revenue bands by one notch and re-runs rather than proceeding with a starved universe.
Stale exclusion file. If the customer list export is two months old, a customer can slip through and end up in outbound. Guard: the skill warns in the output report when last_refreshed in the exclusion file is more than 14 days old.
Stack
Clay (Pro or higher) — enrichment substrate, firmographic filter, and destination table. Pro is the practical floor for the lookalike loop.
Claude (Opus 4.7 for signature extraction, Sonnet for per-candidate scoring) — signature reasoning over the seed why_we_won notes and per-signal corroboration scoring with citations. Splitting the model selection across the two steps is where the cost-quality trade lands best.
CRM (any) — source of the seed list, customer list, opportunity list, and closed-lost list that feeds the exclusion file. The skill does not read the CRM directly; the operator exports CSVs.
Outbound destination (Outreach, Salesloft, Apollo, custom) — wherever the reviewed list goes after AE acceptance. The skill stops at the Clay table by design.
---
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.