At a Glance — n8n HubSpot Integration

  • Native node included: HubSpot node (Contacts, Companies, Deals, Tickets, Line Items) + HubSpot Trigger node (property changes, deal stage updates, form submissions)
  • Auth: Private App token — HubSpot Settings → Integrations → Private Apps → Create; select CRM scopes you need, copy the access token (no OAuth app required)
  • Scopes to request: crm.objects.contacts.read/write, crm.objects.deals.read/write, crm.objects.companies.read, forms (for form webhooks); add only what your workflows use
  • Deal stage trigger: HubSpot Trigger on deal.propertyChange → filter for dealstage property → IF node matching the target stage ID (not display name)
  • Most common workflows: New contact → Slack/email alert, deal stage change → Salesforce case, form submission → drip sequence in Mailchimp, HubSpot deal Won → QBO invoice
  • Deduplication: Always search by email before creating a Contact — HubSpot Trigger on contact.creation fires for every source, so duplicate checks prevent double records

n8n HubSpot Node Overview

n8n provides two HubSpot-related nodes. The HubSpot Trigger listens for real-time CRM events via HubSpot webhooks — contact property changes, deal stage updates, contact creation, and company updates. The HubSpot node lets you read and write CRM data: contacts, companies, deals, tickets, and line items. Together they cover the full range of HubSpot CRM automation.

Supported HubSpot Trigger event types include: contact.propertyChange, deal.propertyChange, company.propertyChange, contact.creation, deal.creation, and contact.deletion. For form submissions, HubSpot's native form webhook feature sends a POST to your n8n Webhook node directly — you do not need the HubSpot Trigger for that.

The HubSpot node covers: Contact → Get, Create, Update, Get All, Search; Company → Get, Create, Update, Get All, Search; Deal → Get, Create, Update, Get All, Search; Ticket → Get, Create, Update; and Association → Create and Delete between objects.

Connecting HubSpot to n8n

HubSpot's recommended authentication method for n8n is a Private App access token. Private Apps replaced the deprecated API keys in 2022 and are scoped to exactly the permissions your workflow needs.

  1. In HubSpot, go to Settings → Integrations → Private AppsCreate a private app
  2. Name the app (e.g. "n8n Automation") and go to the Scopes tab
  3. Select the scopes your workflows need (see callout below). Common ones: crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.deals.read, crm.objects.deals.write, crm.objects.companies.read
  4. Click Create app and copy the access token shown (it is shown once — save it to a password manager)
  5. In n8n: Credentials → New → HubSpot → select Access Token as the auth type → paste the token
Scope selection

Grant only the scopes your workflows actually need. The HubSpot Trigger node requires the crm.objects.contacts.sensitive scope for some events — check the n8n HubSpot Trigger documentation for the exact required scopes per event type. You can update a Private App's scopes later without regenerating the access token.

Workflow: Web Form Submission → HubSpot Contact + Deal

