Intercom v2 Cloud Mode Integration
Send events to Intercom using RudderStack cloud mode.
After you have successfully instrumented Intercom v2 as a destination in RudderStack, follow this guide to correctly send your events to Intercom in cloud mode.
Find the open source transformer code for this destination in the GitHub repository.
Identify
You can use the identify call to create or update an user in Intercom.
A sampleidentify call is shown:
rudderanalytics.identify("1hKOmRA4GRlm", {
name: "Alex Keener",
email: "alex@example.com",
company: {
id: "group01",
name: "Tech Group",
},
createdAt: "Mon May 19 2019 18:34:24 GMT+0000 (UTC)",
})
Remove user from company
To remove users from a company, pass remove: true in the company object, as shown:
rudderanalytics.identify("1hKOmRA4GRlm", {
name: "Alex Keener",
email: "alex@example.com",
company: {
id: "group01",
name: "Tech Group",
remove: true
},
createdAt: "Mon May 19 2019 18:34:24 GMT+0000 (UTC)",
})
Unsubscribe user
To unsubscribe users from emails, pass unsubscribedFromEmails: true in the context object:
rudderanalytics.identify("1hKOmRA4GRlm", {
name: "Alex Keener",
email: "alex@example.com",
company: {
id: "group01",
name: "Tech Group",
},
unsubscribedFromEmails: true,
createdAt: "Mon May 19 2019 18:34:24 GMT+0000 (UTC)",
})
Associate user with a company
To link a user to a company, use the group call.

RudderStack does not support Intercom’s
Last Seen feature currently.
Traits mapping
The following table lists the mapping of the RudderStack traits to the Intercom properties:
| RudderStack trait | Intercom property |
|---|
userId
traits.userId
traits.id
context.traits.userId
context.traits.id Required, if email is absent. | external_id |
traits.email
context.traits.email Required, if userId is absent. | email |
traits.phone
context.traits.phone | phone |
traits.avatar
context.traits.avatar | avatar |
traits.name
context.traits.name | name |
traits.role
context.traits.role | role |
traits.ownerId
context.traits.ownerId | owner_id |
traits.createdAt
context.traits.createdAt | signed_up_at |
traits.unsubscribedFromEmails
context.traits.unsubscribedFromEmails | unsubscribed_from_emails |
context.traits.lastSeenAt
last_seen_at | last_seen_at |
Track
The track call lets you track user’s actions along with any properties associated with those actions.

You must identify a user with a valid userId or email before making any track calls to Intercom.
A sample track call sent to Intercom is shown:
rudderanalytics.track("Order Completed", {
order_id: "140021222",
email: "alex@example.com",
checkout_id: "EAP3211",
products: "Sports Shoes",
total: 145.99,
currency: "USD"
})
Note that:
- You must include any one of the
userId, email, or id fields to send a track call to Intercom successfully. - RudderStack converts and sends all
track event properties as per the Intercom API.
Properties mapping
The following table lists the mapping of the RudderStack track properties to the Intercom properties:
| RudderStack property | Intercom property |
|---|
userId
traits.userId
traits.id
context.traits.userId
context.traits.id Required, if email is absent. | user_id |
traits.email
context.traits.email Required, if userId is absent. | email |
event Required | event_name |
timestamp | created_at |
properties | metadata |
properties.id
traits.id | id |
Group
The group call lets you link an identified user to a group like a company, organization, or an account. Along with that, you can add tags to a company.
RudderStack uses this information to create or update a company in Intercom using their /companies endpoint.
A sample group call is shown below:
rudderanalytics.group("group123", {
name: "companyName",
industry: "IT",
employees: 450
})
Note that RudderStack requires a groupId (group123 in the above example) to send group events to Intercom. It maps this field to Intercom’s company_id field.
Supported mappings
The following table lists the mapping of the RudderStack group traits to the Intercom properties:
| RudderStack trait | Intercom property |
|---|
groupId Required | company_id |
name | name |
website | website |
traits.plan
context.traits.plan | plan |
traits.size
context.traits.size | size |
traits.industry
context.traits.industry | industry |
traits.monthlySpend
context.traits.monthlySpend | monthly_spend |
traits.remoteCreatedAt
context.traits.remoteCreatedAt | remote_created_at |
traits | custom_attributes |
context.traits.tags | Maps to tag names in Intercom |
User lookup
RudderStack supports user lookup in identify and group calls. By default, it performs the lookup using the email field. However, you can provide a custom field for the lookup using the event’s integrations object.
Note that:
- You can only send the fields accepted by Intercom for user lookup. These fields are case sensitive.
- The field you pass for the lookup must be present in the event.
A sample identify event highlighting this feature:
rudderanalytics.identify('1hKOmRA4el9Z', {
email: 'alex@example.com',
phone: '+1-202-555-0146',
}, {
integrations: {
INTERCOM: {
lookup: 'phone'
}
}
});
Troubleshooting
| Error | Reason | Solution |
|---|
| Cannot have more than 120 active event names | You have sent more than 120 event names in your track calls.
Once the event limit is reached, Intercom does not store any new events and returns this error. | Archive any unused events in your Intercom dashboard by going to Settings > Intercom Data > Events.
See Intercom documentation for more information. |
Send custom attributes

You need to ensure that the custom attributes you are sending to Intercom in your identify and group events are defined in the Intercom dashboard already. Otherwise, your events might fail.
RudderStack supports sending custom attributes (custom_attributes) to Intercom at a user and company level (identify and group calls).
Intercom validates the custom attribute first, meaning it throws an error if a custom attribute present in the event is not defined in the Intercom dashboard already.
See the Intercom documentation for more information on creating and sending custom attributes to Intercom.
Use case
The following use case highlights how RudderStack considers and sends custom attributes to Intercom.
Suppose you send the following identify call to Intercom:
rudderanalytics.identify(
"alex98", {
name: "Alex Keener",
createdAt: "2024-01-05T19:11:00.337Z",
email: "alex@example.com",
phone: "+800 555‑0100",
address: {
city: "New Orleans",
state: "Louisiana",
},
plan: "enterprise",
}, {
integrations: {
INTERCOM: {
lookup: "phone",
},
},
});
RudderStack extracts the following standard Intercom attributes from the event payload:
userIdemailphonenamecreatedAt
Standard Intercom attributes for identify and group calls
Identify
userIdroleemailphonenameavatarcompanyownerIdlastNamelastnamefirstNamefirstnamecreatedAttimestamplastSeenAtoriginalTimestampunsubscribedFromEmails
Group
tagssizeplannameemailuserIdwebsiteindustrysegmentsuserCountcreatedAtsessionCountmonthlySpendremoteCreatedAt
RudderStack considers all the other attributes/properties as custom attributes.
Note that if the custom attributes are a part of an object, then RudderStack flattens them, so the custom_attribute object in the final event payload sent to Intercom looks like the following:
"custom_attributes": {
"address_city": "New Orleans",
"address_state": "Louisiana",
"plan": "enterprise"
}

Make sure to create the above custom attributes in the Intercom dashboard to successfully send the events.
FAQ
Does RudderStack support Intercom’s push notification and deep linking features?
None of the RudderStack SDKs support push notifications and deep linking features currently.
See Intercom documentation for more information on configuring these features for your project.
What happens if both userId or email are missing in the identify / track calls sent to Intercom?
For both identify and track calls, either userId or email is a mandatory field. RudderStack will drops the event if none of these fields are present in the event.
RudderStack recommends toggling on the Send AnonymousId as Secondary UserId setting in your RudderStack dashboard to avoid any event loss in such a scenario.
Questions? Contact us by Email or on
Slack