Someone hands me a spreadsheet. Four thousand rows, company names, a column of emails, and a note saying it was pulled last month. Almost every engagement starts here, and the lists that arrive with a new client are almost never the lists we end up sending to.
Building one properly runs in a fixed order, and the order is the method: decide which companies qualify, decide which job titles you will accept, source the names from data providers rather than scraping them, strip out everyone who cannot act, verify every address, then cut the whole thing into segments small enough to write to. Skip a step and you pay for it later, in bounces, in silence, or in six weeks spent rewriting a message that was never at fault.
Here is each step, and what goes wrong inside it.
Decide what makes a company qualify, in writing
Before any tool opens, you need a filter you could hand to somebody else and get the same list back.
A filter is not a description of your favourite customer. It is a set of conditions a company either meets or does not: industry, size band, country, and something observable that says they have the problem you solve right now. Hiring for a role that implies the problem. Running a technology that implies it. Selling into a market where it is unavoidable.
The fastest way to build that filter is to stop guessing and look backwards. Take the clients you already have, find what the good ones share, and write that down as conditions. That is also where your title list comes from, because the person who signed the last three contracts is the person to look for at the next three hundred companies.
If you are choosing between two or three possible markets rather than filtering inside one, that decision comes first, and it deserves its own arithmetic. And if your team uses the two words interchangeably, settle the difference between an ICP and a buyer persona first: one filters companies, the other describes a human being.
Write the titles down before you open a tool
Titles are where most lists quietly go wrong, because the search box makes it so easy to be vague.
Use the real decision-maker titles for that market, the specific ones. In IT and software that means VP of IT Strategy, CTO, Head of IT, Director of IT, VP Global IT Operations. In another vertical it is a completely different set of words for what is functionally the same person. Get them from the deals you have already closed, not from a template.
Then exclude on sight: Assistant, Manager, Associate. Those three words drag in thousands of people who cannot start a project, cannot sign anything, and in most companies cannot even get you a meeting with the person who can. Every Assistant left in the file costs you a send, a verification credit, and a small piece of your sender reputation if the address is stale.
Source from providers, not from a scrape
This is the step people try to skip, and it is the one the whole file stands on. A list pulled from real data providers beats a scraped list, every time.
We build from a combination of Sales Navigator, Apollo, UpLead, ZoomInfo and RocketReach, depending on the market. The reason is coverage and freshness rather than brand loyalty. Any single provider only sees part of the world, so one source is never enough. Whether you need a full stacked setup is a different question, and for most small senders the honest answer is no, and that is what the waterfall enrichment pitch usually leaves out.
A cheap file bought from a freelancer fails the same way every time: low open rates, high bounces, and no way to tell which half of the file was invented. Scraped lists fail slightly differently. They are often accurate on the day they were scraped and quietly rotten three months later.
There is a legal dimension to all of this too, and it is less dramatic than the internet suggests, but it is worth checking where B2B data collection stands in your market before you scale anything.
Strip out everyone who cannot act
With names in the file, take things out. Generic titles, as above. Companies already in your CRM. Companies a colleague is already working, which is why territory gets split per person before sending starts rather than after two reps email the same prospect in the same week.
Competitors come out. Companies you have lost badly in the last year come out for now. Anyone who asked not to be contacted comes out permanently and stays on a suppression list forever.
A list that shrinks at this stage is doing what it should. Relevance is the whole asset: buyers remember who sent them something that had nothing to do with them, and every wrong row in your file is a small contribution to that reputation.
Verify every address before anything is sent
Every address gets checked, with NeverBounce, DeBounce or an equivalent, before the first send. Not a sample. All of them.
This is cheap and it is not optional. Unverified lists burn sender reputation faster than bad copy ever could, and the damage lands on your domain rather than on the list. The full pre-send pass, including what to check beyond addresses, is a separate job from building the list.
Make it big enough, then send it small
Two things that sound contradictory are both true.
The list has to be big. A first list of around twenty thousand contacts is the working floor for a full B2B campaign, because you are running a numbers exercise on top of a quality one. A large share of any correct list is mid-contract, on holiday, or three months from caring, and their silence is a fact about their calendar rather than about you.
And it has to be sent in small pieces. Smaller, tightly targeted sends consistently outperform high-volume blasts, and the mechanism behind the gap is not mysterious. A message written for fifty similar companies can say something specific. A message written for four thousand mixed ones cannot.
So build one large, tightly filtered list, then cut it into segments where every company in the segment has the same problem in the same words. The volume comes from running many small segments, not from writing one email for everybody.
The list is the slow part, and it stays the slow part
My team puts more hours into lists than into anything else we build for a client, and it is the least interesting work in the whole job. It is also the work that decides the outcome before a single word of the email exists, which is an argument that already has its own post and does not need re-running here.
If you want a fast read on where your current file stands, sort it by job title and count how many rows contain the word Manager. That number tells you most of what you need to know about the campaign it is about to feed.
