Skip to content
Book a stack review
Writing

Treat your ICP like a predicate, not a vibe

An ICP isn't a paragraph - it's a predicate the pipeline evaluates across firmographics, technographics, triggers, and exclusions. Write the filter.

2 min read
  • #icp
  • #targeting
  • #filtering

Most teams’ ideal customer profile is a paragraph. “We sell to B2B SaaS companies, 20 to 200 employees, Series A to B, with a revenue team.” That’s the definition. It’s written in a doc, cited in a deck, and treated as a filter. It is not a filter. It’s a wish.

A filter has to be something a system can evaluate. It has to resolve to true or false against a record. “B2B SaaS, 20 to 200” is a start, but it doesn’t tell the pipeline what to keep and what to drop, because the companies it describes still include your competitors, your existing customers, the accounts you contacted last quarter, and the companies whose data went stale eight months ago. The paragraph filters almost nothing. So the pipeline enriches all of it, and the team wonders why the credits burn and the reply rates are flat.

An ICP is a predicate. It’s a function that takes a company and a contact and returns a boolean. The predicate has four parts, and most teams only write down one.

The first is firmographics: industry, sub-industry, size, stage, geography. These are the loose filters, the cheap ones, and they should stay loose, because vendor data on them is noisy and the real filtering happens downstream for pennies. The second is technographics: which tools the company already runs. This is the highest-signal layer. A company whose own job postings name Clay, a CRM, a sequencer, and an enrichment vendor has confessed something a firmographic can’t: they bought the ingredients and they don’t have a cook. That combination is worth more than any industry tag a database will sell you.

The third is triggers: what’s happening right now that makes this company worth talking to this month. A hiring signal, a funding round, a new revenue leader. Triggers are time-bound. A high-fit company with no current trigger belongs in nurture, not in this morning’s send pile. Fit and readiness are two different scores, and collapsing them into one is why so many lists feel both huge and useless. The fourth is exclusions: competitors, existing customers, accounts in an active deal, companies you’ve already contacted. The negative space defines the fit as much as the positive criteria do.

Written as a predicate, the ICP becomes something the checkpoint can actually run. The cheap filters apply upstream, the expensive enrichment runs only on survivors, and exclusions suppress before a credit gets spent. A company either passes the predicate or it doesn’t, and the pipeline’s behavior follows from that answer, not from a rep’s interpretation of a paragraph.

The teams whose enrichment spend produces meetings instead of noise aren’t running better tools. They’re running a sharper predicate. The ICP isn’t a marketing artifact. It’s the filter the whole pipeline evaluates against. Write it as one, or accept that you’re enriching on a wish.

Your ICP is the filter your whole pipeline evaluates against. Most teams run it on a vibe. I write the predicate. Worth a 30-minute look at your stack? → Book a call.

Like the cut of this?

I write about GTM infrastructure like an engineer, because I am one.

Book a 30-minute stack review

← Back to all writing