The path from about 1,200 companies to 59 accounts
The task was ordinary. Take a list of companies, score it for fit, match it against the contacts in our CRM, and hand a rep something to work.
Every step looked like progress, and the number got smaller at each one.
| Step | What came out |
|---|---|
| The starting list | about 1,200 companies |
| After ICP scoring | 229 companies |
| Contact matching against those | 177 contacts, across 86 of the 229 |
| After a lead status check | 135 contacts in 70 companies |
| After validating against our own CRM filters | 59 accounts, carrying 107 contacts |
The lead status step surprised me, because I had assumed all 86 companies would be untouched. 16 of them already carried a status that ruled them out, which took 42 contacts with them.
The last step needs a warning. An undocumented extra condition inside one of our filters, requiring that the company owner be unknown, accounted for a drop I could not explain at first. A filter carrying a condition nobody wrote down produces a number nobody can reconcile.
The 107 contacts break down as 60 founder, 23 marketing, 18 operations and six ecommerce, one persona per contact, which is also the check that the file is complete.
143 of the 229 had nobody on the record
86 of the 229 companies had a contact. The other 143 had nobody.
143 of 229 companies that scored as a fit had nobody on the record. No name, no address, nothing to write to.
The scoring was not the bottleneck. There was simply nobody to contact.
From six months inside a B2B GTM organization with 36,000 accounts in its CRM.
The chain above looks like a filter destroying a pipeline. What it actually shows is the state of the contact data, arriving all at once at the end of an afternoon. 143 of the 229 were a company somebody still had to find a person at, before they were anything a rep could work.
Why it never showed up in a report
A report counts records. An account with no contact on it produces no contact rows, so it cannot appear in any view built on contacts.
That is the whole mechanism. Coverage reporting reads activity, activity hangs off contacts, and an account with nobody on it is invisible to all of it. It scores well, it sits in the target list, it gets counted in the plan, and no report says that nothing can happen on it.
The consequence lands on capacity planning. If we plan a quarter against 229 accounts and 143 of them need somebody found first, the plan rests on capacity that does not exist, and the gap shows up later as reps missing activity targets.
Three things that would have broken the list quietly
Each of these produces a plausible wrong list rather than an error.
An exact domain match marked two companies as missing from our CRM. Both were in there, one under a www prefix and one without a subdomain. Normalising the domain before matching is the fix, and without it the miss looks like a gap in the data.
One filter condition had a fixed date written into it. It worked on the day it was built and would have returned nothing the next morning. Nothing in the tool says so.
Two companies existed as two separate company objects each, with two of the filter fields sitting on different objects, so an AND filter dropped both companies. The cause was an import creating new records instead of merging, and the effect is a company that passes every criterion and appears nowhere.
What to do instead
- Read a fit score and a contact count together, or read neither. An account that scores well and carries nobody is research, and calling it a lead is how a quarter gets planned against capacity that is not there.
- Export the accounts with no contact as their own list. They are the most useful output of the exercise, and they need a different process than the ones with contacts.
- Normalise domains before matching anything. A www prefix is enough to make a company that exists look like one that does not.
- Check every filter condition for a fixed date, and for conditions nobody documented. Both are correct on the day they are built and wrong afterwards, and neither warns you.
- Check for duplicate objects when an AND filter returns less than it should. Two records for one company means no single record carries all the fields.
Before buying contact data to close that gap, the number worth measuring first is what share of enriched contacts are actually decision makers. And the execution side of the same problem is the mirror image: heavily worked accounts carrying decision makers nobody had contacted.