# HubSpot Intercom integration

*HubSpot → Intercom*

**In short:** A HubSpot to Intercom integration keeps the same person and company consistent across your CRM and your messaging tool. It pushes HubSpot contacts, companies, lifecycle stages, and list memberships into Intercom - matched on a stable external ID rather than a fragile email - so support and onboarding see who they are talking to, and it feeds Intercom conversations, tags, and ticket outcomes back to the HubSpot timeline so sales and marketing see the whole relationship. Done properly it is not a one-way contact dump: it is a two-way, idempotent pipeline that respects rate limits, consent, and update ordering.

## What a HubSpot to Intercom integration actually does

HubSpot is where the commercial relationship lives - who the contact is, which company they belong to, their lifecycle stage, which marketing lists they are on, the deal in flight. Intercom is where the conversation lives - the onboarding message, the support thread, the tags an agent applied, the ticket that got resolved yesterday. Both tools describe the same people, and both are wrong about each other most of the time.

A HubSpot to Intercom integration closes that gap so neither team is guessing. Support opens a conversation and already sees the plan tier, owner, and renewal date pulled from HubSpot. Sales opens a HubSpot record and sees the last Intercom conversation, the open ticket, and the tags that say this account is unhappy. Nobody copies a field between two browser tabs, and the two systems stop drifting apart the day after someone last reconciled them by hand.

## What data moves

| HubSpot object / event | Becomes in Intercom | Notes |
| --- | --- | --- |
| Contact | Contact (user or lead) | Matched on external_id (HubSpot record ID), email as fallback |
| Company | Company | Linked to the contact via company membership |
| Lifecycle stage | Custom data attribute | Subscriber / lead / MQL / SQL / customer mapped to a fixed attribute |
| Contact & company properties | Custom data attributes | Plan tier, owner, renewal date, MRR - the attribute map is agreed once |
| Active list membership | Tag or segment signal | Drives Intercom audiences without re-building the segment logic |
| Marketing consent / subscription | Subscription state | Consent is respected, never blindly overwritten |

And back the other way, so HubSpot reflects what actually happened in Intercom:

| Intercom event | Becomes in HubSpot | Notes |
| --- | --- | --- |
| Conversation opened / closed | Timeline event or engagement | Last-contacted date and conversation count kept current |
| Applied tags | Contact / company property | e.g. "at risk", "expansion", "bug reported" |
| Ticket resolved | Property update or timeline entry | Support outcome visible to the account owner |

The exact property-to-attribute map and the direction of each field are agreed once and encoded in the pipeline. After that, nobody maps anything by hand.

## The details that break naive syncs

A generic connector gets you contacts-in-Intercom and stops before the expensive parts:

- **Identity matching.** Intercom does not enforce one contact per email - a lead and a user can share one, and addresses change. Match on email alone and you get duplicates and lost updates. The HubSpot record ID has to be written into Intercom's external_id and used as the primary key.
- **Custom data attributes must exist first.** Intercom will not accept a write to an attribute that has not been created, and attribute types are fixed once set. A HubSpot enumeration, multi-checkbox, or date (stored as an epoch) has to be mapped to the right Intercom type - Intercom timestamps are Unix seconds - and the attributes provisioned before the first sync.
- **Rate limits differ on both sides.** HubSpot meters requests per app over a rolling window and enforces daily caps; Intercom meters per minute. A full re-sync that ignores this gets throttled and half-completes. The pipeline batches, respects each limit, and back-pressures instead of failing.
- **Delta vs full sync.** Steady state runs on HubSpot property-change webhooks and Intercom webhook topics; the initial load and any recovery run as a full pass using HubSpot's search-by-lastmodified and Intercom's scroll API. Both have to converge to the same result.
- **Update ordering and ownership.** Two updates for the same contact can arrive out of order. Without a rule, the older one wins and silently reverts a field. We compare update timestamps and, more importantly, define per field which system owns it so there is never an ambiguous fight.
- **Consent.** Marketing subscription status and unsubscribes must not be overwritten by a blind sync. Consent is treated as owned by one system and only ever moved in the safe direction.
- **Partial failures.** In a batch of 100, one bad record must not fail the other 99. Failed items are isolated, retried, and surfaced - never silently dropped.

## How we build and run it

We treat this as a pipeline, not a nightly script. Changes are picked up by webhook where the platforms support it and by scheduled delta pass otherwise, validated, transformed into the agreed mapping, and written with idempotency so a retry or replay never creates a duplicate contact or a double-counted conversation.

