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
| Property | Value |
|---|---|
| Platform | Intercom |
| Category | Support |
| Setup Complexity | Medium |
| Official Integration | Yes |
| Data Synced | Contacts, Conversations, Companies, Events |
| API Base URL | https://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:
- An Intercom workspace (Starter, Pro, or Premium plan)
- An Intercom app with access token (private app) or OAuth configured (public app)
- A Brevo account with API access
- A Tajo account
Authentication
Access Token (Private App)
For private integrations that access your own workspace data.
- Go to Developer Hub > Your Apps > Create new app
- Associate with your Intercom workspace
- Copy the access token
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.
# Authorization URLhttps://app.intercom.com/oauth?client_id={client_id}&state={state}
# Token exchangecurl -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: 37Field 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_USAGEAPI Endpoints
Contacts API
| Method | Endpoint | Description |
|---|---|---|
GET | /contacts | List all contacts |
POST | /contacts | Create a contact |
PUT | /contacts/{id} | Update a contact |
GET | /contacts/{id} | Retrieve a contact |
POST | /contacts/search | Search contacts |
DELETE | /contacts/{id} | Archive a contact |
Conversations API
| Method | Endpoint | Description |
|---|---|---|
GET | /conversations | List conversations |
GET | /conversations/{id} | Retrieve a conversation |
POST | /conversations | Create a conversation |
POST | /conversations/{id}/reply | Reply to a conversation |
POST | /conversations/{id}/parts | Add conversation part |
Companies API
| Method | Endpoint | Description |
|---|---|---|
GET | /companies | List companies |
POST | /companies | Create or update a company |
GET | /companies/{id} | Retrieve a company |
GET | /companies/{id}/contacts | List company contacts |
Events API
| Method | Endpoint | Description |
|---|---|---|
POST | /events | Submit an event |
GET | /events?type=user&intercom_user_id={id} | List user events |
Events
Conversation Events
| Event | Trigger | Use Case |
|---|---|---|
conversation.created | New conversation started | Support ticket alert |
conversation.closed | Conversation resolved | CSAT survey trigger |
conversation.rating.added | Rating submitted | Satisfaction tracking |
conversation.snoozed | Conversation snoozed | Follow-up scheduling |
Contact Events
| Event | Trigger | Use Case |
|---|---|---|
contact.created | New contact added | Welcome sequence |
contact.updated | Contact data changed | Attribute sync |
contact.deleted | Contact archived | Cleanup |
contact.tag.created | Tag added to contact | Segment update |
User Events
| Event | Trigger | Use Case |
|---|---|---|
user.created | New user signed up | Onboarding flow |
user.email.updated | Email changed | Contact merge |
user.unsubscribed | Unsubscribed from emails | Preference 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 Intercomawait tajo.connectors.connect('intercom', { accessToken: process.env.INTERCOM_ACCESS_TOKEN, apiVersion: '2.11'});Sync Contacts and Conversations
// Full sync of contacts and conversation dataawait tajo.connectors.sync('intercom', { type: 'full', resources: ['contacts', 'conversations', 'companies'], since: '2023-01-01'});
// Check sync statusconst 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:
| Plan | Rate Limit | Details |
|---|---|---|
| Starter | 20 requests/10 seconds | Per app |
| Pro | 50 requests/10 seconds | Per app |
| Premium | 100 requests/10 seconds | Per app |
| Search endpoint | 1 request/second | Per app |
| Scroll endpoint | 1 request/minute | Per 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
| Issue | Cause | Solution |
|---|---|---|
| 401 Unauthorized | Invalid or expired token | Regenerate access token in Developer Hub |
| Contact not synced | Missing email field | Intercom leads may lack email; filter by role |
| Conversation data empty | App lacks conversation scope | Re-authorize with conversation read permissions |
| Webhook not received | Webhook not registered | Configure webhooks in Developer Hub settings |
| API version mismatch | Breaking changes in new version | Pin API version with Intercom-Version header |
Debug Mode
Enable verbose logging:
connectors: intercom: debug: true log_level: verbose log_webhooks: trueTest Connection
tajo connectors test intercom# ✓ API connection successful# ✓ Contacts readable# ✓ Conversations readable# ✓ Companies readable# ✓ Webhooks registeredBest Practices
- Pin API version - Always specify
Intercom-Versionto avoid breaking changes - Use search API efficiently - Use filters and pagination to reduce data transfer
- Sync both users and leads - Capture the full funnel in Brevo
- Map conversation tags - Use conversation tags for post-support marketing segments
- Track custom events - Submit key product events to Intercom for behavioral targeting
- 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
Related Resources
- Intercom Developer Documentation
- Intercom API Reference
- Zendesk Connector
- Customer Sync Skill
- Brevo Contacts API
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
| Repository | Commit | Languages / formats | Files |
|---|---|---|---|
| intercom/Intercom-OpenAPI | 58585fd | JSON (24), Markdown (22), JavaScript (17), YAML (12), YAML (10), sh (1) | 90 |
| intercom/intercom-mcp-server | 96140be | svg (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.