Clay Waterfall Enrichment: 30% Match Rates to 90%+
The short answer
A Clay build that chains three providers plus validation so a prospect list stops coming back with half its emails missing or bouncing.
Why this workflow exists
Every ops team has loaded a fresh list and watched half of it bounce. The instinct is to blame the provider, but the real problem is trusting any single provider at all. A waterfall costs a few cents more per contact and turns a list that's 60% dead on arrival into one that's 90%+ deliverable, without anyone doing the fallback lookups by hand.
What it gives you
- 90%+ verified match rate instead of the 30–40% a single provider gives you
- Nothing reaches outbound without passing a real validation check, not just a provider's own label
- Credits are spent efficiently — fallback providers only fire when the cheaper one misses
- One clean email column feeds the CRM, regardless of which provider actually found it
How it works, step by step
7 stages, from the trigger to the outcome.
Step 1: Ingest the row
ClayA new row lands via CSV import, HubSpot list sync, or a webhook, carrying at minimum first name, last name and company domain.
Step 2: Tier-one lookup
ApolloThe cheapest, broadest-coverage provider runs on every row first, so credits are spent efficiently before any fallback fires.
Step 3: Conditional fallback
Hunter / DropcontactRuns only if the tier-one column is blank, using Clay's conditional-run setting so rows that already resolved never trigger a second lookup.
Step 4: Second fallback
FindymailA third provider runs only if both prior columns are blank, catching the harder contacts the first two missed.
Step 5: Validate every result
ZeroBounceEvery non-blank result routes through validation. Catch-all and risky results are flagged, never silently accepted as valid.
Step 6: Consolidate to one field
Clay formulaA formula column picks whichever provider actually succeeded into one clean email field, so nothing downstream needs to check three columns.
Step 7: Write back to CRM
HubSpotOnly rows with a validated, non-risky email push to HubSpot or a sequence — unverified rows never reach outbound.
For founders: what this changes
Relying on one contact-data provider averages a 30–40% match rate, meaning 60%+ of a prospect list is unreachable before a campaign even starts (source). A waterfall chaining multiple providers turns that into 90%+ verified coverage — an independent 30-day, 2,000-contact test found it hit 78% versus 42% from one provider alone (source).
The part vendors won’t tell you
Even waterfalls chaining 75+ sources typically still produce 8–15% invalid addresses without a dedicated verification pass (source). One independent re-check of a major provider’s own “Verified” exports found only 19% actually held up, with 60% landing as catch-all (source). A “verified” label from any single source is a starting point, not a guarantee — which is exactly why validation is its own step in this build, not something folded into the lookup.
What this actually costs
| Item | Typical range |
|---|---|
| Clay subscription | $167–$495/month depending on tier |
| Per-contact lookup credits (3 providers) | ~$0.02–$0.04 |
| Per-contact validation credit | ~$0.01–$0.02 |
| All-in per verified email | ~$0.03–$0.06 |
Compare that to the cost of a rep chasing bounced emails: sales reps already spend roughly 70% of their time on non-selling tasks, including chasing bad contact data (source).
The one-time decision that matters most
How many fallback providers to chain. Two to three is the sweet spot — each additional provider after that adds cost and Clay-table complexity for a shrinking coverage gain. Start with two, add a third only if your match rate is still under ~85% after tuning the first two.
For engineers: how it is built
The table structure
Think of the Clay table as one row per contact and one column per pipeline stage: lookup → fallback → fallback → validate → consolidate → write-back. Conditional-run logic is what makes it a waterfall instead of “run everything on everyone”:
// Clay formula column: Hunter fallback, conditional on Apollo being blank
IF(
ISBLANK({{Apollo Email}}),
RUN_ENRICHMENT("hunter", {{Company Domain}}, {{First Name}}, {{Last Name}}),
BLANK()
)
// Clay formula column: second fallback, conditional on both prior columns being blank
IF(
AND(ISBLANK({{Apollo Email}}), ISBLANK({{Hunter Email}})),
RUN_ENRICHMENT("findymail", {{Company Domain}}, {{First Name}}, {{Last Name}}),
BLANK()
)
// Clay formula column: consolidate whichever provider actually succeeded
COALESCE({{Apollo Email}}, {{Hunter Email}}, {{Findymail Email}})
Validation is a branch, not a boolean
A validated email is not the same as a “found” email, and the validator response needs to be branched on explicitly:
{
"email": "jsmith@acme.com",
"status": "catch-all",
"sub_status": "accept_all",
"free_email": false
}
A status: "catch-all" result means the domain accepts mail to any address — valid or not. Code that only checks status !== "invalid" lets these through as confirmed-valid, which they are not:
// Route validation results into three buckets, not two
function classify(result) {
if (result.status === 'valid') return 'send';
if (result.status === 'catch-all') return 'low-confidence'; // separate track, not a hard send
return 'drop';
}
Write-back, gated on validation
POST /crm/v3/objects/contacts
{
"properties": {
"email": "jsmith@acme.com",
"enrichment_source": "apollo",
"validation_status": "valid",
"waterfall_stage": "tier_1"
}
}
Storing enrichment_source and waterfall_stage on the record isn’t just for debugging — it lets you go back after a few hundred contacts and see which provider is actually earning its place in the waterfall for your specific market.
Where it breaks, and how the build handles it
| Failure | What you would see | How the build handles it |
|---|---|---|
| Credit exhaustion | Runaway Clay bill | Cap the waterfall at 2–3 fallbacks; conditional-run logic skips already-resolved rows |
| Catch-all domains treated as valid | Bounces despite “validated” status | Branch validation into valid / catch-all / invalid, not a single pass/fail |
| Conflicting emails across providers | Wrong contact gets messaged | Consolidation formula prefers the provider with higher verified accuracy, not “first wins” |
| Stale enrichment | Match rate quietly drops over months | Re-run the waterfall on a schedule; email data goes stale at roughly 3.6% a month (source) |
| Provider outage | Whole waterfall stalls | Fallback columns naturally cover a single provider going down; alert if all three return blank |
Tuning it after launch
- Order matters. Put your cheapest, highest-coverage provider first — usually Apollo for US/EU mid-market. Reorder if your ICP is outside its strongest coverage regions.
- Watch the catch-all rate. If it’s climbing, your target list may be skewing toward smaller companies with less mature email infrastructure.
- Re-run quarterly. Contact data decays continuously; a waterfall run once and never repeated degrades like any other enrichment.
Stack and running cost
Clay (orchestration), Apollo (tier-1), Hunter or Dropcontact (fallback), ZeroBounce or NeverBounce (validation), HubSpot (write-back). Check current provider pricing before committing to a monthly volume, since credit costs change.
Related
- The founder-friendly version of this build, with full cost and accuracy numbers: Data enrichment waterfalls
- Find the accounts worth enriching in the first place: Hiring & funding signal watcher
- Want enrichment infrastructure built and owned for your team? RevOps consulting
Frequently asked questions
How many fallback providers should the waterfall chain?
Two to three. Beyond that, marginal coverage gains rarely justify the added complexity and credit cost.
Is Clay enrichment verified out of the box?
No. Unverified waterfall output typically runs 8–15% invalid even from strong sources — the validation column is not optional.
What does this cost per contact?
Roughly $0.03–$0.06 per verified, deliverable email once provider and verification credits are combined, on top of Clay's own subscription.
What happens when two providers return different emails for the same person?
The consolidation formula should prefer whichever provider has higher independently-verified accuracy for that field, not just whichever ran first.
Does this help with phone numbers too?
Yes, using the same waterfall pattern, though phone data is generally weaker — expect roughly 65% accuracy versus 80%+ for email.