Waterfall email enrichment
10,000 rows in, 8,315 mailable contacts out, $302.97 spent
A waterfall is a queue of providers where each one only sees the rows the ones before it could not resolve. It works because coverage in this market is uneven in a way that is uncorrelated between vendors. The rows Apollo misses are not the hard rows, they are a different set of rows, and somebody else has them.
Order decides your bill. Run your cheapest provider first and it absorbs the easy majority at a rate nothing else can match. Run your most expensive first and you pay premium rates for rows a cheap provider would have found. The providers are the same either way. The invoice is not.
Sort by cost per successful lookup, ascending, and only ever pass along the misses. Everything else on this page is refinement.
Five steps, 10,000 rows, $302.97
Starting from a list of 10,000 names with company domains. Target is a verified work email. Every rate below is the provider's published entry-plan rate.
Apollo people enrichment · 10,000 attempts
The cheapest credit here by about one percent, and it charges nothing on a miss, which is what actually earns it the first slot. Finds roughly 5,500.
Findymail · 4,500 attempts
Verifies at find time, so these rows skip step 5 entirely. Strongest on European data, which is exactly where Apollo thins out. Finds roughly 2,250.
Prospeo · 2,250 attempts
A different index again, and also EMEA-strong. By this depth the rows are genuinely hard, so expect a lower hit rate. Finds roughly 787.
FullEnrich · 1,463 attempts
A waterfall inside your waterfall, reaching 25+ sources in one call. Expensive per row and worth it only on the residue. Finds roughly 438.
ZeroBounce · 5,500 validations
Only Apollo's results need this. Findymail and Prospeo verify at find time and FullEnrich bundles verification free. Roughly 88% survive.
Verification is 35% of this bill, and it is the line most teams leave out of the forecast entirely. It is also the one you should not cut: a 12% bounce rate on 5,500 unverified addresses does more damage to a sending domain than $107 of anything can fix.
Marginal cost, step by step
The column that decides how deep your waterfall should go is the last one.
| Step | Rows in | Found | Hit rate | Spend | Marginal cost |
|---|---|---|---|---|---|
| 1 · Apollo | 10,000 | 5,500 | 55% | $107.80 | $0.0196 |
| 2 · Findymail | 4,500 | 2,250 | 50% | $44.55 | $0.0198 |
| 3 · Prospeo | 2,250 | 787 | 35% | $19.28 | $0.0245 |
| 4 · FullEnrich | 1,463 | 438 | 30% | $24.09 | $0.055 |
| 5 · ZeroBounce | 5,500 | 4,840 pass | 88% | $107.25 | $0.0222 |
| Total | 10,000 | 8,315 mailable | 83% | $302.97 | $0.0364 |
The prices on this page are verified from vendor pricing pages. The hit rates are not, because no provider in this category publishes a match rate you can hold them to. The percentages above are our modeling assumptions, drawn from client work, and they will differ on your list.
Substitute your own before you use this to make a decision. The shape of the curve holds regardless of the numbers you put in it.
When to stop adding providers
There is an actual answer to this, and it takes one division.
Work out what a contact is worth
Take last quarter's closed-won revenue, divide by the number of contacts you enriched to produce it. It does not need to be precise, it needs the right order of magnitude. Call that number V.
Compare V against the marginal column, not the average
The average cost of this stack is $0.0364 a contact, which looks cheap against almost any V. The marginal cost of the fourth provider is $0.055, which is 2.8 times the first. At V of $2.00 all four steps clear easily and you should add a fifth. At V of $0.04 only the fourth fails to clear, so stop after Prospeo.
Count the meters a hit runs
Every provider in the stack above charges nothing on a miss and one credit price on a hit, which is why the arithmetic is clean. Clay does not charge for a miss either, but a hit there runs two meters: an action for Clay's work, $0.0036 on annual Launch, and the data credits that provider charges, $0.0452 each. Bring your own provider keys and the data credits drop out, so the ledger above holds and Clay's actions sit on top of it.
Re-run the numbers when your segment changes
These curves are segment-specific. A US mid-market list resolves mostly at step 1. A European list inverts that: Apollo thins out, Findymail and Prospeo carry more, and the stack costs more per contact while finding a similar share. If you sell into both, run two stacks with different orders rather than one compromise.
The same job, optimized differently
The stack above optimizes for cost per contact. These two optimize for something else.
Cheapest workable
One provider, one verification pass. For teams where a contact is worth well under a dollar.
$0.0198 per mailable contact, against $0.0364 for the full stack. 46% cheaper per contact, and 2,115 fewer contacts.
Maximum coverage, phone included
Ask Apollo for the phone in the same call and you save a second pass, but not money. A row costs 1 credit when only an email comes back and 9 when a mobile does, so at $0.0196 a credit a mobile is $0.1764.
$604.65 total. Apollo is no longer the cheap way to buy a mobile: the same 1,924 numbers cost $190.48 at LeadMagic, and $380.95 at Findymail and $1,058.20 at FullEnrich. Route the phone pass to LeadMagic and keep Apollo for the email.
Four ways teams lose money on this
Running the expensive provider first
Usually because it was the first one bought, and the waterfall got built around it. Reordering is a config change and it is the cheapest optimization available here. In the model above, putting FullEnrich first instead of last would take the bill from $303 to roughly $417, buying 5% more mailable contacts for 38% more money.
Verifying rows that were already verified
Findymail and Prospeo verify at the moment they find. Pushing their output through a separate verifier again is a pure loss, and it happens constantly because the verification step gets bolted on at the end of the pipeline rather than per source. Route it per source.
Enriching the whole list before qualifying it
The cheapest lookup is the one you do not make. Filter by firmographics and signal data first, which costs almost nothing, then enrich what survives. A list cut from 10,000 to 4,000 before enrichment costs 60% less and usually converts better.
Not capping the budget
Every overspend we have been called in to look at came from a loop rather than from volume: a retry that did not back off, a scheduled job that ran twice, an agent that worked a list four times because nobody told it the first pass had succeeded. Set a hard credit ceiling per workspace before any of this runs unattended.
Build it with an agent
This stack ships as a skill file: the API surface of every tool in the chain, the build order, the limits that break it and how to check it worked. Point an agent at it and it has what it needs without reading 5 sets of vendor docs first.
--- name: waterfall-email-enrichment description: Build a cheapest-first email enrichment waterfall across Apollo, Findymail, Prospeo and FullEnrich, with verification... --- # Waterfall email enrichment ## What you are building ## Prerequisites → 7 rows ## The tools, and how to call them → Apollo, Findymail, Prospeo, FullEnrich, ZeroBounce ## Build it → 5 steps ## Gotchas → 5 ## How to verify it works → 5 checks ## What this costs to run
mkdir -p .claude/skills/waterfall-email-enrichment curl -o .claude/skills/waterfall-email-enrichment/SKILL.md https://frontal.so/gtm-apis/skills/waterfall-enrichment.md
For Codex, Cursor, or anything else that reads a file or fetches a URL, hand it https://frontal.so/gtm-apis/skills/waterfall-enrichment.md directly. It is plain markdown with YAML frontmatter and no tool-specific syntax, so nothing in it depends on which agent is reading it.
This page is the model. Frontal builds the pipeline.
Provider order, routing by region, per-source verification, credit ceilings that stop a retry loop emptying a balance overnight, and the write-back that puts a verified contact in front of a rep the same day.
Worked with 300+ companies. A senior operator runs your account.
The other three stacks on this site are costed the same way, so the numbers are comparable: hiring signal to outbound at $0.13 a unit, inbound speed to lead at $0.0587 a lead and agent-driven account research at $0.09 an account. Every provider in them is in the directory.
Questions we get
How deep to go, and what it costs to get it wrong.
How many providers should a waterfall have?
Three or four for most teams. The first absorbs the majority, the second picks up a different index, the third and fourth work the residue at rising cost. Whether a fifth pays is the same division as the one above: its marginal cost against your V. Run it on your numbers rather than copying this page's.
Do I need Clay to build this?
No. Clay makes it much faster to build and change, and it charges for that work in actions on top of the data. If your waterfall is stable and you have someone who can write the orchestration, going directly against the APIs means paying the providers' own rates with no actions on top. If the logic changes weekly and non-engineers need to change it, Clay earns its money.
Why not just use FullEnrich, since it is already a waterfall?
You can, and for a small list it is the simplest option by a distance. At $0.055 a work email it is nearly three times Apollo's rate, which stops mattering at 500 rows and matters a great deal at 50,000. The stack above uses FullEnrich for exactly what it is best at: the hard residue nobody else could resolve.
Where do mobile numbers fit?
After the email waterfall, on the contacts that survived verification, and only if you are actually going to call them. Every provider charges a multiple for phone: 8 extra credits at Apollo, 5 at LeadMagic, 10 at Findymail, Prospeo and FullEnrich. In cash that is $0.099 a number at LeadMagic and $0.55 at FullEnrich, a 5.6x spread, and Apollo's own call lands at $0.1764 in the middle of it.
How often should the stack be re-tested?
Quarterly, and whenever you enter a new segment or region. Coverage moves as providers refresh their indexes, and prices in this category change quietly. Re-running the 500-row bake-off takes half a day and has changed the provider order for about a third of the teams we have run it for.