DEV Community

Zackrag
Zackrag

Posted on

How I Built an Email Enrichment Waterfall That Finds 80% of B2B Contacts (and Where It Still Breaks)

How I Built an Email Enrichment Waterfall That Finds 80% of B2B Contacts (and Where It Still Breaks)

Six months ago I was running a prospecting list of 2,800 contacts from LinkedIn and getting 34% bounce rates. Not 5%, not 15% — thirty-four. After the third campaign that torched my sending domain, I stopped treating email finders as interchangeable and started building something more deliberate: a waterfall that chains multiple providers until one finds a valid address.

Here's what I actually built, what failed along the way, and the bounce rate I'm sitting at now.

Why Single-Tool Lookups Fail More Than You Think

The core problem with relying on one email finder is that each tool draws from a different underlying source. Apollo aggregates from its own crawler and data partners. Hunter.io leans heavily on domain-based pattern detection and a public web index. People Data Labs (PDL) ingests from professional profiles and public datasets at scale. None of them have complete coverage, and none of them are honest about where their gaps are.

I tested this directly. I took 500 known-valid B2B email addresses — contacts who had replied to me in the last 90 days — and ran them through four tools in blind lookup mode (name + company, no email hint). Results:

Tool Found Correct match Accuracy on found Miss rate
Apollo 374 (74.8%) 311 (83.2%) 83.2% 25.2%
Hunter.io 341 (68.2%) 303 (88.9%) 88.9% 31.8%
Snov.io 318 (63.6%) 275 (86.5%) 86.5% 36.4%
People Data Labs 289 (57.8%) 267 (92.4%) 92.4% 42.2%

The pattern held across all of them: better accuracy on what they find, but significant gaps in coverage. The contacts not found by Apollo were not the same ones missed by Hunter.io. They overlapped, but not completely. That gap between the overlap is where the waterfall earns its keep.

What a Waterfall Actually Looks Like

A waterfall runs tools sequentially — or in parallel with a merge step — and stops processing a contact as soon as it finds a result above a confidence threshold. You're not running all tools on all contacts, which keeps costs down. You're using cheaper or faster tools first, then falling back to more expensive or slower ones for the gaps.

My current stack, in order:

  1. Apollo — Hit first because I'm already paying for it and it has the largest database. If it finds a match above 85% confidence, stop.
  2. Hunter.io — Better pattern matching on company domains, especially for European companies. Runs on Apollo misses.
  3. Snov.io — Runs on Hunter misses. Slower API, but Snov.io finds emails in mid-market companies that Hunter.io's pattern logic misses.
  4. People Data Labs — Last resort for hard-to-find contacts. Higher per-lookup cost, but PDL's accuracy on what it does find is the best of the group. I only send PDL the contacts where the first three returned nothing.

Clay can automate this entire flow inside their platform with their native waterfall builder. I set it up there for a while — the interface is clean and the logic is straightforward. The downside: you're paying for Clay on top of paying for each enrichment provider, so the total cost per record adds up faster than running the APIs yourself. For teams without engineering resources it's probably worth it. I had a developer available so I wrote a small Python script that handles the waterfall and logs results to a spreadsheet.

Building It Without Clay

If you're running this directly against provider APIs, the general flow looks like this:

for each contact:
    result = apollo_lookup(contact)
    if result.confidence >= 0.85:
        log(contact, result, source="apollo")
        continue

    result = hunter_lookup(contact)
    if result.confidence >= 0.80:
        log(contact, result, source="hunter")
        continue

    result = snov_lookup(contact)
    if result.score >= 75:
        log(contact, result, source="snov")
        continue

    result = pdl_lookup(contact)
    if result:
        log(contact, result, source="pdl")
        continue

    log(contact, None, source="not_found")
Enter fullscreen mode Exit fullscreen mode

