HubSpot + Intercom: Why the Native Integration Creates Duplicates and Loses Context

The native HubSpot and Intercom integration exists — and that is precisely what creates the problem. Companies enable it expecting automatic synchronization of client data between the CRM and the support/chat platform. Instead they get duplicate contacts in HubSpot, lost conversation history, and deal data that never reaches Intercom. Support cannot see what stage of the pipeline the client is at. Sales cannot see that the client complained three times last month.

The problem is not that the integration is poorly built — it does exactly what is advertised. The problem is that “contact synchronization” is not what most companies actually need.

What the Native HubSpot ↔ Intercom Integration Does

The official integration from Intercom (available in the HubSpot App Store) synchronizes:

  • Contacts in one direction: Intercom users -> HubSpot contacts. Creates or updates a contact in HubSpot when a new user appears in Intercom.
  • Basic fields: name, email, phone, company.
  • Intercom attributes -> HubSpot properties: some custom attributes can be mapped to HubSpot properties.

Does not synchronize:
— Conversation history from Intercom into HubSpot
— HubSpot Deal data into Intercom (deal stage, amount, owner)
— HubSpot Company data into Intercom Companies
— Intercom tags -> HubSpot lists or properties
— HubSpot Workflow events -> Intercom

Where the Standard Connector Specifically Breaks

Problem 1: Duplicate Contacts

Intercom identifies users by user_id (your application’s internal ID) or by email. HubSpot identifies contacts by email.

Duplicate scenario:

  1. User registered with john@company.com -> created in Intercom -> synced to HubSpot
  2. The same user started a chat as John Smith without logging in -> created as an anonymous lead in Intercom with a different ID
  3. Later logged in -> Intercom merges sessions internally, but HubSpot already has a second contact

The native integration does not deduplicate — it creates a new contact in HubSpot for every new Intercom user. Result: the same company has 3–5 contacts in HubSpot with partially overlapping data.

Problem 2: Lost Conversation History

The support team resolves tickets in Intercom. A sales manager opens a contact in HubSpot — and sees only basic fields. They do not see: the client complained about a bug on Monday, requested a refund on Tuesday, and ultimately decided to stay on Wednesday.

The native integration does not pass conversations. The manager calls the client with a pitch — not knowing they are frustrated about a bug. The relationship suffers.

Problem 3: Intercom Does Not Know the Deal Status

A client has been at the “Negotiation” stage in HubSpot for 3 weeks. They write to the Intercom chat with a question — the support agent responds like a regular user, unaware that this is a hot lead.

The support agent could have: prioritized the response, brought in the account manager, avoided sending the standard “read the documentation” reply.

The integration does not pass HubSpot Deal data into Intercom -> the agent is blind to the sales context.

Problem 4: Desynchronization on Updates

If a contact is updated in HubSpot (for example, email or company changed) — Intercom is not notified. The native integration is one-directional: Intercom -> HubSpot. There is no reverse flow.

The same contact in HubSpot and Intercom will diverge on fields after 6 months of use.

What Is Needed Instead of the Native Integration

For real synchronization, three data flows are needed:

1. Intercom -> HubSpot (with deduplication):
— New Intercom user -> search by email in HubSpot -> create or update contact
— Intercom tags (paying, churned, trial) -> HubSpot properties or lists
— Closed ticket -> Note in HubSpot with conversation summary

2. HubSpot -> Intercom:
— Deal Stage change -> update Intercom user attribute (deal_stage: "negotiation")
— Lifecycle Stage changed to Customer -> tag in Intercom, launch onboarding sequence
— HubSpot Company data -> Intercom Company attributes (MRR, plan, industry)

3. Conversation history -> HubSpot:
— When a conversation is closed in Intercom -> create a Note in HubSpot with the text + CSAT rating
— Number of open tickets -> custom contact property in HubSpot

Technical Scheme of the Custom Integration

Intercom Webhooks -> Backend -> HubSpot API:

Intercom: topic = conversation.closed
-> Backend:
   1. GET conversation thread (Intercom API)
   2. Extract contact email, summary, CSAT
   3. HubSpot: search contact by email
      -> found: create Note on contact
      -> not found: create contact + note
   4. Increment property "intercom_tickets_30d" on contact

HubSpot Workflows -> Backend -> Intercom API:

