Lesson 3 of 8 · 49 min
Enrichment waterfalls: coverage, cost, and freshness
Design enrichment waterfalls as policy: ordered providers, confidence and validation gates, cache/TTL, clobber rules, cost caps, and bounce feedback — optimizing coverage without burning budget or domains.
Single-vendor hope → waterfall policy
Key idea
Waterfall anatomy
1EMAIL WATERFALL (simplified policy)23 inputs: first, last, domain, company_id4 providers: [clearbit, apollo, hunter, rocketreach, findymail]5 accept if confidence >= 0.85 OR (validator=valid and conf>=0.70)67 for p in providers:8 if cache_hit(key, ttl=30d): return cache9 resp = p.find_email(inputs)10 meter(p, cost=resp.cost)11 if accept(resp): write(value, source=p, conf, ts); break12 else:13 mark enrich_failed reason=no_email1415 post: validate_email(value) unless provider already validated16 never send on catch-all unless policy.allow_catch_all and band==A- 01Identity waterfall — resolve person/company IDs across systems.
- 02Firmographic waterfall — industry, size, revenue, geo.
- 03Technographic waterfall — stack detection providers.
- 04Email/phone waterfall — highest risk; couple with validation.
- 05Insights waterfall — news, jobs, funding (often LLM+search).
- 06Verification hop — never skip for cold email at scale.
Coverage, cost, freshness — pick two under budget
1ENRICHMENT SCOREBOARD23 metric definition4 --------------------------- ----------------------------------5 coverage_mve % eligible with all MVE fields6 cost_per_success $ / contact reaching MVE7 cost_per_attempt $ including failures8 median_freshness_days now - observed_at for email9 validator_valid_rate valid / validated10 provider_yield[p] accepts from p / calls to p11 clobber_rate overwrites of higher conf data1213 Targets example: coverage_mve ≥ 75%, cost_per_success ≤ $0.35,14 median email freshness ≤ 45d for A-band sends.Common mistake
“Cheapest cost-per-email API should always be first in the waterfall.”
Caching, idempotency, and clobber rules
- 01Never overwrite validated email with unvalidated guess.
- 02Allow overwrite if new conf higher and validator still valid.
- 03Force refresh on bounce, role-change signal, or TTL expiry before re-sequence.
- 04Person key — stable ID (CRM id, LinkedIn URL hash, email). Domain+name is weak.
- 05Company key — domain primary; legal name secondary; handle acquisitions.
Key idea
Validation placement
1VALIDATION OUTCOMES → ACTIONS23 valid → allow sequence4 invalid → suppress email channel; try phone/LinkedIn or fail5 catch_all → policy gate (band, domain reputation, volume)6 unknown → recheck later or secondary validator; no mass send7 role_account → suppress for personalized outbound (info@, sales@)89 On hard bounce: mark invalid, stop sequence, quarantine domain if spike.Clay waterfalls in production
Common mistake
“If Clay has a waterfall template, the architecture is done.”
PII, compliance, and multi-client isolation
- 01Q: How do you choose waterfall order? Benchmark on a labeled sample from your ICP: yield, valid rate, cost, latency. Sort by valid-accept per dollar with constraints on max latency. Re-run when vendors change packages.
- 02Q: What if coverage is 60% vs 80% target? Do not silently lower confidence thresholds to “hit the number.” Expand providers, improve identity inputs (LinkedIn URL), or narrow ICP. Fake coverage becomes bounce rate.
- 03Q: Batch vs real-time enrichment? Batch for list loads and recalibration; real-time for inbound or high-value triggers. Same policy engine both paths — only the scheduler changes.
Credit metering and noisy neighbors
- 01Budget cap — hard stop enrich when tenant hits daily/monthly $.
- 02Per-provider caps — avoid one API burning the whole envelope.
- 03Dry-run mode — estimate cost on sample before full list load.
- 04Anomaly alert — 3× baseline spend/hour pages the owner.
Key idea
1COST GUARD (pseudo)23 before call(provider, tenant):4 if tenant.spend_today + provider.est > tenant.daily_cap: raise BudgetExceeded5 if provider.error_rate_5m > 0.3: skip_provider (degrade)6 after call:7 meter(actual_cost); emit enrich_attempt eventdocsClay — waterfalls and enrichmentClaydocsHunter — email finder & verifier conceptsHunterdocsNeverBounce validation overviewNeverBouncedocsApollo data & enrichmentApolloEnrichment is a supply chain. Cheap parts that fail inspection are more expensive than good parts that cost more up front.
Checkpoint
Waterfall finds an email at conf 0.6, then a later provider returns different email at conf 0.9 unvalidated. Policy?
Checkpoint
Finance caps enrichment at $0.20/contact but leadership wants 90% MVE coverage. Current best is 72% at $0.20. Senior move?
Checkpoint
Hard bounces spike on a list enriched 90 days ago. What system fix is incomplete if you only pause the campaign?
Checkpoint
Where should validation sit for a cost-sensitive cold email motion?
Checkpoint
Agency runs two clients in one Clay workspace with shared credit pool and cache. Primary risk?
Can you design a waterfall with accept rules, validation placement, cost caps, and bounce feedback?
Takeaways
- Waterfalls optimize valid coverage per dollar with provenance on every field.
- Clobber rules, TTLs, and bounce loops keep data from rotting into domain damage.
- Clay is a strong builder; CRM/warehouse + policy hold production truth.
- Next: sequence engines, branching, and human-in-the-loop (gos-sequences).
Next lesson: sequence graphs that stop on reply, branch on signals, and respect capacity.
Sources
Free to read · better with Enzo
Learn it with Enzo
Save your progress, answer the checkpoints, and let Enzo quiz you on what you just read.