Events · built in

Every signup arrives with a history. Most of it never reaches the contact record.

The pricing pages they read, the demo they half-watched, the docs that brought them in—it all happened on your site before the form was filled. Events captures it with one snippet and attaches it to the contact the moment they identify, on the same profile your agents read over MCP and REST.

The problem

The research already happened. Nobody can see it.

Signups come in faster than anyone can research them, and the answer to “why is this person here” is usually sitting in a web analytics tool: three pricing visits and a half-watched demo, keyed to an anonymous cookie ID that nothing joins to the CRM. So the signup that arrived warm gets worked cold, and the research the founder used to do by hand doesn’t happen at all.

Anonymous → identified

Every event from your site, tied back to a real customer—even the ones from before they signed up.

The pricing-page visits, the half-watched demo, the blog posts that brought them in. All of it stitched onto the contact the moment they sign up—so your agent can answer “why is Jane here, and how warm is she?” with real evidence.

Anonymous visitor_a91c…
14 days · 11 events
14d ago /blog/customer-context-for-agents organic · google
10d ago /docs/identity-resolution 3m 12s
6d ago /pricing referrer · google
6d ago video · product demo 75%
3d ago /customers/atlas-fintech case study
2d ago /pricing return · 2×
2d ago click · “Compare plans” cta
Signup today · 09:14 form · [email protected]
JR
Jane Reyes · [email protected]
acme.com · fintech · ctc_01H…
LIVE
Resolved · backfilled on signup

Eleven anonymous events from visitor_a91c now belong to Jane: the pricing returns, the 75% demo watch, the case study, back to the blog post that brought her in 14 days ago.

Backfilled 11 events · 14 days
First touch google · /blog
Device Chrome · macOS
JSON · GET /v1/events or the MCP timeline tools resolved_from · visitor_a91c
{ "contact_id": "ctc_01H…", "email": "[email protected]", "name": "Jane Reyes",
  "company": { "domain": "acme.com", "industry": "fintech" },
  "first_touch": { "referring_domain": "google.com", "landing_page": "/blog/customer-context-for-agents" },
  "events": [
    { "event": "page_view",      "url": "/blog/customer-context…", "at": "…14d", "resolved_from": "visitor_a91c" },
    { "event": "page_view",      "url": "/pricing",                "at": "…6d",  "referring_domain": "google.com" },
    { "event": "video_milestone", "name": "product_demo",       "at": "…6d",  "milestone": 75 },
    { "event": "button_click",   "text": "Compare plans",      "at": "…2d" },
    { "event": "form_submit",    "form_id": "signup",           "at": "…now" }
  ],
  "device": { "browser": "Chrome", "os": "macOS", "device_type": "Desktop" }
}
Resolution cookie · device fingerprint
Freshness events land as they happen—no batch window between capture and the next query
Backfill retroactive—anonymous events are moved, not duplicated, onto the contact
How it works

Verify a domain, drop the snippet, identify at login.

  1. 01

    Verify your domain, drop the snippet

    A one-time DNS TXT record proves you own the domain—events are accepted from nowhere else. Then one script tag on every page you want covered.

  2. 02

    Autocapture starts

    Page views, page leaves, first visits, button and link clicks, form submits, and video events—named and enriched server-side with browser, OS, device, and referrer. Nothing to instrument.

  3. 03

    Identify when they log in

    One call links the browser to your user ID and backfills everything they did before—so the anonymous trail becomes part of the contact.

01 Drop the snippet on a verified domain

Verify your domain once with a DNS TXT record—events are accepted only from domains you own. Then one line before </body>: a 5 KB gzipped script, tracker.js.

index.html · before </body> SNIPPET
<script async src="https://tracker.pathbound.ai/tracker.js"></script>
page_view clicks form_submit video
02 Identify the user when they log in

One call binds the browser to your user ID—everything they did before, back to the first page view, attaches to the contact retroactively. A server-side POST /v1/identify and a plain cookie work too.

