How to Automate Your CRM Workflows with n8n (Contacts, Deals, and Follow-ups)
Automate CRM workflows in n8n — sync contacts, update deals, trigger follow-up sequences, and log activity without touching your CRM manually. Step-by-step.
Your CRM Should Update Itself
Every rep knows the feeling: a great call ends, and now there's 15 minutes of CRM work before you can move on. Log the call, update the stage, set a follow-up task, send the recap email. Repeat, all day.
n8n removes that overhead entirely. When the trigger fires — a form fill, a payment, an email reply, a calendar event — n8n reads the data, finds the right record, updates it, and sends whatever follow-up is needed. No manual entry, no missed tasks, no stale pipeline.
This guide shows you exactly how to wire that up.
What You Can Automate in Your CRM
- New lead intake — form submission creates a contact, assigns an owner, and starts a nurture sequence
- Deal stage progression — payment confirmation or signed contract moves a deal to "Closed Won" automatically
- Activity logging — every email reply, meeting, or support ticket logged against the right contact
- Follow-up sequences — time-based or behavior-based email chains triggered by deal stage changes
- Contact enrichment — pull job title, company size, and LinkedIn data and push it to CRM fields
- Stale deal alerts — flag deals with no activity in 7+ days and notify the owner in Slack
- Duplicate prevention — search before creating; update if found, create if not
Every CRM automation is: trigger → look up record → decide create or update → act on the result. Once you know this loop, every CRM use case is just a variation.
The CRM Automation Pipeline
Trigger (Webhook / Schedule / CRM Event)
→ Normalize & enrich data
→ Look up existing record (search by email / ID)
→ IF found → Update record
ELSE → Create record
→ Log activity (note / task)
→ Trigger follow-up (email sequence / Slack alert)
For follow-up sequences, add a branch after the create/update step:
Deal stage = "Proposal Sent"
→ Wait 2 days
→ Check if still "Proposal Sent"
→ IF yes → Send follow-up email via Gmail
→ Update CRM task: follow-up sent
Step-by-Step Breakdown
1. Collect
Pick your trigger. Common CRM entry points:
- Webhook — form tools (Typeform, Tally, HubSpot Forms) POST to an n8n webhook URL
- Schedule — poll a sheet or API every hour for new rows
- Email — Gmail trigger fires when a new email matches a label
- Payment event — Stripe webhook fires on
payment_intent.succeeded
The webhook approach is the most reliable — it fires instantly and doesn't require polling.
2. Process / Segment
Clean and normalize the incoming data before touching the CRM.
// Code node — normalize contact fields
const name = $json.full_name || ($json.first_name + " " + $json.last_name).trim();
const email = ($json.email || "").toLowerCase().trim();
const company = $json.company || $json.organization || "";
return [{ json: { name, email, company } }];
If you're enriching contacts, call a data provider (Clearbit, Hunter, Apollo) here via HTTP Request before writing to the CRM.
3. Route
Search the CRM for an existing record before creating a new one.
For HubSpot, use Search Contacts filtered by email. For Pipedrive, use Search Persons by email. The response tells you whether to create or update.
// After CRM search — Code node
const exists = $json.total > 0;
const contactId = exists ? $json.results[0].id : null;
return [{ json: { exists, contactId } }];
Then an IF node branches: exists === true → update, exists === false → create.
4. Act
Write the record. Both create and update paths should set:
- Contact name, email, phone, company
- Lead source (tie it to the trigger's origin)
- Owner (map by round-robin or territory)
- Deal or opportunity (create a linked deal when the contact is a new inbound lead)
After writing, add an activity log — a note or task in the CRM that records what triggered this update and when.
5. Follow Up
Trigger downstream actions after the CRM write completes:
- Personalized email via Gmail or SendGrid — use CRM fields in the subject and body
- Slack notification to the owner — deal assigned, deal updated, or stale deal warning
- Calendar invite — create a Google Calendar event and add the contact as an attendee
- Task creation — add a follow-up task with a due date based on the deal stage
Run a scheduled workflow nightly: fetch all deals last updated more than 7 days ago, filter by open stage, and send the owner a Slack message with a direct link to the deal. One node per action, five minutes to build.
Implementation Patterns
Pattern 1: Form-to-CRM with Owner Assignment
Typeform Webhook
→ Code node: normalize fields
→ HubSpot: Search Contacts (filter by email)
→ IF contact exists
→ HubSpot: Update Contact
ELSE
→ HubSpot: Create Contact
→ HubSpot: Create Deal (linked to contact)
→ Code node: pick owner by round-robin from list
→ HubSpot: Update Deal (set owner)
→ Gmail: Send welcome email
The owner assignment logic lives in a Code node — a simple counter stored in a Google Sheet or a static array works for small teams.
Pattern 2: Payment-to-Deal-Update
Stripe Webhook (payment_intent.succeeded)
→ Code node: extract customer email + amount
→ HubSpot: Search Contacts by email
→ HubSpot: Update Deal stage = "Closed Won"
→ HubSpot: Create Note (payment confirmed)
→ Slack: Notify #sales channel
This fires within seconds of payment. The sales team sees the Slack notification before they've finished celebrating.
Pattern 3: Timed Follow-up Sequence
CRM Deal Trigger (stage changed to "Proposal Sent")
→ Set: record dealId + ownerEmail + contactEmail
→ Wait: 2 days
→ HubSpot: Get Deal (re-fetch current stage)
→ IF stage still "Proposal Sent"
→ Gmail: Send follow-up email
→ HubSpot: Create Task (follow-up sent, due +3 days)
ELSE
→ No action (deal already progressed or lost)
The Wait node pauses execution, but the deal may have moved in the meantime. Always re-fetch the record after a wait and check the current state before acting. This prevents sending follow-ups to deals already won or lost.
n8n Nodes You'll Use Most
| Node | Purpose |
|---|---|
| Webhook | Receive form, payment, or CRM event triggers |
| HTTP Request | Call any CRM REST API not covered by native nodes |
| HubSpot | Native CRUD for contacts, deals, companies, notes, tasks |
| Pipedrive | Native CRUD for persons, deals, organizations, activities |
| Salesforce | Query, create, and update Salesforce objects |
| IF | Branch on record-exists or stage-match conditions |
| Code | Normalize fields, round-robin logic, field mapping |
| Gmail | Send personalized follow-up and confirmation emails |
| Slack | Notify reps of new leads, stale deals, or closed-won events |
| Wait | Pause a workflow execution for hours or days |
| Google Sheets | Lightweight storage for owner lists or enrichment data |
Getting Started
- Pick one trigger — start with the highest-volume CRM entry point (usually a form or a payment event).
- Map your fields — list every CRM field you need to set and where each value comes from in the trigger payload.
- Build the look-up-then-create branch — the IF node after the search is the skeleton of every CRM workflow.
- Test with real data — use n8n's execution log to inspect every node's output before connecting downstream actions.
- Add the follow-up step — once the CRM write works, layer in the Gmail or Slack node.
- Activate and monitor — turn the workflow on and check the first 10 executions manually to confirm field mapping is correct.
- Expand incrementally — add enrichment, owner assignment, and timed sequences one step at a time.
If you want a head start, the Email Follow-up Automator handles the timed sequence pattern out of the box. The AI Lead Scoring & Email Routing template adds lead qualification before the CRM write, and the Data Entry Hub normalizes multi-source intake into a single CRM pipeline.
Browse CRM automation templates →For more on the lead intake side of this pipeline, see How to Automate Lead Generation and Outreach with n8n. For what happens after a deal closes — support ticket routing, SLA alerts, and auto-replies — see How to Automate Customer Support with n8n.
Get the full CRM workflow templates →Common questions
Which CRMs does n8n integrate with natively?
Can n8n update CRM records without human input?
How do I prevent duplicate contacts in my CRM when using n8n?
Get the workflow templates this guide is built on
Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.
More automation guides

How to Automate Airtable with n8n (Sync, Update, and Trigger Workflows from Your Database)
Airtable Is Your Database. n8n Makes It Behave Like a Full Automation Platform. Airtable is where teams store structured data — project trackers, CRM records, content calendars, inventory, hiring pipe…

How to Automate Your Email Inbox with n8n (Triage, Route, and Auto-Reply)
Your Inbox Is a Queue. n8n Can Run It for You. Most knowledge workers spend 2–4 hours a day on email. Sorting, reading, deciding who to forward to, writing the same replies again and again. That is op…

How to Automate Notion Workflows with n8n (Databases, Pages, and Syncs)
Notion Is Your Team's Source of Truth. n8n Keeps It Accurate Without the Manual Work. Notion is where teams track projects, log decisions, manage content pipelines, and maintain wikis. The problem is…