It runs on cloud-native, fully EU-hosted AWS infrastructure, so contact and conversation data never leaves the EU, which keeps your DPA / AVV and your GDPR obligations clean. Every record carries a stable identifier end to end, so the pipeline always knows what it has already sent.

Then we keep it running. Monitoring, alerting, incident response, and - critically - watching for HubSpot and Intercom API changes, deprecated webhook topics, and tightened rate limits are our responsibility under contract. You get a named owner and an SLA, not a maintenance burden.

## When this integration is worth building

If you have a few hundred contacts, one lifecycle definition, and support rarely needs more than an email address, the native app or a manual export is genuinely fine and we will tell you so. The integration earns its place when the contact count and change rate make manual reconciliation a chore, when your custom properties and lifecycle logic have to be reflected accurately in Intercom, when sales needs Intercom conversation and ticket signals on the HubSpot timeline, or when a flaky connector keeps dropping updates and someone is quietly fixing it by hand every week.

## Frequently asked questions

### Does HubSpot not already have a native Intercom app?

There is a listed connector, and for a small team that only needs contacts to appear in Intercom it can be enough. It tends to fall short on the parts that matter at scale: reliable identity matching when the same email exists as both a lead and a user, syncing your specific custom properties and lifecycle logic, pushing Intercom conversation outcomes back onto the HubSpot timeline, and any control over rate limits, ordering, or error handling. A managed pipeline exists for exactly the cases the app leaves on your desk.

### How do you stop duplicate contacts appearing in Intercom?

Email alone is not a safe key - Intercom allows several contacts to share an email (a lead and a user, for example), and people change addresses. We write the HubSpot record ID into the Intercom external_id and match on that first, falling back to email only when no external_id exists. That gives one stable Intercom contact per HubSpot contact, so an email change updates the existing record instead of creating a second one.

### Can it sync custom properties, not just name and email?

Yes, and this is usually the point of the project. Any HubSpot property - lifecycle stage, plan tier, account owner, renewal date, MRR - can map to an Intercom custom data attribute, and Intercom conversation data can map back to HubSpot properties or timeline events. Note that Intercom custom data attributes have to be created in Intercom before anything can write to them, and their types are fixed, so we agree the attribute map with you up front and provision it once.

### Which way does the data flow?

Usually both, and the direction is decided per field to avoid the systems overwriting each other. HubSpot is typically the source of truth for identity, company, and lifecycle data flowing into Intercom, while Intercom is the source of truth for conversation counts, last-contacted dates, tags, and ticket outcomes flowing back to HubSpot. We define ownership field by field so there is never an ambiguous last-write-wins fight.

### Who operates it after it goes live?

We do. The pipeline runs on cloud-native, fully EU-hosted infrastructure that we monitor. If HubSpot or Intercom changes an API, deprecates a webhook topic, or tightens a rate limit, that is our problem to fix under contract, not a silent breakage your team discovers when a segment stops updating. You get a named owner, alerting, and an SLA instead of a script nobody remembers building.

## Related integrations

- [HubSpot ↔ Mailchimp](https://seamless.engineering/integrations/hubspot-mailchimp/): HubSpot Mailchimp integration
- [HubSpot ↔ Pipedrive](https://seamless.engineering/integrations/hubspot-pipedrive/): HubSpot Pipedrive integration
- [HubSpot ↔ Salesforce](https://seamless.engineering/integrations/hubspot-salesforce/): HubSpot Salesforce integration
- [Business Central ↔ HubSpot](https://seamless.engineering/integrations/business-central-hubspot/): Business Central HubSpot integration
- [HubSpot ↔ QuickBooks](https://seamless.engineering/integrations/hubspot-quickbooks/): HubSpot QuickBooks integration
- [Intercom ↔ Salesforce](https://seamless.engineering/integrations/intercom-salesforce/): Intercom Salesforce integration

## Browse by system

- [All HubSpot integrations](https://seamless.engineering/integrations/hubspot/)
- [HubSpot API changelog](https://seamless.engineering/api-changelog/hubspot/): 8 breaking changes and 2 deprecations in the last 90 days

## Request a scoping call

Need this integration built and permanently operated? Tell us which systems connect and what data has to move. Fixed-price scoping quote within 48 hours.

- Email: hello@seamless.engineering
- Contact form: https://seamless.engineering/#contact
