Marketing

Building a Prospect List from Public Sources

Antonio Evans11 min read

A top-down view of a desk with an open laptop showing a spreadsheet with columns for name, role, company, source, and reason to write.
Key points

Key points

  1. 1A narrow ideal customer profile built from observable traits tells you where to look and what to check, while a vague profile cannot be tested against a web page.
  2. 2Public directories, communities, job posts and government filings each reveal different facts about a company and about the person worth contacting.
  3. 3Every row needs a source URL, a date checked and one concrete reason to write, or the list decays into an unverifiable pile of names.
  4. 4Small verified lists beat large ones: campaigns under 50 recipients averaged a 5.8% reply rate against 2.1% for lists of 1,000 or more.

Start from a profile you can observe, not describe

Most prospect lists fail before any research happens, because the profile in the researcher's head cannot be tested against a web page. "Mid-market companies that value quality" is not a filter. "Companies with 20 to 80 employees, a public careers page listing a support role, and a product that connects to a payment processor" is a filter you can apply in an afternoon.

Write the profile as three lists. Firmographics are company facts you can see on a website or in a registry: sector, size band, location, business model. Triggers are events that make a problem urgent: a funding round, a new office, a leadership change, a job posting for a role your product supports. Disqualifiers end the conversation: a competitor relationship, a parent company, a market you cannot serve.

The trigger column matters more than the firmographic column, because it is where the reason to write comes from. Outreach that references a specific buying signal such as a funding round, a leadership change or a hiring surge has been reported at response rates far above generic campaigns, with one guide putting signal-based campaigns at 15 to 25% against an average reply rate of 3.43% from Instantly's benchmark report as summarized by Autobound. You do not need exotic data to get that effect. A public job post is a signal, and it is free.

One test for the profile: can a stranger with your written profile find five qualifying companies in twenty minutes without asking you a question? If not, tighten the observable criteria until they can.

Where companies hide in plain sight

Registries and filings

For US companies, the state level is where registration lives. The Department of Commerce's research library notes there is no single federal incorporation database, so you determine the state and then search that state's Secretary of State tool for legal name, entity type, status and registered agent according to the Commerce Research Library. Colorado's business database search works the same way, letting you search by business name, trade name, ID or document number as shown on the Colorado Secretary of State site. These registries are strong for confirming a company exists, when it was formed and who its registered agent is, and weak for finding the person you want to email, because registration data describes the legal entity rather than the org chart.

For public companies, filings are richer. The SEC's EDGAR full text search covers the text of electronic filings since 2001, searchable by company name, ticker, CIK number or individual's name per the EDGAR search interface. A 10-K will tell you business segments, headcount commentary and named executives. The Commerce Research Library also points researchers at company websites and open corporate data sources when tracking down where a company is registered per the Commerce Research Library, which is a useful reminder that the filing and the marketing site rarely agree on everything.

Communities and public conversations

The best source of a real reason to write is often a place where your prospect already talks about the problem. Trade association member directories, conference speaker lists, open-source contributor files, association chapter pages and topic-specific forums all publish names next to roles and interests. The rule here is simple: if the person wrote something in public, you may reference it; if you inferred it, you may not. A community post about migrating a data pipeline is a legitimate hook. A guess that they probably hate their current vendor is not.

Never scrape private groups, member-only forums or gated directories, and never present a community membership as if the person told you directly.

Job postings

A careers page is a public statement of intent. When a company posts for a role, it has budget, a manager with a problem and a timeline. Record the posting URL in your sheet, because job posts disappear and you will want the evidence later. The signal is strongest when the posted role sits adjacent to what you sell: if you sell onboarding software, a post for a customer education specialist is a better hook than a post for an accountant.

The candidate contact itself

Once you have a company, you need a person. The most common failure is choosing someone senior because the title sounds important. A better rule is to pick the person who owns the outcome your product affects, then check that they still hold the role. Vendors that specialize in contact discovery let you filter by department, job title, verification status and location, and separate public from inferred email addresses as described in Hunter's decision-maker guide. That public-versus-inferred distinction is the one to watch: an inferred address is a guess about a naming pattern and needs verification before it goes near a send.

Verify the role and the address before you log the row

Verification has two halves, and teams usually do one and skip the other.

Role verification. Open the company's team page, the person's profile on a professional network, or the signature block of a public document and confirm three things: the person currently holds the title, the title matches your buying-role definition, and the company on the profile matches the company on your list. Plenty of records fail the third check because the person changed jobs and the profile was updated while your list was not. That job change is itself useful information: it is a public, checkable trigger, and the new employer may be a better fit than the old one.

