ICP fit score
We score every lead on how well it matches who we build for. This is the ICP fit score. “Fit” because it answers exactly one question: does this company match our definition?
The fit score is definitional, not a revenue prediction. A four-person seed-stage startup paying us 150€/month can score high, and a large enterprise paying us a lot can score low. A separate expected-revenue score (planned) will answer “what is this lead likely to be worth?” The two are consumed together as a fit x revenue quadrant and will disagree on purpose for some accounts.
Where it lands
The score is stamped on the Prospect object in our CRM as three fields, written at creation, update, and refreshed whenever the company is re-enriched:
| Field | Values |
|---|---|
| ICP fit status | scored/disqualified/insufficient_data/not_found. Check this first: a score is only current when the status is scored or disqualified |
| ICP fit score | 0–100. Never read a missing score as 0 |
| ICP fit version | The formula version the score was computed under (e.g. v0.1) |
A Prospect with no ICP fit status at all was never evaluated. Some leads are not enriched, so they never get one; that is different from not_found.
How it works
Each prospect is looked up in various data sources by the domain of their work
email or their LinkedIn profile, and the profile is scored in three steps. This
page describes the intent and shape of v0.1. The exact rules, thresholds, and
files live in the prospect_fit_score.py, and every score carries the version
that produced it.
1. Hard disqualifiers: score 0, with reason code:
- Public sector and banking. This keys off company type, not its market tags, so pharmaceutical company selling to public sector hospitals is not caught.
- Prospects that have a personal email address
- Companies that do not use Microsoft 365
2. Insufficient data: no numeric score
A profile that matched but has no firmographics, or no tech stack tags gets
insufficient_data instead of a number. We retry them automatically over the
following months rather than treating “no data yet” as “not ICP”.
3. Weighted components, summing to 100
| Component | Points | What it reads |
|---|---|---|
| Recent account compromise | 35 | Evidence of a recent account compromise or security incident. More recent incidents score highest, with points decaying as the incident gets older |
| Recent 365 migration | 30 | Evidence that the company recently migrated to Microsoft 365. More recent migrations score highest, with points decaying over time |
| Headcount growth | 20 | Recent company headcount change, measured by percentage growth and/or net hires. Growth only scores meaningfully above a minimum employee base to reduce small-company noise |
| Software relevance | 15 | Signals that software is important to the business: engineering/IT headcount, software-product or technology tags, or software-related language in the company description |
Metadata fields (don’t affect the score)
| Flag | Meaning |
|---|---|
low_confidence | Scored from at most one of the four core signals (headcount, traffic, funding, tags). Read this as “unknown”, not “bad” |
agency_flag | Consultancy or agency. Qualifies on its merits, but downstream teams may route differently |
nonprofit_flag | Non-profit |
Known limitations
- Enrichment coverage is weaker for smaller companies in our target markets;
- Generic company domains occasionaly match the wrong company, so spot check before doing outreach;
- Scores are a snapshot;
insufficient_dataandnot_foundsignups are retried automatically over the following months.