Native integrationAll plans

HubSpot integration: two-way contact and deal sync

Push ZenMode contacts, deals and activities into HubSpot and pull contacts, deals and notes back, on three sync triggers.

Verified against the product on September 3, 2026 · Updated · Set up in /dashboard/settings

What this integration is

HubSpot is a native OAuth integration. You click Connect, approve ZenMode on HubSpot's consent screen, and ZenMode stores and refreshes the tokens for you — there is no API key to paste, and nothing sits in between the two products. It runs in both directions: ZenMode pushes contacts, deals and activities into your HubSpot portal, and pulls contacts, deals and notes back. There is no plan gate on it; the connection is tied to the ZenMode account you are signed in as.

What syncs

WhatDirectionExact fields written or read
ContactsZenMode → HubSpotfirstname, lastname, email, phone, company, jobtitle, hs_linkedin_url
DealsZenMode → HubSpotdealname, amount, dealstage, closedate, associated to the contact
ActivitiesZenMode → HubSpotWritten as HubSpot notes: hs_timestamp, hs_note_body, associated to the contact
ContactsHubSpot → ZenModePulled on each sync, capped at 1,000 contacts per run
DealsHubSpot → ZenModePulled on each sync
ActivitiesHubSpot → ZenModeNotes only, up to 50 per run

A contact push first searches HubSpot by email, then updates the match or creates a new record — so reconnecting or re-syncing does not litter your portal with duplicates. Deals are associated to their contact rather than left floating.

What does not sync: nothing outside that table moves. The activity pull reads notes only, so calls, emails and tasks logged natively in HubSpot stay in HubSpot. hs_note_body defaults to a short line naming the activity type and saying it was logged from ZenMode, not the message text. And the contact pull stops at 1,000 records per run, so a very large portal is caught up across several syncs rather than one.

HubSpot Meetings booking detection

Booking detection is a separate piece of wiring from the CRM sync above — a different inbound webhook, with its own parser. HubSpot Meetings is one of four providers ZenMode parses properly (the others are Calendly, Cal.com and Acuity Scheduling); for HubSpot it reads properties.firstname.value, lastname and email out of the payload. When a booking arrives, ZenMode promotes that connection to meeting_booked and stamps the time. The promotion is one-way only: a lead already further along is never knocked backwards. Attribution uses the signed token on the tracked calendar link the prospect clicked, falling back to a name match.

How to set it up

  1. Go to /dashboard/settings (the same card also appears on /dashboard/crm) and click "Connect HubSpot".
  2. Approve ZenMode on HubSpot's consent screen. You are returned to ZenMode with the connection live — there is nothing else to configure for the sync itself.
  3. On the HubSpot card, decide whether to turn auto-sync on. It is off by default. The same card carries Sync Now and Disconnect.
  4. For booking detection, open the Calendar section of Settings, choose HubSpot, and copy the tokenized webhook URL ZenMode shows you. That URL is unique to your account — paste it into HubSpot as the destination for Meetings booking events.

When it runs

Three triggers, and only three:

  • Manual — the Sync Now button on the HubSpot card runs a full sync on demand.
  • On write — a contact or deal changing in ZenMode pushes immediately, but only when auto-sync is enabled, and auto-sync is off unless you turn it on.
  • Nightly — a scheduled run at 06:00 UTC.

That is push-on-write plus a daily catch-up, not a continuous feed. The Meetings webhook is different: it fires when the booking event happens, and is authenticated by the token embedded in the URL you pasted into HubSpot.

What it's useful for

A reply lands in ZenMode, the contact is pushed with their LinkedIn URL on hs_linkedin_url, and whoever owns the account picks the conversation up inside HubSpot without retyping anything. A deal you open in ZenMode's CRM appears in your HubSpot pipeline with its stage, value and close date, so forecasting stays in one place. And a prospect who books through HubSpot Meetings flips to meeting_booked in ZenMode automatically, which keeps your ZenMode reporting honest without anyone marking rows by hand.

What it doesn't do (yet)

  • The HubSpot inbound change webhook is not registered automatically. The receiving route exists and pulls a five-minute window when called, but nothing registers it with HubSpot on your behalf, its URL is not shown anywhere in the product, and it does no signature verification. In practice, a change made in HubSpot reaches ZenMode on the next sync — not the moment it happens.
  • An older API-key-based HubSpot sync exists in the codebase with no UI, and it is broken. The OAuth integration described here is the working one.
  • Booking detection covers Calendly, Cal.com, HubSpot Meetings and Acuity. Microsoft Bookings, Google Calendar, Chili Piper, SavvyCal and "Other" are link-and-click tracking only — no automatic booking detection.

FAQ

Which plans include the HubSpot integration?

All of them. Neither the CRM integrations nor the CRM webhooks carry a plan gate — the only integration surface that does is the public REST API, which needs Practitioner or above. Full tiers are on pricing.

Does connecting HubSpot need my LinkedIn password?

No. Integrations never touch LinkedIn credentials. Connecting HubSpot is an OAuth handshake with HubSpot and nothing else.

Is it two-way?

Yes for data — contacts, deals and notes move in both directions. It is not two-way in real time: inbound changes arrive on the next sync, because the HubSpot change webhook is not registered for you. If you are choosing between connectors, Salesforce and Monday.com run on the same three triggers.