HubSpot
Push leads as Contacts with lifecyclestage = lead. OAuth or private app token.
Pushes leads as Contacts in HubSpot, with lifecyclestage = lead,
plus a Note on the contact's timeline carrying the event details and the
proposal link — your sales team can jump straight to it.
Connecting
Recommended — OAuth: open Integrations → New integration → HubSpot and click Connect HubSpot. You'll log into your own HubSpot portal and approve access (contacts + notes); tokens are stored encrypted and refresh automatically, and you can revoke access from HubSpot at any time.
Manual fallback — Private App token (also your own account):
- In HubSpot, create a Private App from Settings → Integrations → Private apps.
- Give it scopes:
crm.objects.contacts.read,crm.objects.contacts.write, andcrm.objects.notes.write(for the timeline note — without it, the contact still pushes and the note is skipped). - Copy the access token (it starts with
pat-…) and paste it into the integration form.
Either way, credentials are encrypted at rest and belong to your account — Innkept never routes your leads through a shared CRM login.
What gets pushed
| HubSpot property | From |
|---|---|
email | Lead email |
firstname / lastname | Lead name (split on first space) |
phone | Lead phone (if provided) |
lifecyclestage | lead |
| Timeline note | Event type + date, guest count, quote total, proposal URL |
Additional event details (date, guest count, proposal URL) are appended as custom properties if you've created them in HubSpot. You can map them via the integration's Field mapping field — see How push works.
Deduplication
We push with HubSpot's upsert API keyed on email: if the lead's email already exists in your portal, that contact is updated in place (and gets a fresh timeline note); otherwise a new contact is created. A returning enquirer never produces a duplicate — and never a failed push.
Pipeline stage
We don't push pipeline stage. HubSpot lifecycle stages and Innkept lead statuses don't align cleanly — and your sales team's workflow probably uses a custom pipeline that we can't predict. If you want pipeline assignment, set up a HubSpot workflow on Contact created with lifecyclestage = lead as the trigger.
Suggested HubSpot properties to create
These don't exist by default in HubSpot. Create them as Single-line text or Number properties on the Contact object:
innkept_event_date— dateinnkept_event_type— single-line text (wedding, corporate, etc.)innkept_guest_count— numberinnkept_proposal_url— single-line textinnkept_quote_total— number
Then map them in the integration's field mapping. Once mapped, the next lead push populates them.
Errors you might see
| Error | Cause | Fix |
|---|---|---|
| 401 Unauthorised | Token revoked or expired | Regenerate the token in HubSpot, paste again. |
| 403 Forbidden | Token missing required scope | Edit the Private App in HubSpot, add crm.objects.contacts.write. |
| 429 Too many requests | HubSpot rate limit hit | Self-heals — Innkept retries with backoff. |
Something missing or wrong? Tell us.
Updated regularly. UK English. No AI slop.