From ICP to sendable records: one exact filter spec, the right source class, enrichment, verification, and the quality checks that stop you paying for junk.
By Joel Wylie, Founder · Last updated 7 August 2026
To build a B2B lead list: define the ICP from customers you actually win, write it down as one exact filter spec, pull contacts from the source class that matches your signal, enrich every row to a name, a company, and a verified email, then MX-check every domain before anything uploads. A full cold email programme wants a starting pool of roughly 50,000 contacts, so size the market honestly before you commit to a targeting spec that cannot feed it.
We build lead lists for client campaigns every week, and the pattern in bad lists is always the same: a vague persona instead of exact filters, a source picked by habit instead of by signal, and no quality gate between the export and the send button. This is the exact process we run instead.
Seven steps, each with a quality gate that must pass before the next one starts. Every gate exists because we have watched a list fail without it.
| Step | Action | Quality gate |
|---|---|---|
| 1. Define the ICP | Derive it from the customers you have won and enjoy serving | Every filter traces to a real customer pattern, not an aspiration |
| 2. Size the pool | Count the market against your monthly send volume | Roughly 50,000 contacts with headroom for a full programme |
| 3. Write the filter spec | One list, one spec: exact titles, seniority, industries, size band, geography | No prose. Every filter is a concrete value you could type into a database |
| 4. Source the contacts | Pick the source class that matches the signal you are buying | Back pages of the preview are still on-ICP before you pay to export |
| 5. Enrich to sendable | Every row gets a name, a company, and a verified email | Rows that will not enrich get cut, not sent on hope |
| 6. Verify and MX-check | Verify everything not verified at source; MX-check every domain | Zero known-invalid addresses, zero strict-gateway domains in the send set |
| 7. Temperature-check | Sample the built list and, post-launch, mine the negative replies | Sampled rows match the intended titles and companies |
Start from evidence, not aspiration. Your ICP is the pattern in the clients you have won, kept, and enjoyed serving, because cold email is a proof-driven channel: your best copy leans on results for companies like the one reading it. The full process for getting this right, including when targeting is and is not the problem, is in our guide to ICP targeting for cold outreach.
Then size the pool honestly before you commit. A full volume programme sends around 50,000 emails per month, which means the targeting needs to produce roughly 50,000 contacts as a starting pool, with headroom, because lists decay, bounce, and get recycled. Interested replies arrive at roughly one per 500 to 1,000 sends on a good campaign, so a beautiful ICP of a few hundred companies is not a channel, it is a coin flip. Do this arithmetic first; it decides everything downstream.
One list, one filter spec, and every filter is an exact value. A real job-title list, a seniority level, named industries, an employee size band like 50 to 1,000, and a concrete geography. "Expansion-stage companies with modern ops teams" is a mood, not a filter. If you cannot type the spec straight into a lead database, you have not written it yet.
Resist the urge to manufacture personas. A separate filter set per persona is only justified when you will say a materially different thing to each one. If three "personas" would receive the same message, they are one list, and splitting them just costs you volume and analytical clarity.
Two lessons from doing this weekly. First, raise the employee floor: a list that starts at one employee drags in sole traders and micro-shops, and starting at eleven sharpens almost every B2B list. Second, when the ICP is leaders only, heads of function and above, fix thin volume by raising the company size ceiling, not by lowering the seniority bar. At small companies the titled leader barely exists, because one person does everything without the title.
There is no single best B2B lead database. There are four source classes, and the right one depends on which signal you are buying. Most real lists combine two or more.
These are the workhorses: searchable databases of contacts filtered by title, seniority, industry, size, and geography. Tools like Apollo.io, AI Ark, and LinkedIn Sales Navigator turn a filter spec into a raw pool, and lookalike engines like Ocean.io and DiscoLike build the market outward from your best existing customers instead of from stacked firmographic filters, the approach in the lookalikes playbook. Use this class when the ICP is defined by who the person is.
Technographic tools like Sumble and TheirStack reveal which companies run which tools. If your offer integrates with, replaces, or extends a specific system, this is the cleanest fit signal available, and it lets every email open with a specific claim about the prospect's world. The full play is in the technographic targeting playbook.
Tools like Trigify, Jungler, and PhantomBuster capture the people actively engaging on LinkedIn: your competitor's followers, commenters on industry keywords, the audience of the right thought leaders. This class trades scale for warmth: smaller lists, but every contact has recently demonstrated interest in your problem space, and the outreach can reference it.
The cheapest source of all is the export nobody runs: your own CRM. Old opportunities, ghosted replies, closed-lost deals, past trial users. These contacts already know who you are and the data costs nothing. Treat the export like any other raw source though: it decays, so it goes through the same enrichment and verification as a scraped list.
A sendable record is three fields: a correctly cased name, a company, and a verified email. Everything else is decoration. Raw exports rarely arrive complete, so enrichment is the step that fills the gaps, typically through a waterfall that tries multiple providers per contact until one returns a valid address.
The rule that keeps this honest: rows that will not enrich get cut, not sent on hope. A contact with no findable email is not a lead, and a guessed address is a future bounce. Expect to lose a slice of the raw pool here; that loss is why the pool wants headroom above the send target.
Two different checks, and you need both, because they answer different questions.
First, email verification: is this address real? Verify everything that was not verified at source, every time. Scraped lists, CRM exports, and client-supplied CSVs all decay, and stale validity flags from a previous pass do not count. A list verified at source by the data provider is the one exception that saves money. The full process, including catch-all domains and what verifiers cannot see, is in our email list verification guide.
Second, the MX check: will this domain's gateway accept our mail at all? When the server receiving a domain's mail is a strict corporate gateway like Mimecast or Barracuda, cold mail from a new sending domain gets rejected on policy regardless of address validity. In one campaign we analysed, those protected domains were 7% of the list but 77% of all bounces. No verifier catches this, so we look up the MX record for every unique domain, never a sample, and drop the protected ones before anything uploads. This check applies to every source, including lists that were verified at source.
Widen deliberately, cheapest trade first. When the honest count comes back short of the target, there is a ladder, ordered from least to most quality risk. Loosen the company size band first. Add adjacent geographies second. Add adjacent industries third, or flip from an include-list to an exclude-list so you stop filtering industry so hard. Broadening titles from exact matches to seniority plus function is the last resort, because title precision is usually what keeps a list clean.
Take one rung at a time and re-count after each. The goal is the tightest spec that still clears the volume target. A list that ballooned to hit a number is just a noisy list with better paperwork.
Judge the list by its worst rows, not its best. Lead database previews are not randomly ordered: the strongest matches sit on page one and the weakest sit at the back, so page one always looks good. Before paying to export anything, open the last few pages of the preview. If the back pages are full of off-ICP titles and wrong-size companies, the filter is too loose, and you tighten before you spend. If the back pages are still clean, the count is real.
We learned to distrust big raw numbers the hard way. A list we inherited claimed 35,000 in-market records. A sample told a different story: roughly a fifth of it was outside the target geography, another large slice carried competitor keywords in the domain, and the top domains by frequency were industry associations and trade press, not buyers. The usable core was a fraction of the headline number. Sample before you scrub; a big raw list is not a big usable list.
The last gate runs after launch: the temperature check. Sample the leads the campaign has actually sent to and confirm they match the intended titles and companies, then read the non-interested replies for wrong-person patterns. Replies like "not my department" mean the list is cold and the offer never got a fair test. Offer objections from the right people mean the list is fine, and the problem lives upstream.
A full cold email programme wants a starting pool of roughly 50,000 contacts, with headroom, because lists decay, bounce, and get recycled. Interested replies arrive at roughly one per 500 to 1,000 sends, so a small perfect list cannot sustain the arithmetic of a volume channel.
It depends on the signal you are buying. People-search databases give you titles at scale, technographic sources reveal what tools a company runs, engagement scraping captures active intent, and your own CRM export is the cheapest source of all for reactivation. Most real lists combine two or more.
Verify everything that was not verified at source, every time. Scraped lists, CRM exports, and client-supplied CSVs decay fast, and stale validity flags do not count. Then MX-check every domain regardless of source, because strict corporate gateways reject cold mail even when the address is valid.
A lookup of which mail server receives each domain's email. Domains behind strict corporate gateways like Mimecast reject cold mail from new sending domains on policy, even when the address is perfectly valid. We drop those domains at list build; no verifier catches them.
Widen deliberately, cheapest trade first: loosen the company size band, then add adjacent geographies, then adjacent industries. Each rung trades a little precision for volume. Re-count after each step and stop at the first rung that clears your volume target.
Judge the list by its worst rows, not its best. In any list-building tool, the back pages of a preview hold the weakest matches, so read the last few pages before paying to export. After launch, sample the leads actually sent to and mine negative replies for wrong-person patterns.
Want outbound like this run for you, end to end?
Book A Call
Start from the clients you actually win, check the maths on list size before you commit, and segment only on signals that change what the email says.

Verification is not optional for scraped or built lists. Here is exactly when to verify, what verifiers can and cannot catch, and how not to overpay for it.

A four-stage roadmap for founder-led sales: validate the offer, scale the winner, build the conversion layer, then decide build vs buy.