Recipe: ICP Lead Qualification
This recipe filters a pile of leads down to the ones worth pursuing. You define an icp — an Ideal Customer Profile of declarative match rules — store your leads as contacts linked to organizations, and let a sales-board match them against the profile and open a pursuit for each one that fits.
The problem it solves
Lead lists are mostly noise. Qualifying them by hand is slow and inconsistent, and the rules (“companies in these industries, this size, in these regions, showing these signals”) live in someone’s head instead of anywhere you can audit or reuse. This recipe makes the profile a real element and the matching a real operation, so qualification is repeatable and the bar is written down.
Elements
| Element | Role |
|---|---|
icp | Declarative Ideal Customer Profile — the match rules leads are filtered against. |
contacts | The people you’re qualifying, with rich identity and consent fields. |
organizations | The companies your contacts belong to — the firmographics the ICP scores. |
sales-board | Pursuit pipeline; runs the match and opens a pursuit per qualifying lead. |
Flow
- Create an
icp. It is a pure config element — a declarative rule set (industries, regions, employee/revenue bands, required signals, target roles, excluded keywords, amin_score). It has no operations of its own; you inspect its rules with the generic element GET, and a consumer reads them by reference. - Build your lead store. Create
organizationsrecords withupsert(deduplicate on a stable key withfind_by_domainorfind_by_org_no), andcontactsrecords withupsert, attaching each person to their employer withlink_organization. - Create a
sales-board— a pursuit-based pipeline where each card is a long-lived sales case. - Qualify the list with the sales-board’s
ingest-icp-matchesoperation. Point it at your ICP (byicp_idoricp_slug) and your leads; it reads the ICP’s rule set, walks the leads, scores each against the rules, and opens a pursuit for every match abovemin_score. (If the circle has more than one ICP and you omit the id/slug, it returnsSALES_ICP_AMBIGUOUS— name the one you mean.) - Work the qualified pursuits on the board; the unqualified leads simply never become pursuits.
What this shows
A modifier like ICP is policy as data — it carries no behavior, just rules, and the behavior lives on the consumer that reads it (sales-board/ingest-icp-matches). That separation is the point: you can tune the qualification bar without touching the pipeline, and the same ICP can be read by anything that wants to filter against it. The lead data, meanwhile, is real contacts and organizations with proper identity and org links, so the firmographics the ICP scores are anchored to deduplicated records rather than raw spreadsheet rows.