{"id":"e6e49cb2-49a9-450d-b671-51c1f6b1f37d","shortId":"N7SD3L","kind":"skill","title":"enrichment-waterfall","tagline":"Build multi-vendor data enrichment waterfalls in n8n — cascading API calls across SerpAPI, Hunter.io, Apollo, Clearbit, LLM extractors, and scrapers with cost-aware fallbacks. Use this skill whenever the user wants to enrich leads, contacts, companies, or any entity with external","description":"# Enrichment Waterfall for n8n\n\nA **waterfall** = try cheapest/fastest vendor first, fall through to more expensive/accurate vendors only when the previous fails. This is how Clay, Clearbit, and every production enrichment pipeline actually works.\n\n## The core pattern\n\n```\nInput (name, email, or domain)\n  ↓\nVendor 1 (cheap, fast, ~60% hit rate) — e.g., Hunter.io\n  ↓ IF no match\nVendor 2 (medium cost, ~80% cumulative) — e.g., Apollo\n  ↓ IF no match\nVendor 3 (expensive / LLM extract, ~95% cumulative) — e.g., SerpAPI + LLM\n  ↓ IF no match\nDead letter: log as \"unenrichable\"\n```\n\nAt each step, a hit short-circuits the rest. You pay only for what the cheap vendors miss.\n\n## Ordering: cost × accuracy × rate limit\n\nOrder vendors by **expected cost per successful enrichment**, not sticker price. Calculate:\n\n```\neffective_cost = price_per_call / hit_rate\n```\n\nExample for email-from-name+company:\n\n| Vendor | Price/call | Hit rate | Effective cost |\n|---|---|---|---|\n| Hunter.io | $0.004 | 55% | $0.007 |\n| Apollo bulk | $0.01 | 75% | $0.013 |\n| SerpAPI + LLM extract | $0.02 | 90% | $0.022 |\n| Manual LinkedIn scrape | $0.05 | 60% | $0.083 |\n\nOrder: Hunter → Apollo → SerpAPI+LLM → dead letter. Effective cost per enriched lead ≈ $0.012 vs $0.083 if you'd started with the scraper.\n\n## n8n implementation\n\n### Structure\n\n```\n1. Trigger (Webhook / Schedule / Manual)\n2. Set — normalize input (lowercase email, strip whitespace, extract domain)\n3. MySQL / Google Sheets — check cache (was this already enriched in last 30 days?)\n4. IF cache hit → return cached → END\n5. HTTP Request: Hunter.io\n6. IF match found → Set enriched data → merge back → END\n7. HTTP Request: Apollo (on Hunter miss)\n8. IF match → merge → END\n9. HTTP Request: SerpAPI\n10. Information Extractor (LangChain) — extract contact from SERP results\n11. IF match → merge → END\n12. MySQL insert — dead letter table\n```\n\n### Critical configuration\n\nEach HTTP Request node needs:\n\n- `continueOnFail: true` — so one vendor's 500 doesn't kill the pipeline\n- `retry.maxTries: 2` with `retry.waitBetweenTries: 3000`\n- Timeout: 10s. Waterfalls with 6 vendors at 30s timeouts = 3-minute-per-lead worst case\n- Auth via n8n **credentials**, never inline\n\n### The IF check pattern\n\nAfter each vendor, check BOTH response status AND payload content:\n\n```javascript\n// In an IF node expression:\n={{ \n  $('Hunter Request').item.json.error \n    ? false \n    : $('Hunter Request').item.json.data?.email != null \n}}\n```\n\nDon't just check `.error` — vendors often return 200 with empty results on a miss.\n\n### Cache layer (mandatory)\n\nEnrichment data goes stale in ~30 days but doesn't change daily. Cache aggressively:\n\n```sql\nCREATE TABLE enrichment_cache (\n  input_key VARCHAR(255) PRIMARY KEY,  -- normalized email/domain\n  enriched_data JSON,\n  source VARCHAR(50),                   -- which vendor hit\n  enriched_at TIMESTAMP,\n  INDEX idx_enriched_at (enriched_at)\n);\n```\n\nBefore calling ANY vendor, SELECT on `input_key` WHERE `enriched_at > NOW() - INTERVAL 30 DAY`. Cache hit rate of 40% is normal after a few weeks — that's 40% cost reduction for free.\n\n## LLM extract stage (the Stage 3 secret weapon)\n\nWhen paid vendors miss, SerpAPI + LLM extract works 80%+ of the time:\n\n1. `HTTP Request` → SerpAPI search: `\"{{ $json.first_name }} {{ $json.last_name }}\" \"{{ $json.company }}\" site:linkedin.com`\n2. `Information Extractor` with schema:\n   ```json\n   {\n     \"linkedin_url\": \"string\",\n     \"title\": \"string\",\n     \"location\": \"string\",\n     \"confidence\": \"number (0-1)\"\n   }\n   ```\n3. IF `confidence < 0.7` → treat as miss\n\nUse Groq `llama-3.3-70b-versatile` for extract — it's fast enough that even at 90% hit rate, per-lead cost stays under 2 cents.\n\n## Rate limits (the silent killer)\n\nEvery vendor has limits. Hitting them burns waterfalls silently.\n\n| Vendor | Typical limit | n8n handling |\n|---|---|---|\n| Hunter.io | 50/min (free tier 25/day) | `Split In Batches` size=1, `Wait` 1200ms between |\n| Apollo | 600/min enterprise | Usually fine at batch size 10 |\n| SerpAPI | Plan-dependent | Check headers, backoff if `X-RateLimit-Remaining < 5` |\n\nFor high-volume pipelines, run the waterfall as a **sub-workflow** called from a `Split In Batches` parent with `batchSize: 10, waitBetweenBatches: 60000`.\n\n## Anti-patterns\n\n- **Parallelizing vendors.** Running all 3 in parallel and picking the best defeats the point — you pay for all 3 on every lead. Waterfall = sequential with early exit.\n- **No dead letter.** Unenrichable leads must go somewhere queryable so you can spot-check WHY they're missing. Otherwise vendor regressions go unnoticed.\n- **Same timeout across vendors.** Cheap vendors are usually fast (set 5s). Scrapers need 30s. Tune per vendor.\n- **No vendor health monitoring.** Add a dashboard query: hit rate per vendor per week. When Hunter's hit rate drops from 55% to 20%, you want to know immediately.\n\n## Output contract\n\nWhatever the source, the waterfall should output a **unified schema** downstream consumers can rely on:\n\n```json\n{\n  \"email\": \"string\",\n  \"full_name\": \"string\",\n  \"company\": \"string\",\n  \"linkedin_url\": \"string|null\",\n  \"title\": \"string|null\",\n  \"enrichment_source\": \"hunter|apollo|serpapi_llm\",\n  \"confidence\": \"number (0-1)\",\n  \"enriched_at\": \"ISO timestamp\"\n}\n```\n\nAdd a final `Set` node to normalize each vendor's response into this schema before returning.\n\n## Reference\n\n- `references/waterfall-template.json` — importable 18-node starter waterfall","tags":["enrichment","waterfall","n8n","claude","skills","masteranime","agent-skills","agentic-ai","agentic-workflow","automation","claude-ai","claude-code"],"capabilities":["skill","source-masteranime","skill-enrichment-waterfall","topic-agent-skills","topic-agentic-ai","topic-agentic-workflow","topic-automation","topic-claude","topic-claude-ai","topic-claude-code","topic-claude-skills","topic-large-language-model","topic-llm","topic-mcp","topic-mcp-server"],"categories":["n8n-claude-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/masteranime/n8n-claude-skills/enrichment-waterfall","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add masteranime/n8n-claude-skills","source_repo":"https://github.com/masteranime/n8n-claude-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 26 github stars · SKILL.md body (5,465 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:05:05.462Z","embedding":null,"createdAt":"2026-04-26T01:03:23.749Z","updatedAt":"2026-05-18T19:05:05.462Z","lastSeenAt":"2026-05-18T19:05:05.462Z","tsv":"'-1':536,792 '-3.3':547 '-70':548 '0':535,791 '0.004':186 '0.007':188 '0.01':191 '0.012':218 '0.013':193 '0.02':197 '0.022':199 '0.05':203 '0.083':205,220 '0.7':540 '1':89,231,508,600 '10':297,612,648 '10s':342 '11':306 '12':311 '1200ms':602 '18':816 '2':101,236,337,520,570 '20':745 '200':400 '25/day':595 '255':432 '3':112,246,350,493,537,658,672 '30':258,415,468 '3000':340 '30s':348,718 '4':260 '40':474,483 '5':267,625 '50':442 '50/min':592 '500':330 '55':187,743 '5s':715 '6':271,345 '60':92,204 '600/min':605 '60000':650 '7':281 '75':192 '8':288 '80':104,504 '9':293 '90':198,561 '95':116 'accuraci':150 'across':16,707 'actual':78 'add':726,797 'aggress':423 'alreadi':254 'anti':652 'anti-pattern':651 'api':14 'apollo':19,107,189,208,284,604,786 'auth':357 'awar':28 'b':550 'b-versatil':549 'back':279 'backoff':619 'batch':598,610,644 'batchsiz':647 'best':664 'build':4 'bulk':190 'burn':583 'cach':251,262,265,407,422,428,470 'calcul':164 'call':15,169,456,639 'cascad':13 'case':356 'cent':571 'chang':420 'cheap':90,145,709 'cheapest/fastest':54 'check':250,365,370,395,617,695 'circuit':136 'clay':71 'clearbit':20,72 'compani':41,178,774 'confid':533,539,789 'configur':318 'consum':764 'contact':40,302 'content':376 'continueonfail':324 'contract':752 'core':81 'cost':27,103,149,157,166,184,214,484,567 'cost-awar':26 'creat':425 'credenti':360 'critic':317 'cumul':105,117 'd':223 'daili':421 'dashboard':728 'data':8,277,411,438 'day':259,416,469 'dead':124,211,314,682 'defeat':665 'depend':616 'doesn':331,418 'domain':87,245 'downstream':763 'drop':741 'e.g':95,106,118 'earli':679 'effect':165,183,213 'email':85,175,241,390,769 'email-from-nam':174 'email/domain':436 'empti':402 'end':266,280,292,310 'enough':557 'enrich':2,9,38,47,76,160,216,255,276,410,427,437,446,451,453,464,783,793 'enrichment-waterfal':1 'enterpris':606 'entiti':44 'error':396 'even':559 'everi':74,577,674 'exampl':172 'exit':680 'expect':156 'expens':113 'expensive/accurate':61 'express':382 'extern':46 'extract':115,196,244,301,489,502,553 'extractor':22,299,522 'fail':67 'fall':57 'fallback':29 'fals':386 'fast':91,556,713 'final':799 'fine':608 'first':56 'found':274 'free':487,593 'full':771 'go':687,703 'goe':412 'googl':248 'groq':545 'handl':590 'header':618 'health':724 'high':628 'high-volum':627 'hit':93,133,170,181,263,445,471,562,581,730,739 'http':268,282,294,320,509 'hunter':207,286,383,387,737,785 'hunter.io':18,96,185,270,591 'idx':450 'immedi':750 'implement':229 'import':815 'index':449 'inform':298,521 'inlin':362 'input':83,239,429,461 'insert':313 'interv':467 'iso':795 'item.json.data':389 'item.json.error':385 'javascript':377 'json':439,525,768 'json.company':517 'json.first':513 'json.last':515 'key':430,434,462 'kill':333 'killer':576 'know':749 'langchain':300 'last':257 'layer':408 'lead':39,217,354,566,675,685 'letter':125,212,315,683 'limit':152,573,580,588 'linkedin':201,526,776 'linkedin.com':519 'llama':546 'llm':21,114,120,195,210,488,501,788 'locat':531 'log':126 'lowercas':240 'mandatori':409 'manual':200,235 'match':99,110,123,273,290,308 'medium':102 'merg':278,291,309 'minut':352 'minute-per-lead':351 'miss':147,287,406,499,543,699 'monitor':725 'multi':6 'multi-vendor':5 'must':686 'mysql':247,312 'n8n':12,50,228,359,589 'name':84,177,514,516,772 'need':323,717 'never':361 'node':322,381,801,817 'normal':238,435,476,803 'null':391,779,782 'number':534,790 'often':398 'one':327 'order':148,153,206 'otherwis':700 'output':751,759 'paid':497 'parallel':654,660 'parent':645 'pattern':82,366,653 'pay':140,669 'payload':375 'per':158,168,215,353,565,720,732,734 'per-lead':564 'pick':662 'pipelin':77,335,630 'plan':615 'plan-depend':614 'point':667 'previous':66 'price':163,167 'price/call':180 'primari':433 'product':75 'queri':729 'queryabl':689 'rate':94,151,171,182,472,563,572,731,740 'ratelimit':623 're':698 'reduct':485 'refer':813 'references/waterfall-template.json':814 'regress':702 'reli':766 'remain':624 'request':269,283,295,321,384,388,510 'respons':372,807 'rest':138 'result':305,403 'retry.maxtries':336 'retry.waitbetweentries':339 'return':264,399,812 'run':631,656 'schedul':234 'schema':524,762,810 'scrape':202 'scraper':24,227,716 'search':512 'secret':494 'select':459 'sequenti':677 'serp':304 'serpapi':17,119,194,209,296,500,511,613,787 'set':237,275,714,800 'sheet':249 'short':135 'short-circuit':134 'silent':575,585 'site':518 'size':599,611 'skill':32 'skill-enrichment-waterfall' 'somewher':688 'sourc':440,755,784 'source-masteranime' 'split':596,642 'spot':694 'spot-check':693 'sql':424 'stage':490,492 'stale':413 'start':224 'starter':818 'status':373 'stay':568 'step':131 'sticker':162 'string':528,530,532,770,773,775,778,781 'strip':242 'structur':230 'sub':637 'sub-workflow':636 'success':159 'tabl':316,426 'tier':594 'time':507 'timeout':341,349,706 'timestamp':448,796 'titl':529,780 'topic-agent-skills' 'topic-agentic-ai' 'topic-agentic-workflow' 'topic-automation' 'topic-claude' 'topic-claude-ai' 'topic-claude-code' 'topic-claude-skills' 'topic-large-language-model' 'topic-llm' 'topic-mcp' 'topic-mcp-server' 'treat':541 'tri':53 'trigger':232 'true':325 'tune':719 'typic':587 'unenrich':128,684 'unifi':761 'unnot':704 'url':527,777 'use':30,544 'user':35 'usual':607,712 'varchar':431,441 'vendor':7,55,62,88,100,111,146,154,179,328,346,369,397,444,458,498,578,586,655,701,708,710,721,723,733,805 'versatil':551 'via':358 'volum':629 'vs':219 'wait':601 'waitbetweenbatch':649 'want':36,747 'waterfal':3,10,48,52,343,584,633,676,757,819 'weapon':495 'webhook':233 'week':480,735 'whatev':753 'whenev':33 'whitespac':243 'work':79,503 'workflow':638 'worst':355 'x':622 'x-ratelimit-remain':621","prices":[{"id":"15023255-4249-43fa-abb8-78144ca817ad","listingId":"e6e49cb2-49a9-450d-b671-51c1f6b1f37d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"masteranime","category":"n8n-claude-skills","install_from":"skills.sh"},"createdAt":"2026-04-26T01:03:23.749Z"}],"sources":[{"listingId":"e6e49cb2-49a9-450d-b671-51c1f6b1f37d","source":"github","sourceId":"masteranime/n8n-claude-skills/enrichment-waterfall","sourceUrl":"https://github.com/masteranime/n8n-claude-skills/tree/main/skills/enrichment-waterfall","isPrimary":false,"firstSeenAt":"2026-04-26T01:03:23.749Z","lastSeenAt":"2026-05-18T19:05:05.462Z"}],"details":{"listingId":"e6e49cb2-49a9-450d-b671-51c1f6b1f37d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"masteranime","slug":"enrichment-waterfall","github":{"repo":"masteranime/n8n-claude-skills","stars":26,"topics":["agent-skills","agentic-ai","agentic-workflow","automation","claude","claude-ai","claude-code","claude-skills","large-language-model","llm","mcp","mcp-server","n8n","n8n-workflow","workflow","workflow-automation"],"license":"mit","html_url":"https://github.com/masteranime/n8n-claude-skills","pushed_at":"2026-04-26T10:24:01Z","description":"Production Claude Code skills for n8n from a Verified Creator's 100+ workflows","skill_md_sha":"36c276dea1869008b5016647f0d0a457617bc9b0","skill_md_path":"skills/enrichment-waterfall/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/masteranime/n8n-claude-skills/tree/main/skills/enrichment-waterfall"},"layout":"multi","source":"github","category":"n8n-claude-skills","frontmatter":{"name":"enrichment-waterfall","description":"Build multi-vendor data enrichment waterfalls in n8n — cascading API calls across SerpAPI, Hunter.io, Apollo, Clearbit, LLM extractors, and scrapers with cost-aware fallbacks. Use this skill whenever the user wants to enrich leads, contacts, companies, or any entity with external data in n8n — phrases like \"lead enrichment\", \"email finder\", \"data waterfall\", \"Clay alternative\", \"find LinkedIn profile\", \"get company info\", \"enrich this list of leads\". Also use when designing any flow where multiple vendors are tried in sequence until one succeeds. Use this skill before designing such workflows because naive sequential API calls produce $10/lead costs — the waterfall pattern drops that to $0.10 by ordering vendors correctly."},"skills_sh_url":"https://skills.sh/masteranime/n8n-claude-skills/enrichment-waterfall"},"updatedAt":"2026-05-18T19:05:05.462Z"}}