Intercom Connector

Connect your Intercom workspace to Brevo via Tajo for unified customer messaging, conversation tracking, and engagement-driven marketing automation powered by your support and product data.

Overview

PropertyValue
PlatformIntercom
CategorySupport
Setup ComplexityMedium
Official IntegrationYes
Data SyncedContacts, Conversations, Companies, Events
API Base URLhttps://api.intercom.io

Features

  • Contact sync - Bidirectional sync of Intercom users and leads with Brevo contacts
  • Conversation tracking - Sync conversation data for support-driven segmentation
  • Company mapping - Associate contacts with companies for account-based workflows
  • Custom attributes - Map Intercom custom attributes to Brevo contact fields
  • Event tracking - Sync custom events and user activities for behavioral targeting
  • Tag sync - Map Intercom tags to Brevo list membership or attributes
  • Messenger data - Track in-app messaging engagement and chat interactions
  • AI agent integration - Sync AI agent conversation outcomes with Brevo

Prerequisites

Before you begin, ensure you have:

  1. An Intercom workspace (Starter, Pro, or Premium plan)
  2. An Intercom app with access token (private app) or OAuth configured (public app)
  3. A Brevo account with API access
  4. A Tajo account

Authentication

Access Token (Private App)

For private integrations that access your own workspace data.

  1. Go to Developer Hub > Your Apps > Create new app
  2. Associate with your Intercom workspace
  3. Copy the access token
Terminal window
curl https://api.intercom.io/contacts \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-H "Intercom-Version: 2.11"

OAuth 2.0 (Public App)

For integrations that access other customers’ Intercom data.

Terminal window
# Authorization URL
https://app.intercom.com/oauth?client_id={client_id}&state={state}
# Token exchange
curl -X POST https://api.intercom.io/auth/eagle/token \
-d "client_id={client_id}" \
-d "client_secret={client_secret}" \
-d "code={auth_code}"

API Versioning

Always include the Intercom-Version header in your requests. Tajo uses API version 2.11 by default. Check the Intercom changelog for breaking changes.

Configuration

Basic Setup

connectors:
intercom:
enabled: true
access_token: "${INTERCOM_ACCESS_TOKEN}"
api_version: "2.11"
# Data sync options
sync:
contacts: true
conversations: true
companies: true
events: true
tags: true
# Sync direction
direction: intercom_to_brevo
# Brevo list assignment
lists:
all_users: 35
active_conversations: 36
leads: 37

Field Mapping

Map Intercom contact data to Brevo contact attributes:

Default Mappings

Parameter Type Description
email required
string

Contact email address (unique identifier)

name optional
string

Full name, split into FIRSTNAME/LASTNAME

phone optional
string

Maps to SMS attribute for WhatsApp/SMS

role optional
string

Contact type: user or lead

company.name optional
string

Associated company name

signed_up_at optional
timestamp

User signup date

last_seen_at optional
timestamp

Last active timestamp

custom_attributes optional
object

Custom attribute key-value pairs

Custom Attribute Mapping

field_mapping:
# Standard fields
email: email
name: FULLNAME
phone: SMS
# Engagement fields
signed_up_at: SIGNUP_DATE
last_seen_at: LAST_ACTIVE
session_count: SESSION_COUNT
unsubscribed_from_emails: UNSUBSCRIBED
# Company fields
company.name: COMPANY_NAME
company.plan: COMPANY_PLAN
company.size: COMPANY_SIZE
# Custom attributes
custom_attributes.plan_tier: PLAN_TIER
custom_attributes.feature_usage: FEATURE_USAGE

API Endpoints

Contacts API

MethodEndpointDescription
GET/contactsList all contacts
POST/contactsCreate a contact
PUT/contacts/{id}Update a contact
GET/contacts/{id}Retrieve a contact
POST/contacts/searchSearch contacts
DELETE/contacts/{id}Archive a contact

Conversations API

MethodEndpointDescription
GET/conversationsList conversations
GET/conversations/{id}Retrieve a conversation
POST/conversationsCreate a conversation
POST/conversations/{id}/replyReply to a conversation
POST/conversations/{id}/partsAdd conversation part

Companies API

MethodEndpointDescription
GET/companiesList companies
POST/companiesCreate or update a company
GET/companies/{id}Retrieve a company
GET/companies/{id}/contactsList company contacts

Events API

MethodEndpointDescription
POST/eventsSubmit an event
GET/events?type=user&intercom_user_id={id}List user events

Events

Conversation Events

EventTriggerUse Case
conversation.createdNew conversation startedSupport ticket alert
conversation.closedConversation resolvedCSAT survey trigger
conversation.rating.addedRating submittedSatisfaction tracking
conversation.snoozedConversation snoozedFollow-up scheduling

Contact Events

EventTriggerUse Case
contact.createdNew contact addedWelcome sequence
contact.updatedContact data changedAttribute sync
contact.deletedContact archivedCleanup
contact.tag.createdTag added to contactSegment update

User Events

EventTriggerUse Case
user.createdNew user signed upOnboarding flow
user.email.updatedEmail changedContact merge
user.unsubscribedUnsubscribed from emailsPreference update

Code Examples