Address verification. Domain-level discovery tools report a status for each address, typically valid, accept-all or unknown per Hunter's documentation. Treat accept-all and unknown as unverified. Bounce rate is a deliverability input: the average across one large dataset was 5.1%, with below 2% described as good and below 1.5% as excellent per Woodpecker's benchmark analysis. Every unverified address you add pushes your list toward that average.

A decision rule for address confidence:

SituationActionWhy
Address marked valid at a domain with working mail serversLog as verified, record the verification dateLowest bounce risk
Address marked accept-allLog as unverified, do not send until a second checkThe server accepts everything, so validity cannot be confirmed
Address inferred from a naming patternFind a public source that states the address, or drop the rowInference is a guess, not a fact
Role page and profile disagree on titleHold the row, recheck in a few daysThe record is probably stale
Company no longer trading or page removedRemove the row, note whySending to a dead company wastes a touch

If your list is small, a manual check on the company's contact page or a public press release takes under a minute per row and is more reliable than any single automated verdict. Record which method you used, because next quarter you will want to know whether the "valid" flag was automated or human.

The spreadsheet that survives handoffs

A prospect sheet is a research log, not a mailing list. The mailing list is a downstream export. Keep them separate and make the research log rich.

The minimum viable schema, in column order, uses one row per person:

company_name, domain, company_source_url, company_checked_date,
person_name, role_title, role_source_url, role_checked_date,
email, email_status, email_source_url,
icp_segment, trigger_type, trigger_source_url, trigger_date,
reason_to_write, disqualifier_flag, last_touched, owner, notes

Three details in that schema do more work than the rest.

Source URLs, not source names. "A profile site" is not a source. The exact URL that showed the title is. When someone else picks up the sheet they can recheck in seconds, and when a prospect replies asking how you found them, you have the answer.

Checked dates, one per field group. Company facts, role facts and contact facts go stale at different speeds. Roles change fastest. A row where the role was verified six months ago is not verified.

Reason to write, written as a sentence with a fact in it. "Mentioned in their filing that they are opening a second distribution center in Ohio" is a reason. "Good fit" is not. If you cannot fill this cell, delete the row. That rule is the highest-leverage pruning tool available, because it forces the researcher to either find a hook or admit there isn't one.

Add a tab for your do-not-contact list and check every row against it at export time, not at research time. Opt-out obligations attach to the send, but the record of an opt-out belongs in your own system and must be honored promptly: the FTC's compliance guide requires opt-out requests to be processed within 10 business days, with the mechanism remaining usable for at least 30 days after the message goes out per the FTC's CAN-SPAM guide. The same guide states the law makes no exception for business-to-business email FTC compliance guide. Your sheet is where you prove you honored it.

A second tab for companies (one row per company, with segment, size band and trigger) keeps the person sheet clean and lets you count prospects per account. When a company has four contacts, that is one account with four routes in, not four independent opportunities.

Worked example: 600 rows down to 180 sends

Suppose you need meetings next month and you have one researcher for two weeks.

Start with the trigger, not the database. You decide the trigger is "posting a role in the operations function." You collect 600 companies from three sources: an industry association member directory, a conference exhibitor list and a set of job boards filtered by your sector.

Filter to the profile. Applying size band and geography removes 260 companies. Some are too large, some are in markets you cannot serve, some are agencies that resell rather than buy. You are at 340.

Verify the trigger. Open each company's careers page and confirm a live operations posting. Roughly a third have closed the role or never had one on their own site. You are at 220 companies, each with a trigger URL and a date.

Find the person. For each company, identify one or two people who own the operations outcome. Team pages yield a name for about 70% of companies. The rest need a second source: a press release, a conference bio, a filing. You are at 260 people across 220 companies.

Verify roles. A sample check finds that about one in eight titles is stale or wrong. You correct 32 records and drop 20 you cannot confirm. You are at 240.

Verify addresses. Automated checks mark 150 valid and 90 accept-all or unknown. You run a second check or a manual look at a public source on the ambiguous ones. You accept 120 as verified, hold 80 and drop 40. You are at roughly 200 verified contacts.

Write the reason. The trigger column is already filled, so the reason to write is one sentence built from it. Twenty rows have no usable sentence because the posting turned out to be generic. You are at 180.

Now compare the two ways to spend the next month. Blasting 1,000 names with no personalization has been reported at around a 2% reply rate, while 100 targeted, personalized prospects reached up to 18% in the same dataset, producing similar reply counts with a tenth of the send volume per Woodpecker's analysis. Smaller campaigns also beat larger ones: under 50 recipients averaged 5.8% against 2.1% for 1,000 or more Woodpecker benchmarks. Your 180 verified rows, each with a specific hook, sit in the range where the research pays for itself.

An independent experiment on 5,187 cold emails found an average response rate of 15%, rising to 44% for emails under 150 words that introduce the sender within the first three seconds, and to 58% when personalization covered name, company and location per the published study in the Journal of Business and Entrepreneurial Studies. The transferable lesson for list building is that the cheapest personalization is the kind you already gathered: company and location sit in your sheet if you collected them as structured fields rather than prose notes.

