Skip to main content
A support conversation is the user’s description of what went wrong — secondhand, often vague (“the button doesn’t work”). Intercom tells you that someone is stuck. It can’t show you what actually happened on their screen. Subtext can. Attach the Subtext session URL to the Intercom contact and every conversation becomes a jumping-off point — your agent reads the subtext_url, opens that person’s real session, and walks the decisive moments with screenshots, the component tree, network, and console. Intercom detects; Subtext diagnoses.
This guide assumes the Subtext capture snippet is installed and capturing, and the Intercom Messenger is installed — either via the JavaScript snippet or the @intercom/messenger-js-sdk npm package. Each code tab below is written for one install method. It also assumes a custom data attribute named subtext_url exists in Intercom → Settings → Data → People — custom attributes must be created before the Messenger can write them.

Attach the session URL

Store the current Subtext session URL on the Intercom contact as the subtext_url custom attribute so it travels with the conversation and shows in the inbox sidebar. Attach it through the update call — or pass it at boot with the modern SDK.
The session URL changes on a new session and when FS('setIdentity') is called with a different uid, so re-call update(…) (or window.Intercom('update', …) for snippet installs) whenever you re-identify the user — the attribute is frozen until the next update.
Don’t read FS('getSession') at module top level — it returns null until the session has started. Don’t skip creating the subtext_url custom attribute in Intercom settings first — undeclared attributes are silently dropped. And don’t spam the update call: Intercom throttles the Messenger to 20 update calls per 30 minutes, so attach on identify, not on every render.

From signal to session

However you first hear about a problem in Intercom, the path is the same: get to the subtext_url, then hand it to your agent for a Detect-vs-Diagnose read. The ticket says X is broken; the session shows whether it reproduces, what the user really clicked, and where it failed — so you can answer (or escalate) from evidence instead of guessing.
A conversation is assigned to you: “I clicked Pay and nothing happened. Tried three times.”Open the conversation, go to the contact details sidebar, find subtext_url under custom attributes, and copy it. Then hand it to your agent:
You’ve decided a ticket is a real bug and are about to open a Linear / Jira issue for the product team.Copy subtext_url from the contact sidebar so it travels into the engineering ticket alongside your summary.
Several conversations come in within an hour all describing the same thing — “export is failing.”Open each conversation and copy subtext_url from each contact sidebar, then review them together.
A conversation gets a low CSAT rating and a comment like “never actually got it working.”Open the rated conversation, go to the contact sidebar, and copy subtext_url.
Paste the agent’s summary as an internal note on the conversation so the next rep inherits the diagnosis. When escalating, attach the agent’s repro write-up (or a proof document via doc-create) to the engineering ticket — the subtext_url plus screenshots means engineers don’t have to re-interview the customer.

For agents

An autonomous agent can run the whole loop against Intercom directly: discover the friction, extract the subtext_url, and hand each session to the Subtext MCP. Intercom ships an official MCP server at https://mcp.intercom.com/mcp (Streamable HTTP; legacy SSE at /sse), authenticated with OAuth or a Bearer access token.
The Intercom MCP server supports US-hosted workspaces only — EU and AU data regions are not supported yet. If your workspace is EU/AU, use the REST API instead.
1

Discover the friction

Surface the worst conversations — low CSAT, bug / confusion tags, topic spikes. Over MCP, search_conversations filters by source, author, state, assignment, and timing; search runs a universal query across conversations and contacts. Over REST:
Narrow to the affected users with POST /contacts/search.
2

Extract the session URL

Read subtext_url off the contact’s custom attributes. Over MCP, get_contact returns complete contact info including custom attributes (search_contacts can also filter by them). Over REST:
3

Hand off to Subtext

For each URL, call review-open(session_url=<subtext_url>) on the Subtext MCP to get a Detect-vs-Diagnose read: the ticket says X broke versus whether it reproduces in the session. For escalation, ask the review to produce reproduction-grade steps (and optionally a doc-create proof document) so the bug report carries evidence, not a paraphrase.
subtext_url only round-trips if it was stored as a contact custom attribute at capture time (see Attach the session URL). The Intercom MCP is US-region-only today — fall back to the REST API for EU/AU workspaces.