Loading...
Loading...
Enrich a CSV with any data field using a waterfall pattern: try multiple providers in sequence, stop at the first successful match. Prevents paying for duplicate lookups and maximizes fill rates. Triggers: - "enrich my lead list" - "add [field] to my CSV" - "waterfall enrichment" - "try multiple providers to find [data]" Requires: Deepline CLI — https://code.deepline.com
npx skill4agent add getaero-io/gtm-eng-skills waterfall-enrichment--with-waterfall <NAME><NAME>--typeemailphonelinkedinfirst_namelast_namefull_name--result-getters--end-waterfall--end-waterfall{{<waterfall_name>}}deepline enrich --input leads.csv --in-place --rows 0:1 \
--with-waterfall "email" \
--type email \
--result-getters '["data.email","email","data.0.email"]' \
--with 'provider_a=tool_name:{"param":"{{Column}}"}' \
--with 'provider_b=tool_name:{"param":"{{Column}}"}' \
--end-waterfall--rows 1:deepline enrich --input leads.csv --in-place --rows 0:1 \
--with-waterfall "phone" \
--type phone \
--result-getters '["data.phone","phone","mobile","data.mobile"]' \
--with 'mobile_finder=leadmagic_mobile_finder:{"email":"{{Email}}","first_name":"{{First Name}}","last_name":"{{Last Name}}","company":"{{Company}}"}' \
--end-waterfalldeepline enrich --input leads.csv --in-place --rows 0:1 \
--with-waterfall "email" \
--type email \
--result-getters '["data.email","email","data.0.email"]' \
--with 'apollo_match=apollo_people_match:{"first_name":"{{First Name}}","last_name":"{{Last Name}}","organization_name":"{{Company}}"}' \
--with 'crust_profile=crustdata_person_enrichment:{"linkedinProfileUrl":"{{LinkedIn}}","fields":["email","current_employers"],"enrichRealtime":true}' \
--with 'pdl_enrich=peopledatalabs_enrich_contact:{"first_name":"{{First Name}}","last_name":"{{Last Name}}","domain":"{{Company Domain}}"}' \
--end-waterfall \
--with 'email_validation=leadmagic_email_validation:{"email":"{{email}}"}'deepline enrich --input leads.csv --in-place --rows 0:1 \
--with-waterfall "linkedin" \
--type linkedin \
--result-getters '["linkedin_url","data.linkedin_url","data.0.linkedin_url"]' \
--with 'apollo_match=apollo_people_match:{"first_name":"{{First Name}}","last_name":"{{Last Name}}","organization_name":"{{Company}}"}' \
--with 'pdl_identify=peopledatalabs_person_identify:{"first_name":"{{First Name}}","last_name":"{{Last Name}}","company":"{{Company}}"}' \
--end-waterfall# Check for required columns and empty values
python3 -c "
import csv, sys
with open('leads.csv') as f:
rows = list(csv.DictReader(f))
cols = rows[0].keys() if rows else []
print(f'Columns: {list(cols)}')
print(f'Total rows: {len(rows)}')
# Check for empty required fields
for col in ['First Name', 'Last Name', 'Company']:
empty = sum(1 for r in rows if not r.get(col, '').strip())
if empty: print(f'WARNING: {empty} rows missing {col}')
# Check for duplicates (same person appears multiple times)
keys = [(r.get('First Name','').strip().lower(), r.get('Last Name','').strip().lower(), r.get('Company','').strip().lower()) for r in rows]
from collections import Counter
dupes = {k: v for k, v in Counter(keys).items() if v > 1}
if dupes: print(f'WARNING: {len(dupes)} duplicate contacts — deduplicate before enrichment to avoid paying for the same lookup twice')
"| Data type | Single provider | 2-provider waterfall | 3-provider waterfall |
|---|---|---|---|
| ~50% | ~65% | ~75% | |
| Phone | ~30% | ~40% | ~45% |
| LinkedIn URL | ~65% | ~75% | ~85% |
leadmagic_email_validation--rows 0:1--end-waterfall--typeemail | phone | linkedin | first_name | last_name | full_namedeepline playground start --csv leads.csv --open--rows 0:1contact-to-emaillinkedin-url-lookupget-leads-at-companybuild-tamnpm install -g @deepline/cli
deepline auth login