HubSpot Workflow: Deal Stage = "Customer Won"
-> Webhook Action -> Backend
-> Intercom API:
   GET /contacts?email={contact_email}
   PUT /contacts/{id}
   { "custom_attributes": {
     "deal_stage": "won",
     "deal_value": {amount},
     "account_manager": {manager_name}
   }}
   POST /tags (add tag "customer")

Deduplication:

def find_or_create_hubspot_contact(email, intercom_data):
    # Search by email
    results = hubspot.crm.contacts.search_api.do_search(
        PublicObjectSearchRequest(
            filter_groups=[{"filters": [{"propertyName": "email",
                                         "operator": "EQ", "value": email}]}]
        )
    )
    if results.total > 0:
        # Update existing
        contact_id = results.results[0].id
        hubspot.crm.contacts.basic_api.update(contact_id, ...)
        return contact_id
    else:
        # Create new
        return hubspot.crm.contacts.basic_api.create(...).id

Comparison: Native vs Custom Integration

CapabilityNativeCustom
Intercom -> HubSpot contactsYes (no deduplication)Yes (with deduplication)
HubSpot -> Intercom dataNoYes
Conversation history in HubSpotNoYes (as Notes)
Deal Stage in IntercomNoYes
Intercom tags -> HubSpotNoYes
CSAT -> HubSpot propertyNoYes
Two-way synchronizationNoYes
Contact deduplicationNoYes

Real-World Case

SaaS company (60 clients, $1,000–5,000 MRR each, team: 3 sales + 2 support):

  • Enabled native integration -> after 3 months: 340 contacts in HubSpot instead of 60 real clients (duplicates)
  • Managers spent 20+ minutes cleaning duplicates before every QBR
  • Support agent did not know the client was on a watchlist due to overdue payments

After custom integration:
— Deduplication by email: 340 -> 67 unique contacts (7 genuinely new ones that were missing)
deal_stage attribute in Intercom: agents see “this contact is a hot lead at Negotiation”
— CSAT < 4 -> task for the manager in HubSpot: “Check in with the client after ticket closure”

Who This Is Relevant For

A custom HubSpot + Intercom integration makes sense if:
— One team manages sales in HubSpot, another manages support in Intercom
— It is important for support to see the client’s deal status
— Duplicates have accumulated after using the native integration
— CSAT and ticket history need to be passed to the CRM for a complete view of the client

Similar problems arise with other native HubSpot integrations — read about HubSpot + Calendly and HubSpot + Typeform.

Frequently Asked Questions

The Intercom App Store offers several HubSpot integrations — are they all the same?

No. There is the official Intercom integration and several third-party ones (from Hull, Zapier, and others). The official one is the most limited in features but the most stable. Third-party options offer more mapping fields but require additional subscriptions and have their own limitations. None of the out-of-the-box integrations fully resolves the duplicate and two-way sync problems.

How do you clean up duplicates that have already accumulated in HubSpot after the native integration?

HubSpot has a built-in Duplicates Manager (Contacts -> Actions -> Manage Duplicates). It finds potential duplicates based on matching email, name, and phone and offers to merge them. For a large number of duplicates (1,000+), a script via the HubSpot API is recommended: search for contacts with the same email, automatic merging with full history preservation.

Can Zapier be used for two-way synchronization?

Partially. Zapier covers simple scenarios: ticket closed in Intercom -> create Note in HubSpot. For two-way synchronization with deduplication and Deal Stage transfer — Zapier lacks the conditional logic and reliability needed under high load. At 100+ events per day, Zapier starts dropping and delaying events.

Intercom stores conversation history — why can’t it simply be opened in HubSpot?

HubSpot and Intercom are different systems with different data stores. HubSpot does not “see” Intercom conversations directly — only what has been explicitly passed via API. This is a fundamental architectural limitation, not a shortcoming of the native integration.

Summary

  • The native HubSpot + Intercom integration syncs only contacts in one direction — without deduplication
  • Core problems: duplicate contacts, lost conversation history, Intercom is blind to deal status
  • Custom integration: two-way sync, email deduplication, CSAT and conversation history in HubSpot
  • With a large duplicate base, initial cleanup via Duplicates Manager or a script is required
  • Typical development timeline — 3–4 weeks

If you use HubSpot and Intercom and see duplicates or fragmented data — describe your workflow. Exceltic.dev will assess the scope of the problem and propose a concrete solution.

More articles

All →