A gated, repeatable process for B2B list building: ICP, sourcing, enrichment, verification, catch-alls, suppression, and segmentation.

Kyle Dickson
To build a B2B cold email list that converts, define one narrow ICP, source contacts from several databases, enrich the gaps with waterfall providers, verify every address, split catch-alls into their own segment, and suppress anyone already in the client CRM. Quality gates, not volume, decide results.
Most list-building advice stops at "export from a database." That is the step that ruins campaigns. A raw export is a hypothesis, not a list. Everything that makes it work happens after the download.
B2B list building is the process of assembling a verified set of contacts who match a defined ideal customer profile and can be emailed without damaging sender reputation. It has five jobs: define, source, enrich, verify, and suppress. Skip any one and the other four stop mattering.
At TechGTM Systems, list building is one stage in an eight-step SOP. Each step gates the next, so nothing reaches a campaign unverified. That gating is the whole point. If you want the wider view of how the list connects to offer, infrastructure, and sequencing, start with our breakdown of what a cold email agency actually runs.
A raw export off any database is typically 10-30% junk. Role changes, dead domains, catch-all guesses, syntax errors, and contacts who left the company eighteen months ago. Nobody flags them for you. They sit in the CSV looking exactly like the good records.
Then you load 5,000 of them into a sequencer. The junk bounces. Providers read a spike in hard bounces as list-blasting and throttle placement for the entire sending domain. Your best-fit prospects never see the email, because the dead ones burned the reputation first.
Keep bounce rate under 2%. That number is not a nice-to-have. It is the threshold where inbox providers start treating your domain as a suspect sender, and recovering from that costs weeks of warmup you did not budget for. Your authentication setup protects you from spoofing, not from your own bad data.
"B2B companies" is not an ICP. It is a category. A usable ICP names five things, and each one becomes a filter you can actually apply in a sourcing tool.
That last one carries the most weight. Feeling the pain and having budget authority are different jobs at most companies. Target someone who has both, or build the list so the sequence reaches both and lets them talk internally.
Write the anti-ICP too. List the company types you refuse to email: too small to pay, already served by a competitor you cannot displace, industries where the offer does not apply. Those become exclusion filters at the sourcing stage, which is far cheaper than discovering them at the reply stage.
No single source has full coverage. Anyone claiming otherwise is selling a database. Use several and treat overlap as a confidence signal rather than duplicate waste.
Sales Navigator is usually the freshest on titles because people update their own profiles. Databases lag. When a Navigator title and a database title disagree, trust Navigator and let enrichment resolve the email.
Scrape against signals, not just static filters. A company that posted three sales roles this quarter is a different prospect from one that has not hired since last year. Hiring pages, funding announcements, and tech-stack changes all turn into scrape targets.
Enrichment is where a partial record becomes a sendable one. Run it in Clay with a waterfall of providers: a contact that provider one cannot complete passes to provider two, then three, until something returns a result or the record drops out.
The waterfall matters because single-provider enrichment quietly loses coverage. One tool finds 45% of a segment and you never learn that another would have found a different 30%. Chaining them recovers records you would otherwise have thrown away, and you only pay the next provider when the previous one fails.
Enrich beyond the email address. Pull the data points your sequence will reference: recent funding, headcount change, tools in use, job posting language. Personalization is only as good as the fields behind it, and those fields get built here, not while writing copy.
Verification checks that an address exists on a live mail server before anything is sent to it. Every enriched record goes through it. No exceptions, no "this batch looks fine," no shipping on a deadline with an unverified segment.
Results split three ways: valid, invalid, and catch-all. Invalids get deleted, not parked. Valids go to the campaign. Catch-alls need their own handling.
Verify close to send time. A list verified in March and sent in June has decayed roughly 2% per month through job changes and closures. If a list sits in staging longer than a few weeks, re-run it before launch.
A catch-all domain accepts mail to any address, so a verifier cannot confirm whether a specific inbox exists. Guessing wrong still produces a bounce, it just does not show up until you send.
Split catch-alls into a separate segment and send to them separately, at lower volume, from separate infrastructure where possible. Do not discard them. Plenty of good accounts run catch-all, and dropping the whole bucket cuts real pipeline. You are isolating risk, not avoiding it.
Watch that segment's bounce rate on its own. If it holds under 3%, expand volume. If it spikes, pause it before it drags down the domains carrying your verified sends.
Suppression is the step almost everyone skips, and it is the one that produces the most embarrassing failures. Before launch, run the finished list against the client's CRM and remove anything already in play.
Maintain a global suppression file that persists across every campaign, not a per-campaign one. Unsubscribes are permanent. Re-emailing someone who opted out generates complaints, and complaints hurt more than bounces do.
Lists decay whether you send to them or not. B2B contact data loses roughly 25-30% of its accuracy per year, which means a list built in January is meaningfully worse by summer. Hygiene is a schedule, not a one-time cleanup.
Re-verify any segment older than sixty days before reusing it. Pull hard bounces into the global suppression file the day they happen. Retire contacts who have gone through a full sequence without engaging rather than cycling them again into a new campaign.
Track bounce rate per segment, not just per campaign. An aggregate 1.8% can hide one segment sitting at 6% that is quietly poisoning a sending domain. Segment-level visibility is what lets you cut the bad bucket instead of pausing everything.
A single list of 5,000 gets one generic message. The same 5,000 split into five segments of 1,000 gets five specific ones, and specificity is what earns replies. Segment along the axis that changes what you would say: industry, company size, tech stack, or the trigger event that qualified them.
Keep segments large enough to read results from. Under roughly 200 contacts, a difference in reply rate is noise, not signal. Between 200 and 1,000 per segment is the range where you can test a messaging angle and trust the outcome.
Here is how the stages gate each other:
| Stage | Gate | Fails without it |
|---|---|---|
| ICP | Five filters defined | Wrong people, low replies |
| Sourcing | Multi-source coverage | Thin, biased list |
| Enrichment | Waterfall completed | Unusable partial records |
| Verification | Under 2% bounce | Domain reputation damage |
| Suppression | CRM checked | Collisions and complaints |
Start with 200 to 500 verified, tightly matched contacts per segment. That is enough to read reply-rate signal without wasting sends. A focused list of 500 consistently beats 5,000 loosely targeted records, because the small list lets you write something specific enough to answer.
No. Purchased lists are resold repeatedly, decay before you receive them, and carry spam traps that blacklist your domain. They also arrive unverified and unsegmented. Build your own from live sources, enrich it, and verify it. The cost difference is small next to a burned sending domain.
Yes, with isolation. Put catch-alls in their own segment, send at lower volume, and use separate sending infrastructure where you can. Monitor that segment's bounce rate independently. If it stays under 3%, scale it up. If it spikes, pause it before it affects your verified sends.
Any established verifier that reports catch-all status separately will work. The tool matters less than the rule: verify every record, close to send time, with no exceptions for rushed batches. A verifier that lumps catch-alls in with valids is worse than useless, because it hides your real risk.
Re-verify anything older than sixty days before it goes back into a campaign. Contact data decays around 2% per month. For lists in active rotation, run verification monthly and push hard bounces into your global suppression file immediately rather than at the end of a campaign.
The process is not complicated. It is just gated, and gates are what people skip when a launch date is close. Define the ICP narrowly, source from several places, enrich with a waterfall, verify everything, isolate catch-alls, suppress CRM collisions, and segment before you send.
If you would rather have this run as an assembly line than assemble it yourself, that is what we do at TechGTM Systems. Book a call and we will walk through your ICP and what a clean list for it actually looks like.

The problem with your ads isn't your targeting or budget. It is your creative!
GET MY FREE CREATIVEIf you'd rather talk it through — your channels, your current CAC, where your pipeline is leaking, and what a full paid program with creative and landing pages built in would look like — book a strategy call and we'll map it against your numbers. No obligation, and if we're not the right fit for your ACV or motion, we'll say so.
Book a strategy call