Skip to main content
Hightouch is a Composable CDP: it pipes events into your warehouse and activates audiences out into ad platforms, email, and CRMs. It tells you who a person is and which segment they fell into — not what they experienced. Subtext can. Attach the Subtext session URL to your Hightouch Events data and every cohort carries a jump-to-session link — 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. Your warehouse cohorts detect; Subtext diagnoses.
This guide assumes the Subtext capture snippet is installed and capturing, and the Hightouch Events browser SDK is loaded — the window.htevents snippet or the npm @ht-sdks/events-sdk-js-browser package.

Attach the session URL

Store the current Subtext session URL on your Hightouch Events data so it travels into the warehouse as a column, ready to filter audiences and dashboards on. The Events browser SDK is modeled on the Segment analytics.js spec, so there are two places to attach it, depending on how precise the link needs to be.

On the user profile

Attach the URL to the user with htevents.identify. It lands as a trait and, downstream, a column on the identifies table in your warehouse. Call it wherever your app already identifies the user — on auth resolution, not at module top level.

On every event

Source middleware runs on every call, so it attaches the URL fresh per event. Because url.now carries a timestamp, the link deep-links to the moment each event fired. Event properties auto-convert into warehouse columns, so subtext_url becomes a column on the track and page event tables.
Register the middleware once at initialization, before any track calls — not inside a component render.
Don’t read FS('getSession') at module top level — it returns null until the session has started. The URL changes on a new session and when the user re-identifies, so call htevents.identify on every auth state change to keep the profile trait current; the source middleware reads the URL fresh per event and never needs re-attaching. Pick subtext_url and use the same key across identify and track — warehouse columns and audience filters are case-sensitive. The signed URL grants replay access, so keep it in your warehouse and internal surfaces; never sync it into a third-party ad or email audience.

From signal to session

However the cohort first surfaces — a campaign report, a computed audience, a sync check — the path is the same: get to the subtext_url, then hand it to your agent for a Detect-vs-Diagnose read. Hightouch Events stores the value as subtext_url on the profile and event tables in your warehouse.
The growth marketer is watching a landing-page campaign. It drives clicks, but the landing page converts below plan. Hightouch captured the UTM parameters on the events (context.campaign), so the cohort is addressable.Query the events table for that campaign’s sessions:
Grab a few links, then hand them to your agent:
The lifecycle / CRM owner sees a user land in a computed audience like “started checkout, no purchase in 24h,” and wants to know why before sending a win-back.Open the user’s warehouse profile, or query their most recent session link, and copy subtext_url.
The marketing-ops or data engineer who owns the Hightouch source sees a sync surface malformed or missing properties on a key event, hinting at a broken client.Find a recent offending event that still carries subtext_url and copy it.
For a campaign investigation across several users, ask your agent to consolidate the findings into one proof document (doc-create) — a screenshot per user and one shareable link — then drop it into the campaign retro or audience note so the next person sees the human story behind the segment.

For agents

An autonomous agent can run the whole loop: discover the cohort, extract the subtext_url, and hand each session to the Subtext MCP. Hightouch does ship an official MCP server — it connects your assistant to Hightouch’s marketing agents for exploring your schema, building and saving audiences, and designing journeys — but it is not documented as an event-history reader, and it isn’t enabled in every workspace. The events land in your warehouse, so the agent story runs through the warehouse’s MCP. If that warehouse is ClickHouse, use the official mcp-clickhouse server (list_databases, list_tables, run_query, read-only by default). For Snowflake / BigQuery / Redshift, use that warehouse’s own MCP or SQL API — the query shape is the same. Hightouch’s REST API manages models and syncs, not event history, so it is the wrong surface for pulling session links.
1

Discover the cohort

Find the campaign, audience, or failing-event cohort worth watching. Because Hightouch captures UTM parameters, you can scope directly to a campaign. To triage a computed audience instead, join the audience membership table to the events table and pull each member’s most recent subtext_url.
2

Extract the session URL

Read subtext_url off those rows with the warehouse’s read query tool:
3

Hand off to Subtext

For each URL, call review-open(session_url=<subtext_url>) on the Subtext MCP. Event-level URLs are moment-precise, so the review opens exactly when the signal fired.
subtext_url only round-trips if the Events SDK attached it at capture (see Attach the session URL); older rows carry an empty value, so filter subtext_url != ''. Table and column names depend on how your Hightouch source maps events into the warehouse — confirm them before hard-coding. Keep the warehouse MCP read-only; a review agent never needs write access.