Layer Firmographic Filters
Outcome: the account universe cut to addressable accounts, with each filter’s removal rate recorded and every disqualified row retained rather than deleted.
- Surface
- App and MCP server
- Level
- Intermediate
- Uses
- enrich_organization · formula columns
- Credits
- ~0.5 per company for enrichment
- Prerequisite
- Lesson 03's sourced universe
Enrich once, filter many times
Take the full firmographic bundle in one enrich_organization call rather than as separate columns. Same data, one lookup, one charge — and every filter after it is a free formula.
That is the shape of this lesson: one paid step, then a series of free cuts.
Reliability, and what it means for filtering
| Field | Reliability | How to filter on it |
|---|---|---|
| Country | High | Hard filter |
| Founded date | High | Hard filter, with a rule for blanks |
| Headcount | Good, but a floor | Band filter, never an exact threshold |
| Industry | Medium — heuristic classification | Soft: use to score, not to exclude |
| Revenue | Low for private companies | Score input at best. Never a hard filter. |
| Funding | High when present; absence is ambiguous | Positive filter only |
Two rules follow, and they matter more than any individual value:
- Hard-filter only on reliable fields. Excluding on a modelled revenue estimate removes real accounts on the strength of a guess.
- Absence is not a value. “No funding recorded” means unfunded or unreported, and treating it as “unfunded” quietly deletes bootstrapped companies that may be your best segment.
A hard filter on headcount thresholds is the most common quiet error here. Headcount is usually derived from professional-network presence, so it undercounts in markets and industries where that presence is thin — a filter of “over 50 employees” can remove a 200-person manufacturer entirely. Band, do not threshold.
Filter order
Cheapest and most decisive first.
Free exclusions first
Suppression list, competitors, partners, existing customers, unsupported regions. Costs nothing, and removes rows that should never have been in the universe.
Then geography
Usually the largest single cut, and the most reliable field you have.
Then size band
The second largest cut. Band, with a documented rule for missing values.
Then everything else
Founded date, funding, industry — as soft filters or score inputs rather than hard cuts.
Record the removal rate at each step. The sequence of numbers is your record of what the definition actually does, and it is what you check when the market size changes next quarter.
Missing values need an explicit rule
For every filter, decide what happens when the field is blank, and write it in the filter itself.
| Field blank | Sensible default | Why |
|---|---|---|
| Country | Keep, flag for review | Often a data gap, not a foreign company |
| Headcount | Keep, flag | Common in smaller and non-English markets |
| Founded date | Keep | Rarely load-bearing |
| Industry | Keep | Classification gaps are frequent |
| Domain | Drop | Cannot be enriched or deduped — genuinely unusable |
The pattern: keep and flag, do not silently drop. A blank field is a data problem, and dropping on it systematically removes exactly the segments where coverage is thinnest.
Keep the disqualified rows
Filtering is a status column, not a delete.
qualified = passes all hard filters
disqualified_for = the first filter it failedThree reasons this matters:
- Re-qualification. A company that grows into your size band next quarter is already in the table, already enriched — it just crosses the line.
- Diagnosis. When the addressable count drops,
disqualified_fortells you which filter changed. - Cost. Re-sourcing a deleted company means paying for it again.
Do this now
Enrich the universe once
The full bundle, on every sourced row.
Apply the free exclusions
Suppression, customers, competitors. Record the removal rate.
Apply geography, then size band
Recording removal at each step.
Write the missing-value rule per filter
Into the filter itself, not into a note.
Build the status columns
qualified and disqualified_for.
Compare the survivor count to lesson 02’s addressable estimate
A large gap means an assumption was wrong. Find which filter.
Read 20 disqualified rows
If any obviously should have qualified, the filter is wrong, not the data.
Check your work
- One enrichment call, many free filters
- No hard filter runs on modelled revenue
- Every filter has a written missing-value rule
- Disqualified rows are retained with a reason
- Survivor count is close to your addressable estimate
Where this breaks
Deleting disqualified rows makes every future run more expensive and destroys your ability to explain a change in market size. Six months later the addressable count has moved, nobody can say why, and re-creating the comparison means re-sourcing and re-enriching the whole universe. Filter with a status column. Never with a delete.
Further automation
The disqualified_for column becomes a monitoring surface: counts per reason, tracked run over run. A rising “too small” count means your sourcing drifted toward SMB; a rising “no domain” count means a data-quality problem at intake. Both are worth catching early.
Next lesson
05 — Tech-stack and traffic fit, the qualification layer that a directory filter cannot express.
Reference for this lesson: enrich_organization, Company, Company total employees, Company revenue.