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 fordealstageproperty → 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.
- In HubSpot, go to Settings → Integrations → Private Apps → Create a private app
- Name the app (e.g. "n8n Automation") and go to the Scopes tab
- 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 - Click Create app and copy the access token shown (it is shown once — save it to a password manager)
- In n8n: Credentials → New → HubSpot → select Access Token as the auth type → paste the token
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.
- Webhook node — receive the form submission POST (or use HubSpot's native form webhook if you are using HubSpot Forms)
- Set node — extract: email, first name, last name, company, phone, message, and any UTM parameters
- HubSpot node → Contact → Search — search by email to check whether the contact already exists
- IF node — if contact found, update it; if not, create a new contact
- HubSpot node → Contact → Create or Update — write the contact properties including the lead source UTM parameters as custom HubSpot properties
- 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
- 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.
- HubSpot Trigger node — event:
deal.propertyChange, property name:dealstage - 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) - HubSpot node → Contact → Get (optional) — fetch the associated contact for the deal to get the contact's name and email
- Switch node — branch on
dealstagevalue (this is the stage ID, not the display name — find your stage IDs in HubSpot's pipeline settings or via the API) - Slack node — post to the relevant channel: e.g. "Deal moved to Closed Won: {{ $json.dealname }} — ${{ $json.amount }}"
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.
- HubSpot Trigger node — event:
deal.propertyChange, property:dealstage - IF node — filter: stage ID equals
closedwon - HubSpot node → Deal → Get — fetch full deal including line items association
- HubSpot node → Contact → Get — fetch associated contact for billing address and email
- 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
- HubSpot node → Deal → Update — stamp the ERP order ID back onto a custom HubSpot deal property for reference
- 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.
- HubSpot Trigger node — event:
contact.propertyChange, property name: the specific property you want to watch (e.g.lifecyclestage,hs_email_optout) - HubSpot node → Contact → Get — fetch the full contact record using the trigger's
objectId - Switch node — branch based on what changed and what action to take
- 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.propertyChangeon thedealstageproperty. 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.