The most common HubSpot automation: a form on your website or landing page creates a HubSpot contact and opens a deal automatically.

  1. Webhook node — receive the form submission POST (or use HubSpot's native form webhook if you are using HubSpot Forms)
  2. Set node — extract: email, first name, last name, company, phone, message, and any UTM parameters
  3. HubSpot node → Contact → Search — search by email to check whether the contact already exists
  4. IF node — if contact found, update it; if not, create a new contact
  5. HubSpot node → Contact → Create or Update — write the contact properties including the lead source UTM parameters as custom HubSpot properties
  6. HubSpot node → Deal → Create — create a new deal associated with the contact, using the message as the deal description and setting the pipeline stage to your "New Lead" stage
  7. Slack node (optional) — notify your sales team: "New lead from {{ $json.email }} — {{ $json.company }}"

This workflow replaces a native HubSpot form integration for cases where your form is custom-built or hosted on a third-party platform. The contact deduplication step (step 3–4) is important — without it, the same lead submitting twice creates duplicate contacts that salespeople have to merge manually.

Workflow: Deal Stage Change → Slack Notification

React to deal pipeline movement in real time — notify the right person when a deal moves to Negotiation, Contract Sent, or Closed Won.

  1. HubSpot Trigger node — event: deal.propertyChange, property name: dealstage
  2. HubSpot node → Deal → Get — fetch the full deal record using {{ $json.objectId }} from the trigger payload (the trigger only sends the changed property, not the full record)
  3. HubSpot node → Contact → Get (optional) — fetch the associated contact for the deal to get the contact's name and email
  4. Switch node — branch on dealstage value (this is the stage ID, not the display name — find your stage IDs in HubSpot's pipeline settings or via the API)
  5. Slack node — post to the relevant channel: e.g. "Deal moved to Closed Won: {{ $json.dealname }} — ${{ $json.amount }}"
Stage IDs, not display names

HubSpot deal stage properties use internal stage IDs (e.g. appointmentscheduled, closedwon, closedlost, and custom IDs like 287640 for custom pipelines). Your Switch node must check against these IDs — the display name in HubSpot's UI is not what the API returns. Fetch your pipeline stage IDs via HubSpot's CRM API: GET /crm/v3/pipelines/deals/{pipelineId}/stages.

Workflow: Deal Closed Won → NetSuite or Accounting System

When a deal closes, your finance and operations teams need to act immediately. This workflow creates a sales order or invoice in your ERP the moment HubSpot closes the deal.

  1. HubSpot Trigger node — event: deal.propertyChange, property: dealstage
  2. IF node — filter: stage ID equals closedwon
  3. HubSpot node → Deal → Get — fetch full deal including line items association
  4. HubSpot node → Contact → Get — fetch associated contact for billing address and email
  5. HTTP Request node — POST to your ERP (NetSuite REST API, QuickBooks API, or similar) with the deal data mapped to the ERP's order fields
  6. HubSpot node → Deal → Update — stamp the ERP order ID back onto a custom HubSpot deal property for reference
  7. Gmail or Slack node — notify the account manager that the order has been created

For HubSpot-to-NetSuite specifically, we have a detailed guide covering the SuiteQL customer lookup, item ID mapping, and multi-currency handling. For QuickBooks, the n8n QuickBooks integration guide covers the invoice and customer creation flows.

Workflow: Contact Property Change → Multi-System Sync

Keep downstream systems updated when a HubSpot contact's data changes — a lifecycle stage update, an opt-out, a new phone number, or an assigned owner change.

  1. HubSpot Trigger node — event: contact.propertyChange, property name: the specific property you want to watch (e.g. lifecyclestage, hs_email_optout)
  2. HubSpot node → Contact → Get — fetch the full contact record using the trigger's objectId
  3. Switch node — branch based on what changed and what action to take
  4. HTTP Request node — update the contact in your downstream system (Intercom, Salesforce, your own database)

One HubSpot Trigger node can only watch one property. To watch multiple properties (e.g. both lifecyclestage and jobtitle), create separate triggers or use a single trigger on a property that aggregates changes, then check all properties in the Get node response.

Common Errors and Fixes

401 Unauthorized

The Private App token is invalid, expired, or missing the required scopes. Regenerate the token in HubSpot's Private Apps settings and ensure the scopes match what your workflow accesses. HubSpot tokens do not expire automatically, but they can be rotated or revoked. Check that the correct token is set in the n8n HubSpot credential.

429 Rate Limit Exceeded

HubSpot Private Apps are rate-limited to 100 requests per 10 seconds (or 150 for accounts with API add-on). If your workflow is processing a large batch of contacts — e.g. syncing 5,000 contacts — add a Wait node between batches or reduce the batch size in the HubSpot node's "Limit" field. The error response includes a Retry-After header — use it in an error workflow to delay and retry.

Contact created but deal not associated

The HubSpot node's Deal → Create operation does not automatically associate the new deal with a contact unless you explicitly set the association. After creating the deal, use the HubSpot node → Association → Create to link the deal (objectType: deals) to the contact (toObjectType: contacts) using the deal ID and contact ID from previous steps.

HubSpot Trigger fires but deals have no line items

The HubSpot Trigger payload only includes the changed property and the object ID — not the full deal record or its associations. To get line items, after the trigger fires, use HubSpot node → Deal → Get with the associations parameter set to include line_items, then fetch each line item separately. This is a two-step process and adds API calls.

Frequently Asked Questions

Does n8n have a native HubSpot node?
Yes. n8n includes both a HubSpot node (for reading and writing CRM data — contacts, companies, deals, tickets) and a HubSpot Trigger node (for reacting to events such as contact property changes, deal stage updates, and contact creation).
How do you connect HubSpot to n8n?
Create a HubSpot Private App in Settings → Integrations → Private Apps. Select the required CRM API scopes, generate the access token, and paste it into a new HubSpot credential in n8n (auth type: Access Token).
What HubSpot CRM scopes does n8n need?
Minimum scopes for most workflows: crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.deals.read, crm.objects.deals.write, crm.objects.companies.read. Add scopes as needed — you can update the Private App's scopes later without regenerating the token.
How do you handle deal stage change webhooks in n8n?
Use the HubSpot Trigger node with deal.propertyChange on the dealstage property. The trigger sends the stage ID (not display name). Use a Switch node to branch on stage ID values, which you can look up via the HubSpot CRM pipelines API.
What is n8n's HubSpot rate limit?
HubSpot Private Apps are limited to 100 API requests per 10 seconds. For batch operations, add a Wait node between batches or reduce batch size. The 429 response includes a Retry-After header.

Need help building a HubSpot automation in n8n? Entech Solutions builds n8n HubSpot workflows for CRM sync, deal pipeline automation, and multi-system orchestration. Get in touch to scope your workflow.