How to build a B2B prospect list: a working artifact, not a one-shot deliverable
Most prospect lists in B2B are built once, exported to CSV, loaded into a sequencing tool, and slowly degrade over the next six months as people change jobs, companies dissolve, and the original ICP drifts. The lists that compound in value over time are the ones treated as living artifacts — owned by someone, refreshed on a known cadence, and tagged in a way that makes the next quarter's work cheaper than the last.
This is a guide to building that kind of list. It is structured around the three things that determine whether a list will still be useful in a year: architecture (how the data is shaped), signals (firmographic plus behavioural), and hygiene (dedup, enrichment cadence, tagging). The worked example at the end is a 500-account list for a logistics-tech vendor across DACH.
Free 1-day trialThe architecture: accounts, then personas, then contacts
A flat list of contacts is the wrong shape. It conflates two things that need to be tracked separately: the account, which is the company you are selling into, and the contacts, which are the individual humans inside it. The architecture that scales looks like this:
The reason this matters is that personas outlast contacts. The Head of Operations at a mid-market manufacturer might be Anna Schmidt today and Markus Weber in eighteen months — but the persona slot is stable, the buyer profile is stable, and the message you send to that slot is stable. When the human changes, the new human inherits the account's history, not a blank record. That is a non-trivial advantage when sequences run across multi-quarter cycles.
For account-based programmes the same architecture is the spine: target the account first, identify the three to five personas that need to be touched, then attach the named contact to each persona. A mid-market deal touches three to five people, and the list must hold that shape natively.
The two layers of targeting: firmographic and behavioural
Firmographic targeting describes who they are in steady state. It is the slow-moving filter — industry code, country, region, headcount, turnover, legal form. A firmographic universe is defined once per quarter and rarely needs to change. The variables that matter:
- Industry code using whatever the source register publishes — NACE, SIC 2007, NAICS, WZ 2008. Codes are filterable, free-text industry strings are not.
- Country and region. Country alone is too coarse for any country larger than the Benelux. In Germany, Bundesland matters. In France, region matters. In the US and Canada, state and province matter.
- Size band — taken from filed accounts where possible, with employee headcount as a secondary signal. LinkedIn-reported headcount is the least reliable source available; it disagrees with filed accounts roughly 30% of the time in the SMB band.
- Legal form. A Ltd in the UK, a GmbH in Germany, an SAS in France and a sole trader each carry different sales motion implications.
Behavioural targeting describes what they have done recently. It is the fast-moving filter, and it carries a time decay. The signals that produce reliable lift in conversion:
- Hiring signals. An open job for a role adjacent to your buyer is the strongest single behavioural signal in B2B. A company hiring a "Head of Procurement" is, by definition, in the market for procurement-adjacent tools. The signal is hot for about two weeks after the posting, lukewarm for six, irrelevant after twelve.
- Funding events. New equity rounds and debt facilities create budget. Crunchbase and the national company registers both surface this, though with different lag profiles.
- Tech-stack changes. BuiltWith and Wappalyzer-style scanners detect new technologies added to a company's web stack. A new analytics tool, a new e-commerce platform, a new ticketing system — each implies an adjacent buyer.
- Leadership changes. New executives in their first 100 days are statistically more receptive to outreach than 10-year incumbents. The trigger is publicly visible via LinkedIn, the national register (in the UK and DE, director appointments are filed), and sometimes the company's own press releases.
- Regulatory and filing events. New patent filings, new clinical-trial registrations, new licence applications. These are sector-specific behavioural signals — often weak on average, very strong when they hit.
The discipline is to define the firmographic universe first (the field), then layer behavioural signals on top to identify which slice to work this month (the weather). A list that uses only behavioural signals will surface fast-moving companies that are not your buyers. A list that uses only firmographic signals will surface companies that fit your ICP but are not currently in the market.
Dedup logic: the unglamorous discipline that compounds
Multi-source enrichment produces duplicates by definition. The same German GmbH appears in the Handelsregister, the Bundesanzeiger, possibly in Apollo, and on its own website. If your list architecture does not enforce dedup, the same account ends up sequenced three times in parallel from three different list entries, which is the fastest way to burn deliverability and reputation.
The dedup hierarchy that works:
- Primary key: national company identifier. Companies House number, Handelsregister number (HRA/HRB plus court), KvK number, SIREN, CVR. Where this is available, it is canonical and a string match is conclusive.
- Secondary key: registered office address, normalised. Same postcode plus similar street string is high-confidence duplicate. Address normalisation needs to strip "Strasse" vs "Str.", "Avenue" vs "Ave", numeric ranges vs single numbers.
- Tertiary key: domain. Companies typically have one operating domain. Two records sharing a domain are usually the same account, with rare exceptions for holding-company structures.
- Never as a sole key: company name string. Legal-form suffixes vary ("Ltd" vs "Limited"), trading names diverge from registered names, and abbreviations are not stable. Name strings are a useful tiebreaker; never a primary match key.
A list with no dedup logic will degrade faster than a list with no enrichment. Dedup is the cheapest hygiene investment with the largest downstream return.
The 90-day refresh cadence
B2B contact data decays. The rate is well-documented: roughly 25-30% per year for named-individual data — people move companies, change titles, take parental leave, retire — and roughly 5-8% per year for firm-level data, as companies merge, dissolve, or restructure. A list that is two years old will have half its names broken in some way.
The cadence that keeps a list useful:
- Every 90 days — re-pull the registry data for the account universe. Director changes, accounts filings, dissolutions and new entries.
- Every 90 days — re-read the team page and contact page on the company website to catch named-contact rotations.
- Every 30 days — refresh hiring signals from the country-specific job boards.
- On every send — re-verify the email via email before the actual sequence starts.
Most tools cannot do this at 90-day cadence economically — the cost-per-contact in paid databases makes a full re-pull prohibitive. The discipline only becomes affordable when the source is free or near-free, which is most of the national registers.
Tagging structure: the schema that keeps the list legible
Without a tagging structure, a prospect list devolves into a notebook within a quarter. The columns that earn their place:
The state of the account in your funnel.
target | engaged | opportunity | customer | lost | dncThe state of the individual.
untouched | sequenced | replied | meeting_booked | disqualifiedHow strongly the account matches the ICP given current signals.
high | medium | nurtureThe behavioural trigger that surfaced this account, plus when. Both columns, separately.
hiring_ops | funding_series_b | new_cfo | stack_change | regulatory_filingWhere the contact details came from, and when last verified.
registry | web_data | linkedin | purchased | referralWhen you last sent something, and when the next touch should happen.
2026-05-12 | 2026-05-19The minimum useful schema is roughly 12 columns per contact, with account-level columns held separately. Larger schemas drift into noise; smaller schemas lose track of which signal originally caused the outreach, which is the field you most often need three months later.
// Worked example: 500-account list for a logistics-tech vendor across DACH
A logistics-tech vendor (transport management software, ACV €30-80k) targets the DACH region. The seller is one founder plus a part-time SDR. The list target: 500 active accounts, refreshed quarterly, with named contacts for two personas per account — operations leadership and IT leadership.
// Firmographic filter
Industry codes WZ 49.4 (freight transport by road) and WZ 52.29 (other transportation support activities) in Germany; the equivalent NACE codes in Austria and Switzerland. Headcount band 50-500, drawn from the latest Bundesanzeiger or Firmenbuch filing. Region: all of DE, AT, and German-speaking cantons of CH for the German-language sequence.
// Behavioural overlay
Three triggers, weighted: (1) open vacancy for "Disponent", "Spediteur", "Leiter Logistik" or "IT-Leiter" in the last 60 days; (2) new managing-director registration in the last 12 months; (3) press mention of fleet expansion, new depot or new geography in the last 90 days.
// Persona definition per account
Two personas. Persona A: Operations leadership — Geschäftsführer Logistik, Leiter Disposition, Head of Operations. Persona B: IT/digitalisation leadership — Leiter IT, Head of Digital Transformation, CIO/CDO where present. The seller's research is that Persona A blocks deals on operational risk, Persona B blocks on integration; you have to address both.
// Column shape
| Column group | Fields |
|---|---|
| Account | company, hr_number, country, region, headcount_band, turnover_band, conviction_band, account_status |
| Persona | persona_slot (A or B), persona_title_canonical |
| Contact | name, title_current, email, email_verified_at, phone, linkedin_url, source, contact_status |
| Signal | latest_signal_type, latest_signal_date, signal_decay_score |
| Touch | last_touched, next_action_due, sequence_id, total_touches |
// Maintenance rhythm
Every Monday, the SDR runs a 15-minute hygiene pass: contacts with broken email status get re-enriched, contacts that have replied are moved out of the active sequence, and any new behavioural signals from the previous week's job-portal pull are tagged onto the relevant accounts. Every 90 days, the founder re-pulls the full firmographic universe to catch new entrants and dissolutions. The list compounds rather than rotting.
// Where AtlasForgeX fits
AtlasForgeX runs the full source extraction on the founder's Windows machine — Handelsregister, Bundesanzeiger, Firmenbuch, Zefix, German-language team-page analysis, and the three relevant DACH job boards. The output is a CSV that maps cleanly to the column shape above. The SDR and founder handle persona assignment, conviction grading and the actual sequence work — the parts of the job a tool cannot reasonably automate.