Intercom Contacts & Contact Management
SkillSearch'Manage Intercom contacts: create, search, update, merge leads into users.
Use Intercom Contacts & Contact Management in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Intercom Contacts & Contact Management and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Intercom Contacts & Contact Management skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by jeremylongshore/tons-of-skills-marketplace in skills/.curated/intercom-core-workflow-a/SKILL.md and read by Ahel’s review.
Overview
Primary workflow for managing Intercom contacts. Covers creating users and leads, searching with filters, updating custom attributes, merging leads into users, and listing segments. This SKILL.md gives you the high-level workflow and the first example; drill into references/implementation.md for the full step-by-step code and references/examples.md for end-to-end flows.
Prerequisites
- Completed
intercom-install-authsetup - Understanding of Intercom contact model (users vs leads)
- Valid API credentials with contacts read/write scope
Instructions
The contact workflow is six operations against the intercom-client SDK. Instantiate the client once, then call the operation you need:
import { IntercomClient } from "intercom-client";
const client = new IntercomClient({
token: process.env.INTERCOM_ACCESS_TOKEN!,
});
// Create an identified user (has external_id)
const user = await client.contacts.create({
role: "user",
externalId: "customer-9001",
email: "alice@acme.com",
name: "Alice Johnson",
customAttributes: { plan: "enterprise" },
});
The six operations, in the order you typically reach for them:
- Create contacts —
contacts.createwithrole: "user"(identified, needsexternalId) orrole: "lead"(anonymous). - Search contacts —
contacts.searchwith a single filter or a compoundAND/ORquery, plus pagination and sort. - Update a contact —
contacts.updatebycontactIdto change name or custom attributes. - Merge a lead into a user —
contacts.merge({ from: leadId, into: userId }); the lead's conversations, events, and tags transfer to the user. - List segments —
contacts.listSegments({ contactId })to see which segments a contact belongs to. - Paginate all contacts —
contacts.listwithstartingAftercursor to stream the full contact base.
Full code for every step, including compound-search filters and the async-generator pagination helper, is in references/implementation.md.
Output
Each operation returns a typed response from the SDK:
create/update— a singlecontactobject:{ type: "contact", id, role, email, name, customAttributes, created_at, ... }. Theidis the Intercom-generated handle you pass to later calls.search—{ data: Contact[], totalCount, pages }. Iteratedata; readtotalCountfor the match count; usepages.next.startingAfterto page.merge— the survivingusercontact (theintotarget); thefromlead is deleted.listSegments—{ data: Segment[] }, each{ id, name }.list— one page{ data: Contact[], pages }; followpages.next.startingAfteruntil it is absent.
Contact Data Model
| Field | Type | Description |
|---|---|---|
id | string | Intercom-generated unique ID |
external_id | string | Your system's user ID |
role | "user" or "lead" | Contact type |
email | string | Email address |
name | string | Full name |
phone | string | Phone number |
custom_attributes | object | Custom key-value data |
created_at | number | Unix timestamp |
last_seen_at | number | Last activity timestamp |
signed_up_at | number | Signup timestamp |
tags | object | Applied tags list |
companies | object | Associated companies |
location | object | GeoIP location data |
Error Handling
| Error | HTTP Code | Cause | Solution |
|---|---|---|---|
not_found | 404 | Contact ID doesn't exist | Verify with search first |
conflict | 409 | Duplicate external_id or email | Search before creating |
parameter_invalid | 422 | Bad field value or missing required field | Check field types and names |
rate_limit_exceeded | 429 | Over 10,000 req/min (private apps) | Add backoff, batch operations |
merge_not_possible | 400 | Merging user into lead (reversed) | from must be lead, into must be user |
Examples
Quick create-then-search flow:
const user = await client.contacts.create({
role: "user",
externalId: "customer-9001",
email: "alice@acme.com",
name: "Alice Johnson",
});
const found = await client.contacts.search({
query: { field: "email", operator: "=", value: "alice@acme.com" },
});
console.log(`Found ${found.totalCount} match(es)`);
Three fuller worked flows — lead-to-user lifecycle, segmenting recent enterprise signups, and streaming every contact for an export — are in references/examples.md.
Resources
Next Steps
For conversation management (creating, replying to, and searching conversations), see the companion skill intercom-core-workflow-b, which builds on the contact IDs produced by this workflow.
Signals
- GitHub stars
- 3k
- Forks
- 415
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
intercom-core-workflow-a- Source
- github.com/jeremylongshore/tons-of-skills-marketplace
github.com/jeremylongshore/tons-of-skills-marketplace
Related picks
Skill · mattpocock
The pick for TypeScripttypescript-pro
Skill · jeffallan
The pick for TypeScripthandsontable-playwright-e2e
Skill · handsontable
The pick for End-to-end testingmstar-e2e
Skill · btspoony
The pick for End-to-end testingdashboard
Skill · nexu-io
More in Searchazure-ai
Skill · microsoft
More in Search