← all systems
OUTBOUNDABMENRICHMENT

ICP Click-to-CRM

Define your ICP. Click once. Enriched leads land in your CRM.

21 nodes4 workflowsn8n · Pronto · Instantly · Claude▶ watch walkthrough

The Problem

Sales teams spend hours manually searching LinkedIn and databases for target accounts, tracking down decision-makers, and hunting for verified emails. Slow, expensive, impossible at scale.

Stack

⚙️
n8n
Orchestrates all 4 async execution paths
🔍
Pronto
Company search, lead discovery, email + phone enrichment
📧
Instantly
Outbound sequence delivery
🧠
Claude
ICP config evaluation and field normalization logic

Walkthrough

How It Works

The execution path

01Trigger Fired
→
02Companies Received
→
03Leads Enriched
→
04CRM Delivered
PATH ATrigger
Click Run
Define ICP config
Submit company search to Pronto
↓ Pronto calls back with company results
PATH BCompanies Received
Receive companies
Filter
Loop one-by-one (1.5s rate limit)
Search for decision-makers
↓ Pronto calls back with lead results
PATH CLeads Received
Receive leads
Filter qualified
Submit bulk email + phone enrichment
↓ Pronto calls back with enriched contacts
PATH DEnriched Contacts
Normalize fields
Format for CRM schema
Deliver to CRM
The workflow is NOT a linear chain — it's 4 independent async paths that hand off via Pronto webhook callbacks. Each path fires, does its work, and exits. The next path only starts when Pronto calls back.
PATH A — Trigger

Kicks off the entire chain. ICP config lives in a single JS node — industry codes, company size, revenue band, geo IDs, job titles, volume limit. One edit, zero rebuilds.

  • ·Click Run
  • ·Read ICP config from JS node
  • ·Submit company search to Pronto
  • → Pronto processes async, calls back to PATH B
PATH B — Companies Received

Pronto calls this webhook when your company results are ready. Loops one-by-one with a 1.5s rate limit between each — Pronto's API requires pacing.

  • ·Receive company batch from Pronto
  • ·Filter against ICP criteria
  • ·Loop one company at a time (1.5s rate limit)
  • ·Submit decision-maker search per company
  • → Pronto calls back to PATH C
PATH C — Leads Received

Filters raw lead results against persona criteria before spending enrichment credits. Only qualified contacts move forward.

  • ·Receive lead batch from Pronto
  • ·Filter: title match, confidence threshold
  • ·Submit bulk email + phone enrichment
  • → Pronto calls back to PATH D
PATH D — Enriched Contacts Arrive

Final delivery. The output node is modular — swap in HubSpot, Airtable, Lemlist, LGM, or Google Sheets without touching anything else.

  • ·Receive enriched contacts from Pronto
  • ·Normalize field variants (firstName / first_name / firstname)
  • ·Format for CRM schema
  • ·Deliver to CRM output node

Key Design Decisions

🔀
4-Path Async Architecture
Not a linear chain. 4 independent webhook paths hand off via Pronto callbacks. Non-blocking — runs in the background while you work.
⚙️
ICP as Config-as-Code
All targeting logic lives in one JS node. Industry, size, revenue, location, titles — one-node edit, zero rebuilds.
🔧
Field Normalization Built-In
Pronto returns firstName, first_name, and firstname across endpoints. Every variant handled — no silent data loss.
🔌
Modular Output Layer
Final delivery node is swappable. HubSpot, Airtable, Lemlist, LGM — wire in whatever CRM you use.

By The Numbers

21
Nodes
4
Async paths
1
JS node controls all ICP targeting
5–20
Min · click to enriched CRM
← back to all systemsmatthew batterson · gtm engineer