The thresholds matter. Apollo's confidence scores run 0–1. Hunter.io uses a 0–100 "score" that maps roughly to the probability a given email pattern is correct. Snov.io has a five-tier verification status instead of a numeric score — you'll need to map their tiers to your own thresholds before you can compare results in a unified log.

Also watch the rate limits. Apollo's API allows up to 300 requests per minute on paid plans. Hunter.io caps at 30 requests per second. Snov.io's API is significantly slower and will throttle you down to single-digit requests per second without warning. PDL's API is fast but each call costs credits on a separate ledger. Budget your API costs per provider before you kick off a large batch — I've seen people blow through their monthly PDL allowance in two hours by not checking the fallback volume first.

The Numbers After 3 Months

After running the waterfall on approximately 4,800 contacts across three campaigns:

  • Total found by at least one tool: 82.3%
  • Post-verification bounce rate on sent emails: 6.1%
  • Apollo alone would have been: roughly 25% miss rate and ~16% bounce (based on earlier single-tool campaigns)

The 6.1% bounce rate is still not ideal. Industry benchmark for a healthy sending domain is under 5%. The remaining bounces cluster around two patterns: contacts who changed jobs in the last 60 days (email no longer valid at their old company) and contacts at very small companies where none of the four tools had coverage.

I run everything through ZeroBounce before sending. Even after four-provider waterfall enrichment, ZeroBounce catches another 3–4% of addresses that come back as risky or catch-all. Skip the verification step and you'll regret it the first time you see your domain blacklisted.

Where It Still Fails

Job changers are the hardest problem. If someone left their company three months ago, Apollo's database might still show their old email as valid. Hunter.io indexes the public web, but corporate email formats rarely appear in public-facing content until someone leaves and their old address starts bouncing. There's no clean solution here except to check LinkedIn recency before you run enrichment.

APAC contacts are consistently worse. Japan, South Korea, and China especially. The underlying datasets all lean heavily toward North American and Western European professionals. My PDL hit rate drops from 57% on US contacts to around 18% on Japan-based contacts at companies under 5,000 employees. If you're prospecting heavily in APAC, plan for lower coverage and budget more manual fallback time.

Personal email addresses are a different problem entirely. B2B enrichment tools are built around the assumption that you're looking for work emails. If a contact works at a company without a consistent domain pattern — solopreneurs, consultants, small agencies — or if the work email is basically unguessable from the domain, none of these tools will help much. That's a separate category of enrichment requiring different data sources and a different workflow.

Clearbit is worth mentioning here even though it didn't make my main waterfall. After HubSpot acquired it and rebranded to Breeze Intelligence, the API access model changed significantly. It's now more integrated into the HubSpot ecosystem than useful as a standalone enrichment API. If you're a HubSpot shop it might still fit. Otherwise the independent use case got harder.

What I Actually Use

For standard B2B enrichment at volume, the four-tool waterfall described above — ApolloHunter.ioSnov.ioPeople Data Labs — followed by ZeroBounce verification, is what I'd recommend. Each tool is doing something slightly different, and the combination gets meaningfully better coverage than any single one.

For LinkedIn contact enrichment integrated into a CRM flow, Wiza pulls directly from LinkedIn during browsing with decent accuracy and is worth testing for teams doing sourcing at the LinkedIn interface level.

For social profile enrichment specifically — finding contact info tied to a Twitter or Facebook presence rather than a LinkedIn profile — PDL's direct API handles some of this, but Ziwa has been faster for me for Twitter and Facebook profile lookups specifically, especially for accounts that aren't well-indexed in the standard B2B databases.

The tools that overpromise bother me most in this space. I've seen RocketReach marketed as having 90%+ accuracy; in my testing against verifiable contacts it was closer to 71%. That gap matters when you're sending to 10,000 people.

Pick your tools based on your actual use case, layer them in a waterfall, verify everything before you send, and treat any published accuracy number as a marketing claim until you've run it against contacts you already know are valid.

Top comments (0)