n8n

Automate Your CRM Data Sync with n8n + HubSpot

What you will build

An automated bidirectional data sync between HubSpot and any other tool in your stack — keeping contact records, deal stages, and activity logs current without anyone manually updating the CRM.

Intermediate 1–2 hours May 19, 2026

Before you start

  • n8n account (cloud or self-hosted)
  • HubSpot account with API access (free CRM tier works)
  • The second tool you want to sync (Slack, Airtable, Google Sheets, or similar)
  • Basic familiarity with n8n workflows

Why Your CRM Is Always Out of Date

Every CRM has the same problem: it is only as good as what people put into it. And people, when they are busy — which is always — do not update the CRM. They update it in batches, or they forget, or they decide the deal is obvious enough that it does not need logging.

The result is a CRM that nobody trusts. And a CRM nobody trusts is one nobody uses. And one nobody uses becomes the most expensive spreadsheet in your business.

Automated CRM sync removes the human from the update loop entirely. When a deal moves stages in your pipeline tool, the CRM updates. When a meeting is booked, the contact record logs it. When a support ticket is resolved, the deal record reflects it.

This guide shows you how to build that sync between HubSpot and the rest of your stack using n8n.


Step 1: Get Your HubSpot API Key

Go to your HubSpot account → SettingsIntegrationsAPI Key.

If you are on a newer HubSpot account, you may need to create a Private App instead:

Go to SettingsIntegrationsPrivate AppsCreate a private app.

Name it n8n Sync and grant it the following scopes:

  • crm.objects.contacts.read
  • crm.objects.contacts.write
  • crm.objects.deals.read
  • crm.objects.deals.write
  • crm.objects.companies.read

Copy the access token. This is your HubSpot credential for n8n.

Screenshot placeholder: HubSpot Private Apps configuration showing scope selection


Step 2: Add HubSpot Credentials to n8n

In n8n, go to CredentialsAdd CredentialHubSpot API.

Paste your API key or Private App token. Test the connection to confirm it works.


Step 3: Choose Your Sync Direction

Decide what you want to sync and in which direction. This guide covers three common use cases:

Use Case A — New HubSpot contact → Slack notification
When a new contact is created in HubSpot, send a notification to a Slack channel with the contact’s details.

Use Case B — New row in Google Sheets → HubSpot contact created
When someone adds a row to a Google Sheet (e.g. from a manual lead list), automatically create a contact in HubSpot.

Use Case C — HubSpot deal stage change → Airtable record updated
When a deal moves to a new stage in HubSpot, update the corresponding record in Airtable.

Build whichever matches your most painful manual sync task. The n8n pattern is the same for all three — only the nodes change.


Step 4: Build Use Case A — HubSpot to Slack

Node 1 — HubSpot Trigger
Add a HubSpot Trigger node. Set the event to Contact Created. This fires every time a new contact is added to HubSpot, whether by a form, import, or manual entry.

Node 2 — Set (Format the Message)
Add a Set node to pull the fields you want in the Slack message:

  • contact.firstname
  • contact.lastname
  • contact.email
  • contact.hs_lead_source (where they came from)

Node 3 — Slack (Send Message)
Add a Slack node. Set it to post to your sales channel.

Format the message:

New lead in HubSpot:
Name: {{firstname}} {{lastname}}
Email: {{email}}
Source: {{hs_lead_source}}
View in HubSpot: https://app.hubspot.com/contacts/[YOUR_PORTAL_ID]/contact/{{id}}

Activate the workflow. Every new HubSpot contact will now trigger an instant Slack notification.

Screenshot placeholder: n8n workflow showing HubSpot trigger → Set → Slack node chain


Step 5: Build Use Case B — Google Sheets to HubSpot

Node 1 — Schedule Trigger
Set to run every 15 minutes during business hours, or use a Google Sheets trigger if you want real-time sync.

Node 2 — Google Sheets (Get New Rows)
Pull rows from your lead sheet. Use a helper column (e.g. “Synced to HubSpot”) set to FALSE for new rows — the workflow will only process rows where this is FALSE.

Node 3 — IF (Check for duplicates)
Before creating a contact, check if the email already exists in HubSpot. Use an HTTP Request node to call the HubSpot search API:

POST https://api.hubapi.com/crm/v3/objects/contacts/search
Body: {"filterGroups": [{"filters": [{"propertyName": "email", "operator": "EQ", "value": "{{email}}"}]}]}

If the contact exists, skip to Node 5. If not, proceed to Node 4.

Node 4 — HubSpot (Create Contact)
Create the new contact with fields mapped from your Google Sheet columns.

Node 5 — Google Sheets (Update Row)
Mark the row as “Synced to HubSpot” = TRUE so it is not processed again on the next run.


Step 6: Build Use Case C — HubSpot Deal Stage to Airtable

Node 1 — HubSpot Trigger
Set the event to Deal Updated. Filter for only deal stage changes using a Filter node: only continue if dealstage has changed.

Node 2 — Airtable (Find Record)
Search your Airtable base for the record that matches this deal. Match on the deal name or a HubSpot deal ID field you have added to Airtable.

Node 3 — IF (Record exists?)
If the record exists, update it. If not, create it.

Node 4a — Airtable (Update Record)
Map the new deal stage to the corresponding Airtable field. Also update a “Last HubSpot Sync” timestamp field.

Node 4b — Airtable (Create Record)
If the record did not exist, create it with all available deal fields.

Screenshot placeholder: Complete deal stage sync workflow in n8n


Error Handling — Do Not Skip This

Before activating any sync workflow, add error handling. Without it, a failed API call will silently drop data.

In n8n, click the three-dot menu on any node → Add Error Output. Connect the error output to a Slack notification or email that alerts you when a sync fails.

At minimum, add this to:

  • The HubSpot create/update nodes
  • The Airtable/Sheets write nodes

This means you will always know when a sync fails and can manually review the affected record.


What to Build Next

Once your basic sync is running, consider these extensions:

  • Add a duplicate prevention check for every inbound sync path to avoid creating multiple records for the same contact
  • Add a data enrichment step using Clearbit or Hunter.io to enrich contacts with company data as they enter HubSpot
  • Add a weekly audit — a scheduled workflow that queries HubSpot for contacts with missing required fields and sends you a report
  • Build bidirectional sync — the most powerful pattern is when both systems stay in sync regardless of where the update happens. This requires careful conflict resolution logic but is worth building once your one-directional sync is stable.

A CRM that updates itself is one your team will actually use. And a CRM your team uses is one that tells you the truth about your pipeline.

Want someone to handle this setup for you?

We have done this setup hundreds of times. Book a free audit and we will scope exactly what your operation needs.

← More guides