Skip to main content
Lifetime license included with every purchase
n8n workflowsCRM automationsales automationdeal tracking

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.

Nn8n Marketplace Team·May 5, 2026·8 min read

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
The core pattern

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
Stale deal detection

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)
Why re-fetch before sending

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

NodePurpose
WebhookReceive form, payment, or CRM event triggers
HTTP RequestCall any CRM REST API not covered by native nodes
HubSpotNative CRUD for contacts, deals, companies, notes, tasks
PipedriveNative CRUD for persons, deals, organizations, activities
SalesforceQuery, create, and update Salesforce objects
IFBranch on record-exists or stage-match conditions
CodeNormalize fields, round-robin logic, field mapping
GmailSend personalized follow-up and confirmation emails
SlackNotify reps of new leads, stale deals, or closed-won events
WaitPause a workflow execution for hours or days
Google SheetsLightweight storage for owner lists or enrichment data

Getting Started

  1. Pick one trigger — start with the highest-volume CRM entry point (usually a form or a payment event).
  2. Map your fields — list every CRM field you need to set and where each value comes from in the trigger payload.
  3. Build the look-up-then-create branch — the IF node after the search is the skeleton of every CRM workflow.
  4. Test with real data — use n8n's execution log to inspect every node's output before connecting downstream actions.
  5. Add the follow-up step — once the CRM write works, layer in the Gmail or Slack node.
  6. Activate and monitor — turn the workflow on and check the first 10 executions manually to confirm field mapping is correct.
  7. 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
FAQ

Common questions

Which CRMs does n8n integrate with natively?
n8n has native nodes for HubSpot, Pipedrive, Salesforce, Copper, and Zoho CRM. For any CRM that exposes a REST API — Attio, Close, Monday Sales CRM — the HTTP Request node handles the integration with full control over headers, auth, and request body.
Can n8n update CRM records without human input?
Yes. A webhook or schedule trigger fires the workflow, n8n reads the source data (form submission, email, Stripe event), maps it to CRM fields, and calls the CRM API to create or update the record. No human clicks required.
How do I prevent duplicate contacts in my CRM when using n8n?
Use the CRM's search-by-email or upsert API endpoint before any create call. n8n's IF node then branches on whether a match was found — update the existing record if yes, create a new one if no. Most CRM nodes in n8n expose an 'upsert' operation directly.
Stop reading. Start running.

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.