Turn the ICP into observable criteria
Industry, size, technology and signals you can actually find in data.

A criterion no field can verify will never reach your list. “Innovative”, “growth-minded” and “takes compliance seriously” are fine in a pitch and useless in a query, so each line of the ICP card needs a field, a source and a rule that returns an answer.
The deliverable is a criteria sheet with one row per criterion. We keep the example from the previous chapter: payroll and scheduling software for French employers with several sites, and invented figures.
Put every ICP line through the script test
Ask whether a script could answer yes, no or unknown from a field available for most accounts. If it can’t, find a proxy. If no proxy holds, the line leaves the list logic and becomes a question for the first sales call.
| ICP line | Observable proxy | Field | Source | Verdict |
|---|---|---|---|---|
| Childcare or care home operator | Declared main activity | NAF code 88.91A or 87.10A |
SIRENE | Filter |
| Several sites | Open establishments per SIREN, 3 or more | Count of active SIRETs | SIRENE establishment file | Filter |
| 20 to 499 employees | Headcount band | trancheEffectifsUniteLegale |
SIRENE | Filter |
| Payroll handled in house | A payroll job ad, recent or open | Job titles | Job boards, LinkedIn | Score |
| Expanding | New establishments in the last 12 months | Establishment creation date | SIRENE | Score |
| Fed up with their current tool | None you can trust | Sales question |
That last row is common. Pain and dissatisfaction rarely leave a data trace. Keep them for the conversation, where they belong.
Know the four families of criteria
| Family | Examples | Typical source | Main weakness |
|---|---|---|---|
| Firmographic | Activity, headcount, age, legal form, location | Registries, LinkedIn | Self-declared or dated |
| Structural | Number of sites, group membership | Registries, maps | Groups often split across several legal entities |
| Technographic | CMS, CRM, payment tool, analytics | Website detection | Sees only what a public page loads |
| Signals | Hiring, funding, new site, new executive | Job boards, news, registries | Expires quickly, covered in the signals chapter |
Firmographic and structural criteria decide who is in the TAM. Signals decide who to contact this month, so they belong in scoring and should never shrink the market itself.
Use registry fields with care
In France, the SIRENE files give you the first criteria almost for free. The NAF nomenclature on the INSEE site lists the codes, and INSEE revises it, so check which version your source uses. Headcount comes as a band code:
| Code | Employees | Code | Employees |
|---|---|---|---|
00 |
0 | 21 |
50 to 99 |
01 |
1 to 2 | 22 |
100 to 199 |
02 |
3 to 5 | 31 |
200 to 249 |
03 |
6 to 9 | 32 |
250 to 499 |
11 |
10 to 19 | 41 |
500 to 999 |
12 |
20 to 49 | NN or empty |
Not provided |
Our filter translates to this:
etatAdministratifUniteLegale = 'A'
AND activitePrincipaleUniteLegale IN ('88.91A', '87.10A')
AND trancheEffectifsUniteLegale IN ('12', '21', '22', '31', '32')
Three traps. A NAF code is the main declared activity, so a group can sit under a holding code such as 70.10Z or 64.20Z while its operating subsidiaries carry the real one. Software companies scatter between codes like 62.01Z and 58.29C with little logic. And the headcount band refers to a given year, shown in anneeEffectifsUniteLegale, which can be several years old. Before fixing your NAF list, count the codes held by your best customers:
SELECT naf_code, COUNT(*) AS best_customers
FROM customer_accounts
WHERE segment IN ('childcare_groups', 'care_home_groups')
GROUP BY naf_code
ORDER BY best_customers DESC;
Codes you hadn’t thought of will appear, and the ones you assumed may turn out to be rare.
Give each criterion a role and three possible answers
A hard filter removes an account, so it needs a field that is nearly always filled. Sparse fields go in the score, where a blank costs points instead of a place in the market.
| Role | Requirement | Effect | Example |
|---|---|---|---|
| Hard filter | Field present for nearly all accounts | Account in or out | Activity, active status |
| Score | Field may be incomplete | Adds points | Stack, hiring |
| Sales question | Not observable | Asked during discovery | Satisfaction with current tool |
Treat a missing value as its own state. In a spreadsheet, each criterion column returns one of three words, and a final column combines them.
=IF(F2="","unknown",IF(F2>=3,"pass","fail"))
=IF(COUNTIF(G2:I2,"fail")>0,"out",IF(COUNTIF(G2:I2,"unknown")>0,"to check","in"))
The “to check” group deserves a sample review. If most of it turns out to be good accounts, loosen the rule.
Back-test on customers you know
Run the rules on your best-fit customers and on accounts you would not want again. A useful criterion lets most of the first group through and stops much of the second.
| Criterion | Best customers passing (of 60) | Poor-fit accounts passing (of 40) | Decision |
|---|---|---|---|
| NAF in list | 54 | 6 | Hard filter, add the missing codes |
| 3+ open sites | 52 | 9 | Hard filter |
| Headcount 20 to 499 | 41 | 14 | Keep, unknown passes to review |
| Hiring in the last 90 days | 27 | 18 | Light score |
| Blog on the website | 22 | 15 | Drop |
The NAF row needs a caveat, because the segments were partly built with that field, so it flatters itself. The six best customers it misses are the ones to read: they show you holding structures and odd codes. Any hard filter losing more than a few of your best accounts is too strict for a market you have not seen yet.
Collect the harder criteria
Technology and hiring take more than a registry. Derrick, which I co-founded, so keep that in mind, covers these from a column of companies.
| Criterion | Feature | Input | Output | Credits |
|---|---|---|---|---|
| Stack of a known company | Website Technologies | Website URL | Detected technologies | 2 per site |
| Companies on a given stack | Find Companies by Tech Stack | Technologies or site type, optional country | Domain, site type, score, country, technologies | 1 per company found |
| Hiring | Company Hiring Signal | LinkedIn company URL | Yes or no, number of open roles, job titles | 1 per company |
| Anything stated on the site | Website Crawler then Ask Claude | URL, then a closed question on the text | Page content, then your classification | 2 per row, each |
Detection only sees what a site exposes, so a payroll tool used behind a login will never show. That rules out most back-office software as a technographic criterion, and our payroll vendor can’t read its competitors’ installed base this way. Any AI classification should be a closed question (“does this site mention several locations: yes, no, unclear”), and you should read a sample of 50 answers before trusting the column.
Without a tool, browser extensions that detect technologies, a look at the page source and a manual pass over job boards work fine at the scale of a back-test.
What the criteria sheet looks like
| Criterion | Role | Field | Source | Rule | If unknown | Back-test |
|---|---|---|---|---|---|---|
| Activity | Filter | activitePrincipaleUniteLegale |
SIRENE | In code list | Review | 54 of 60 |
| Sites | Filter | Open SIRET count | SIRENE | 3 or more | Review | 52 of 60 |
| Headcount | Filter | trancheEffectifsUniteLegale |
SIRENE | Bands 12 to 32 | Review | 41 of 60 |
| Hiring | Score | Open roles | Payroll role open | No points | 27 of 60 |
Your next step: take every line of your ICP card, write its row in this sheet, and run the back-test on your own customers. The source column then tells you what you need to buy or extract, which is what the data sources chapter settles.