app.js · after login IDENTIFY
// After login (or any page where you know who the user is):
window.pathbound = window.pathbound || [];
window.pathbound.push(['identify', user.externalId, { email: user.email }]);
retroactive backfill first touch preserved never re-keys

DNT honored · HTTPS-only · no third-party cookies · verified domains only · per-domain rate limits · fingerprint is content-stable, not cross-site identifying.

Sources

Where events come from.

Events is one store with more than one way in. Every source resolves to the same contacts and lands on the same timeline.

The snippet

Your website

One script tag autocaptures page views, clicks, form submits, and video, and one identify call at login ties them to the person. No event taxonomy to design, no per-page instrumentation.

Install the snippet
Pull-sync

PostHog

Already instrumented in PostHog? The integration pull-syncs those events into the same store, resolved to the same contacts. Keep PostHog for product analytics; your agents read one timeline.

The PostHog integration
Identity

Who the events belong to.

Analytics tools count sessions. Events resolves people—so fourteen days of anonymous browsing and a logged-in user are one record, not two.

Anonymous visitors stay one person

A visitor cookie and session ID track the browser. When cookies are cleared, a content-stable device fingerprint recovers the prior visitor ID, so the trail survives instead of splitting.

Three ways to identify

window.pathbound.identify() from the page, an authenticated POST /v1/identify from your backend, or a cookie your app sets. All three share one join key, so combining them is safe.

Rules that keep profiles clean

Backfill moves events instead of copying them. First-touch referrer and UTMs are written once and never overwritten. No ingestion path ever re-keys an identified contact.

The full mechanics—cookies, fingerprinting, the identification cascade—are documented in Identity & fingerprinting.

The read side

Events land where your agents already read.

There’s no batch window. An event is on the profile as it happens, so an agent on a live support thread sees this morning’s pricing-page visit—not yesterday’s export. The same store answers REST queries and the MCP tools.

GET /v1/events REST
curl "https://api.pathbound.ai/v1/events?event_types=page_view&url_contains=/pricing&identified_only=true" \
  -H "Authorization: Bearer YOUR_API_KEY"
list_events get_event_stats get_contact_timeline has_event_* filters on contacts

Full filters and schemas in the Events API reference; for agents, the same data is served by the customer data MCP.

FAQ

Events, identity, and privacy.

What does the snippet capture?

Page views (including SPA route changes), page leaves with time on page, first visits, button and link clicks, form submits, and Wistia video events—plays, pauses, completions, 25/50/75/100% milestones, and in-video email capture. All of it without configuration; the identify call is the only code you write.

What happens to events from before someone signed up?

They’re recorded under an anonymous visitor ID. When the person identifies (signup form, login, or a server-side identify), their whole trail attaches to the contact retroactively. Events are moved, not duplicated, and the first-touch referrer, landing page, and UTMs are written to the contact once, never overwritten by later visits.

Do I need to design an event taxonomy first?

No. Autocapture names events for you (page_view, button_click, form_submit) with the element text, URL, and referrer already attached. You add one identify call at login; everything else is automatic.

I already run PostHog—does this replace it?

No, and you can run both. The PostHog integration pull-syncs your PostHog events into the same store, attached to the same contacts. Keep PostHog for product analytics; Events is how that behavior reaches the customer profile your agents read.

How is privacy handled?

First-party only: no third-party cookies, HTTPS-only, and events are accepted only from domains you’ve verified with a DNS TXT record—nobody else can send events as you. A pathbound_dnt=1 cookie disables the snippet entirely, and opted-out visitors are never fingerprinted.

What happens when someone clears cookies?

A content-stable device fingerprint (only the SHA-256 hash ever leaves the browser) recovers the prior visitor ID, so the history survives cookie loss and incognito visits. And no ingestion path ever re-keys an identified contact—a second person on a shared device can’t inherit the first one’s history.

Try it on your own data

Within five minutes, your agent is querying real customer context.

Sign up, connect one CRM or drop the events snippet, and point your MCP client at mcp.pathbound.ai/mcp.