| name | enrichment |
| description | Step 5 of the ICP playbook. Enriches the company list with firmographics, technographics, hiring patterns, funding, and growth signals, then finds the multi-attribute combinations that recur within each persona. Routes to Clay if available, otherwise Apollo, ZoomInfo, Cognism, Crustdata, Ocean, or Harmonic. Use after persona clustering and trigger tagging. |
Step 5 — Enrich and find attribute combinations
The article's central claim about this step: single filters don't tell you much. Combinations are the signal.
Routing
Read ./icp-output/stack.json. Branch on stack.enrichment.tool:
clay → load clay.md
- anything else → load
fallbacks.md and pick the matching adapter
Unlike the call-intel step, no warning is needed when Clay is absent. The article recommends Clay but the kit treats every alternative as first-class as long as the user can supply API access or a connector.
What to enrich
For each named account that appears in ./icp-output/calls/ or ./icp-output/personas/:
- Industry (use both NAICS/SIC and a softer self-described industry — they often disagree)
- Headcount + 6-month / 12-month growth
- Stage + last funding round + amount + investors
- Geography (HQ + presence)
- Tech stack — CRM, sequencer, data warehouse, RevOps tooling, AI tools, sales enablement
- Hiring patterns — open roles by function, hiring spikes
- Recent exec changes — new C-level, new VP Sales/RevOps, new CMO
- Public signals — recent news, M&A, product launches
- Buyer-intent if available — visit/page-level signals from your enrichment provider
Save raw enrichment results to ./icp-output/enrichment/companies.csv (or .json). One row per company.
Find the combinations (the central deliverable)
For each persona, look at the 5–20 enriched accounts that map to it. Compute:
- Which 2–4 attribute combinations appear in ≥60% of accounts for that persona but in <25% of accounts outside that persona?
- Specifically test combinations like:
- title × seniority × headcount
- tech_stack × industry × funding_stage
- hiring_signal × growth_rate × geography
Output
Write ./icp-output/enrichment/company-attributes.md:
# Per-persona attribute combinations
## <Persona name>
### Runnable filter (combinations)
- **Title:** "RevOps", "Revenue Operations", "Sales Operations", "Sales Ops", "GTM Operations"
- **Title exclude:** "Analyst", "Associate", "Coordinator", "Intern"
- **Seniority:** Director, VP, Head of, Senior Manager
- **Headcount:** 201–2,000
- **Industry:** SaaS, Software Development, IT Services, Cloud Computing
- **CRM:** Salesforce or HubSpot
- **Growth signals:** Headcount growth >15%, recent Series B/C/D, new CRO hire in last 6 months
- **Geography:** US primary, UK/EMEA secondary
### Why this combination
Recurs in <X>% of evidenced accounts in this persona, <Y>% in others. Pulled from <N> accounts.
### Single-filter false friends (do not use these alone)
- "RevOps" alone returns <bigger noisy set>
- "Series B+" alone returns <bigger noisy set>
### Sample evidenced accounts
- <Account> — slug, <call-id>, fit-score
- ...
Repeat per persona.
Failure modes
- A filter that includes only one industry but the actual buyer set crosses two — under-fit.
- A filter so broad it returns 50,000 accounts in Clay/Apollo — over-fit on intent, under-fit on combinations. Tighten.
- A filter that loses 80% of evidenced accounts when run — you optimized for breadth over recall. Widen, then re-tighten on a different axis.
Aim for filters that, when run, return 500–5,000 target accounts per pocket. That's a workable list for outbound.
State update
{
"step": "5",
"step_status": "completed",
"personas_with_filters": <count>,
"enrichment_coverage": <pct of accounts enriched>
}