Most CRMs are passive data stores — they only know what your team manually enters. n8n turns yours into an active system that captures, enriches, routes, and follows up on leads automatically.
The pipeline we'll build
End-to-end CRM automation flow
- 11Instant
Lead captured
A new lead arrives via a web form submission, a LinkedIn Lead Gen form webhook, or an inbound email. The n8n trigger fires instantly on any of these sources.
- 222–5 seconds
Data enriched
Clearbit or Clay enriches the lead with company size, industry, LinkedIn URL, technology stack, and funding status — so your team has context before the first touchpoint.
- 33Instant
CRM record created or updated
n8n performs an upsert keyed on the lead's email address. If a contact already exists it updates the record; if not, it creates one. No duplicates.
- 44Instant
SDR notified
The assigned rep receives a Slack DM with the lead summary, enrichment data, and a one-click link directly into the CRM record.
- 55Scheduled
Follow-up sequence triggered
A three-email follow-up sequence kicks off via your email tool of choice — Instantly, Lemlist, or HubSpot Sequences. Timing is controlled by n8n's Schedule node.
- 66Instant
Deal stage updated on reply
When a lead replies, a webhook fires back into n8n, which updates the CRM deal stage to 'Replied' and removes the lead from the follow-up sequence automatically.
Step 1 — Capture leads from multiple sources
The first node in every CRM automation is a trigger. n8n supports all the common lead sources natively, and each fires the same downstream workflow regardless of where the lead came from. This means one pipeline handles all your channels.
- Typeform or Tally webhook — add the n8n webhook URL as the form's response endpoint; the full form payload arrives as structured JSON.
- LinkedIn Lead Gen form — connect via LinkedIn's API or a Zapier/Make webhook bridge if you haven't migrated to n8n fully; the lead data arrives within seconds of form submission.
- Inbound email parsing — use n8n's Gmail or Outlook trigger with a label filter, then run the email body through an AI extraction node to pull name, company, and intent.
- Website chat widget — Crisp, Intercom, and Tidio all support webhooks; fire a lead capture event when a visitor submits their email or completes a qualifying question set.
Step 2 — Enrich lead data automatically
Raw form data gives you a name and email. Enrichment turns that into a complete prospect profile. Add an HTTP Request node immediately after your trigger and point it at the Clearbit Enrichment API with the lead's email as the query parameter. Clearbit returns company name, employee count, industry, LinkedIn URL, estimated revenue, and technology stack — all structured JSON fields you can map directly into CRM properties. If you use Clay, replace the HTTP Request node with a Clay webhook or use n8n's HTTP node to call Clay's API and run a waterfall enrichment across multiple data providers simultaneously. Always enable Continue On Fail on the enrichment node so that a failed enrichment lookup never blocks a lead from reaching your CRM.
Step 3 — Create or update CRM records
With enriched data in hand, the next node writes to your CRM. For HubSpot, use the native HubSpot node with the 'Upsert Contact' operation — this creates a new contact if the email doesn't exist, or updates the existing one if it does. Map your enrichment fields to the corresponding HubSpot properties. For Salesforce, use the Salesforce node's 'Upsert' operation on the Contact object keyed on the Email field. The configuration below shows a typical HubSpot node field mapping.
{
"resource": "contact",
"operation": "upsert",
"additionalFields": {
"email": "={{ $json.email }}",
"firstname": "={{ $json.first_name }}",
"lastname": "={{ $json.last_name }}",
"company": "={{ $json.enrichment.company.name ?? $json.company }}",
"jobtitle": "={{ $json.enrichment.role ?? '' }}",
"phone": "={{ $json.phone ?? '' }}",
"hs_lead_status": "NEW",
"lifecyclestage": "lead",
"num_employees": "={{ $json.enrichment.company.metrics.employees ?? '' }}",
"industry": "={{ $json.enrichment.company.category.industry ?? '' }}"
}
}Step 4 — Notify your team
A CRM record is only useful if the right rep knows about it immediately. After the CRM upsert, add a Slack node configured to send a DM to the assigned rep — or to a shared #new-leads channel if you're using round-robin assignment. Build the message using n8n's expression editor to inject the lead's name, company, job title, enrichment highlights, and a direct link to the newly created CRM record. Good Slack notification design means the rep can evaluate the lead and take action without ever opening the CRM if they don't need to. Use Slack's Block Kit format (via the Slack node's 'Blocks' field) for structured, scannable messages — lead name as the header, company details in a context block, and a link button pointing to the CRM record.
Step 5 — Trigger a follow-up sequence
If the lead doesn't receive an immediate reply from a rep, a follow-up sequence ensures no one falls through the cracks. After the Slack notification, add a branch using a Switch or If node based on lead score or deal size. For hot leads, fire an immediate personal email from the rep's inbox via Gmail or Outlook node. For warm or cold leads, add the contact to a sequence in your email tool of choice. With Instantly or Lemlist, this is an HTTP Request node calling their API to add a prospect to a campaign. With HubSpot Sequences, use the HubSpot node's Sequence Enrollment operation. Set a wait condition in n8n using a Schedule Trigger or a Wait node so that follow-up emails are sent at business hours, not at 3am when the form was submitted.
Common errors and how to fix them
- Duplicate contacts in HubSpot — happens when the upsert key isn't set to Email. Open the HubSpot node, ensure the operation is 'Upsert Contact', and confirm the Upsert Field is set to 'Email'. Also check that your form is always capturing the email in a consistent lowercase format — use an n8n expression like
{{ $json.email.toLowerCase().trim() }}before passing it to the CRM node. - Enrichment node causes the workflow to fail — Clearbit and Clay have rate limits and occasional downtime. Enable Continue On Fail on any enrichment node and add a fallback Set node that populates empty enrichment fields with sensible defaults (empty strings or null values) so the CRM write always proceeds.
- Slack messages not sending for some leads — usually caused by a missing or null field being injected into the message template. Wrap dynamic values in a null-coalescing expression:
{{ $json.enrichment?.company?.name ?? $json.company ?? 'Unknown company' }}. Test your Slack node with a sample payload that has missing fields before going live. - Follow-up sequence enrolling the same contact twice — your email tool (Instantly, Lemlist, HubSpot Sequences) will usually reject duplicate enrollments, but the n8n workflow may still error. Add an If node before the sequence enrollment step that checks whether the contact already exists in the sequence by calling the email tool's API with a lookup query. Only trigger enrollment if the response confirms they are not already active.
[email protected]) and run the full workflow end-to-end before pointing live form traffic at it. Verify the CRM record is created with the correct fields, the Slack notification arrives as expected, and the sequence enrollment fires without errors. Delete the test record from your CRM before activating the workflow.