The benchmark picture also explains why a verified small list is worth the labor. Average reply rates have declined as inbox competition tightened, and advanced personalization has been reported at roughly double the reply rate of basic templates, yet only a small share of senders personalize every message per Martal's cold email statistics. The constraint is rarely copywriting skill. It is whether the rows contain anything specific enough to personalize from.

Pruning, refresh and the ethics of public data

Prune on a schedule, not on a feeling. Once a month, sort by role_checked_date and recheck anything older than 60 days for roles and 90 days for companies. Sort by reason_to_write and delete rows where the cell is empty or vague. Sort by email_status and remove anything still unverified after a second attempt.

Refresh triggers rather than hoarding names. A row with a stale trigger is worse than no row, because it invites a message about an event the prospect has forgotten. When a trigger ages out, either find a new one or move the row to a nurture tab.

Keep the public line visible. Everything in the sheet should be traceable to something the person or their employer published: a website, a filing, a job post, a conference listing, a community post written under their own name. Public does not mean unlimited. Do not collect personal contact details, home addresses or anything from a private group, and do not let a researcher paste in scraped gated content. The FTC's guide requires accurate header information and truthful subject lines per the FTC, and a list built from unverifiable sources is exactly where inaccurate claims start. Privacy practitioners make the operational point sharply: a working unsubscribe link is not proof of compliance if the opt-out does not propagate to every system that sends per Transcend's compliance guide. Your do-not-contact tab is the internal half of that propagation.

Calibrate expectations before you send. Published averages are a range, not a promise: platform-wide reply rates have been reported around 3.43%, with 5 to 10% described as good and 10% and above as excellent per Instantly's benchmark analysis. A list of 180 verified rows with a real hook each should be judged against positive and qualified replies, not open rates, which tracking protections have made unreliable per Woodpecker.

Keep the sheet to a few hundred rows. The discipline of a small list is not modesty, it is a forcing function. When you cannot add a row without a source, a date and a sentence, quality stops being a virtue and becomes a structural property of the file.

When the research load outgrows one person, the next step is usually process rather than more names: a specialist who owns the profile, the source list and the verification standard, and who hands back a finished sheet rather than a folder of links. That is the kind of scoped work Quanta Experts is built for, where an expert reads your context and returns deliverables you can check against the standard above.

FAQ

FAQ

How many prospects should a first list contain?

Aim for 100 to 250 verified rows for a first campaign. That is large enough to learn from and small enough to verify every row by hand. Campaigns under 50 recipients reported a 5.8% average reply rate against 2.1% for lists of 1,000 or more, so adding unverified names past a few hundred usually lowers your results per Woodpecker's benchmarks.

Is it legal to build a list from public sources and email those people?

In the US, the CAN-SPAM Act covers business-to-business commercial email with no exemption and requires accurate headers, a truthful subject line, a physical postal address, a clear opt-out and prompt honoring of opt-outs per the FTC's guide. Building from public sources is not itself prohibited, but rules differ by country and by how you process personal data, so check the law that applies to each recipient's location.

How do I know an email address is real before I send?

Prefer an address published by the company or the person. Where you rely on a discovery tool, check its status label: valid addresses are the only ones you should send to, while accept-all and unknown should be rechecked or dropped per Hunter's documentation. Keep your bounce rate under 2% to protect deliverability per Woodpecker.

What belongs in the reason to write column?

One sentence that names a specific public fact and connects it to the problem you solve. It should cite something a stranger could find in under a minute: a job posting, a filing statement, a published article or a product change. If the sentence would survive being read aloud to the prospect, it is good enough to keep.

How often should the spreadsheet be rechecked?

Recheck roles every 60 days and company facts every 90 days, and clear the trigger column whenever the event ages past relevance. Stale records cause two problems at once: wasted sends and false confidence in the list's size. A monthly prune that deletes rows with no defensible reason to write keeps the file honest.

Sources

Sources

  1. Cold Email Guide 2026: Best Practices & Benchmarks | Autobound
  2. Incorporation Status - Company & Industry Research
  3. Search Business Database
  4. EDGAR Full Text Search
  5. How can I find decision makers using Hunter?
  6. Cold Email Statistics Based on Sending Over 20M Cold Emails
  7. CAN-SPAM Act: A Compliance Guide for Business
  8. Economics of cold emailing | Journal of business and entrepreneurial ...
  9. B2B Cold Email Statistics 2026: Benchmarks & What Works Now
  10. The CAN-SPAM Act: A complete 2026 compliance guide - Transcend.io
  11. Cold Email Response Rates: B2B Benchmarks - Instantly
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles