HubSpot
Connect HubSpot for identity stitching and deal-stage conversions.
Connecting HubSpot does two things:
- Identity — links anonymous browser sessions to a CRM contact, so a journey that started weeks before signup still gets credited.
- Conversions — tells Simmer when a contact submits your conversion form (a lead), when a deal moves into a configured sales-qualified stage (a sales qualified lead), and when a deal moves to closed-won (revenue).
- Converted journey labels — shows the company or contact name tied to an attributed lead, sales qualified lead, or deal journey.
The connection is read-only: Simmer never writes contacts, deals, or properties back into HubSpot.
Connect via OAuth
In the dashboard, go to Settings → Integrations → Connect HubSpot. You'll be redirected to HubSpot to authorize, then back to Simmer. Simmer requests these scopes:
crm.objects.contacts.readcrm.objects.companies.readcrm.objects.deals.read
Tokens are encrypted at rest and refreshed automatically.
Pick the conversion form
A conversion is the form submission that counts as a lead in your funnel — typically "Request a demo", "Talk to sales", or "Sign up". You select which HubSpot form represents this in Settings → HubSpot → Conversion form.
Only submissions of the selected form count toward the Website Lead Attribution metric. Other form submissions are still tracked, but as ordinary engagement events.
Hidden field
This is the most important part of the HubSpot setup. Without it, leads that arrived weeks before they filled in the form can't be linked back to their browsing history.
Simmer needs a way to write the visitor's anonymous browser ID onto the contact at the moment they submit the form. This is done with a hidden form field whose internal name is simmer_id.
Step 1 — Create the contact property
In HubSpot, go to Settings → Properties → Contact properties → Create property:
- Group: any (Contact information is fine)
- Label:
Simmer ID - Internal name:
simmer_id(must be exactly this — the pixel writes to this name) - Field type: Single-line text
Step 2 — Add the field to your conversion form
Open the form you selected as the conversion form, then:
- Drag the
Simmer IDproperty onto the form. - In the field options, set it to Hidden.
- Leave the default value blank.
- Save and republish the form.
That's it. The pixel detects the form, fills the field with the current anonymous_id on submit, and HubSpot stores it on the contact. Simmer's webhook reads the property and links the contact to the browser session.
What happens if the field isn't there
If the contact was created through a HubSpot form (source FORM or FORMS) but simmer_id is absent, Simmer still records a lead conversion using the contact's CRM creation date. The contact appears in the Journeys dashboard as an Untracked lead — it counts toward Website leads but receives no channel credit, no touchpoints, and no journey path, because no browsing history can be linked to it. The path column shows No website activity captured.
If the contact was not created through a form (imported, manually created, or created via API), it is not recorded as a website-origin lead and does not appear under Website leads at all.
What Simmer ingests
Simmer subscribes to HubSpot webhook events that affect identity, conversions, and converted journey labels:
| Event | What Simmer does |
|---|---|
| Contact created | Reads email, simmer_id, hs_object_source, and createdate. Creates an identity link and records a lead conversion when the contact source is a HubSpot form (FORM or FORMS), with or without a simmer_id. The conversion date is the CRM contact creation time (createdate). |
| Contact email, first name, or last name changed | Updates identity or the contact-name fallback shown for converted journeys. |
| Deal stage changed to a configured sales-qualified stage | Records a sales qualified lead conversion (count-only, no revenue). The contact is assigned to an open deal — useful for tracking pipeline entry separately from a closed win. |
| Deal stage changed to closed-won | Records a conversion with the deal amount as revenue. |
| Deal–contact association added | Links the deal to all associated contacts for multi-contact journeys. |
| Contact–company or deal–company association changed | Refreshes the company name shown on existing converted journeys. |
| Company name or domain changed | Refreshes the company label shown on existing converted journeys. |
Webhooks are configured automatically when you connect — there's nothing to set up in HubSpot.
Sales qualified leads
A sales qualified lead is a contact assigned to a HubSpot deal in a non-closed-won pipeline stage. It lets you track funnel entry — when a prospect moves into an active pipeline stage — as a separate conversion from a closed win.
Sales qualified lead conversions are count-only: they carry zero revenue, the same as a form-submission lead. If that deal later closes, Simmer records a separate closed-won conversion alongside it; both coexist so you can see the full funnel in the Journeys dashboard.
Sales qualified leads are opt-in and require deal stage configuration on your project. Contact support to configure which pipeline stages qualify.
Converted journeys
The Converted mode on the Journeys dashboard shows one participant conversion row for each included HubSpot lead, sales qualified lead, or closed-won deal, so a multi-contact deal can appear as multiple rows. Simmer shows the best available buyer label in this order:
- The contact's associated company.
- The deal's associated company.
- The contact name.
- The contact email.
- The HubSpot contact or deal ID as a stable fallback (for example,
HubSpot contact 12345orHubSpot deal 67890).
When the contact email is used as the buyer label, Simmer still shows it under the label row so you can distinguish multiple contacts at the same company once enrichment is complete.
Revenue in this table is the participant's allocated revenue for that journey, not necessarily the full deal amount.
If a HubSpot lead came from a form-source contact but no browsing history can be linked, it appears as Untracked lead — the path shows No website activity captured and no channel is credited. If any other conversion has no attributed path yet, it appears as Unexplained rather than disappearing from the table.
Troubleshooting
The form submits but simmer_id is empty on the contact.
The visitor probably hadn't granted cookie consent before submitting. The pixel only writes the anonymous ID when consent is granted. You can confirm by opening dev tools and checking that window.attrib exists and a simmer_id cookie is present before submitting.
A new contact shows up but isn't attributed.
A contact created through a HubSpot form without simmer_id appears as an Untracked lead in Converted Journeys — it is counted as a website lead but cannot be linked to browsing history. A contact created outside the tracked website (imports, API, other integrations) is not recorded as a website-origin lead and does not appear under Website leads at all.
Deals close but revenue doesn't appear in attribution.
Confirm the deal stage is mapped to closed-won in your HubSpot pipeline, and that at least one associated contact has a simmer_id value with tracked browsing history.
No sales qualified leads appear in Converted journeys. Sales qualified leads are opt-in and require deal stage configuration. Contact support to set the pipeline stages that should count as sales qualified. Once configured, Simmer records an SQL conversion the next time a deal moves into one of those stages — history is not backfilled automatically.
Converted journeys show a contact name instead of a company. The contact may not have an associated company, or the connection may need the company read permission. Reconnect HubSpot from Settings to grant the latest scopes.
Token errors after a long period of inactivity. HubSpot access tokens expire every 30 minutes. Simmer refreshes automatically, but if the refresh token was revoked (e.g. the connecting user lost portal access), you'll need to reconnect via Settings → Integrations.