Initialize Connector

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
// Connect Intercom
await tajo.connectors.connect('intercom', {
accessToken: process.env.INTERCOM_ACCESS_TOKEN,
apiVersion: '2.11'
});

Sync Contacts and Conversations

// Full sync of contacts and conversation data
await tajo.connectors.sync('intercom', {
type: 'full',
resources: ['contacts', 'conversations', 'companies'],
since: '2023-01-01'
});
// Check sync status
const status = await tajo.connectors.status('intercom');
console.log(status);
// {
// connected: true,
// lastSync: '2024-01-15T10:30:00Z',
// contactsSynced: 14200,
// conversationsSynced: 28400,
// companiesSynced: 2100
// }

Handle Intercom Webhooks

import crypto from 'crypto';
app.post('/webhooks/intercom', async (req, res) => {
const signature = req.get('X-Hub-Signature');
const expectedSig = 'sha1=' + crypto
.createHmac('sha1', process.env.INTERCOM_CLIENT_SECRET)
.update(JSON.stringify(req.body))
.digest('hex');
if (signature !== expectedSig) {
return res.status(401).send('Unauthorized');
}
await tajo.connectors.handleWebhook('intercom', {
topic: req.body.topic,
data: req.body.data
});
res.status(200).send('OK');
});

Rate Limits

Intercom applies rate limits based on your plan:

PlanRate LimitDetails
Starter20 requests/10 secondsPer app
Pro50 requests/10 secondsPer app
Premium100 requests/10 secondsPer app
Search endpoint1 request/secondPer app
Scroll endpoint1 request/minutePer app

Additional limits:

  • Bulk operations: 15 contacts per bulk request
  • Event submissions: 500 events/second per workspace
  • Webhook delivery: Automatic retry for 24 hours
  • Data export: 1 concurrent export

Rate Limit Response

Intercom returns 429 Too Many Requests with a Retry-After header. Implement exponential backoff and respect the retry window.

Troubleshooting

Common Issues

IssueCauseSolution
401 UnauthorizedInvalid or expired tokenRegenerate access token in Developer Hub
Contact not syncedMissing email fieldIntercom leads may lack email; filter by role
Conversation data emptyApp lacks conversation scopeRe-authorize with conversation read permissions
Webhook not receivedWebhook not registeredConfigure webhooks in Developer Hub settings
API version mismatchBreaking changes in new versionPin API version with Intercom-Version header

Debug Mode

Enable verbose logging:

connectors:
intercom:
debug: true
log_level: verbose
log_webhooks: true

Test Connection

Terminal window
tajo connectors test intercom
# ✓ API connection successful
# ✓ Contacts readable
# ✓ Conversations readable
# ✓ Companies readable
# ✓ Webhooks registered

Best Practices

  1. Pin API version - Always specify Intercom-Version to avoid breaking changes
  2. Use search API efficiently - Use filters and pagination to reduce data transfer
  3. Sync both users and leads - Capture the full funnel in Brevo
  4. Map conversation tags - Use conversation tags for post-support marketing segments
  5. Track custom events - Submit key product events to Intercom for behavioral targeting
  6. Handle contact merges - Implement merge logic for duplicate contacts

Security

  • Access Token - Bearer token authentication for private apps
  • OAuth 2.0 - Delegated authorization for public apps with client secret
  • Webhook verification - HMAC SHA-1 signature validation via X-Hub-Signature
  • TLS encryption - All API communication encrypted via HTTPS
  • Data access controls - Granular data access per app configuration

Open-Source Implementation Map

This section is derived from official or public repository material discovered for the Intercom connector. Use it as the engineering companion to the setup guide above: it shows where the API surface lives, what implementation assets exist, and how Tajo should translate them into reliable Brevo sync behavior.

Repository Snapshot

RepositoryCommitLanguages / formatsFiles
intercom/Intercom-OpenAPI58585fdJSON (24), Markdown (22), JavaScript (17), YAML (12), YAML (10), sh (1)90
intercom/intercom-mcp-server96140besvg (4), Markdown (1)5

Integration Shape

graph LR
Source["Intercom API / repository"] --> Auth["Auth and scopes"]
Source --> Objects["Objects, events, and schemas"]
Auth --> Tajo["Tajo connector runtime"]
Objects --> Tajo
Tajo --> Brevo["Brevo contacts, attributes, lists, campaigns"]
Tajo --> Ops["Backfill, cursor, retries, logs"]

What To Reuse

  • Intercom REST API OpenAPI Description
  • This repository contains OpenAPI descriptions for Intercom’s REST API.
  • It defines the HTTP interface used to integrate with Intercom’s customer engagement and support platform.
  • Supported API versions: 2.7 and higher.

Tajo Revamp Checklist

  • Keep authentication setup aligned with the vendor docs and the public repository’s current API shape.
  • Map primary resources into explicit Tajo sync objects with stable external IDs.
  • Prefer cursor-based or updated-at incremental sync where the API exposes it; otherwise document the fallback.
  • Treat webhook handlers as idempotent and replay-safe, especially for order, contact, ticket, and campaign events.
  • Capture pagination, rate limits, retry headers, and partial-failure behavior in connector smoke tests.
  • Keep examples small and runnable against sandbox or test-mode accounts.

Sources

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI Assistant

Hi! Ask me anything about the docs.