Usage recording & journeys
Record how people use your site — pageviews, clicks and custom events — tie them to signed-in users, and replay each session as a journey.
Usage recording captures how people actually use your site — the pages they view, the things they click, and any custom events you send — ties each session to the signed-in user, and lets you replay it as a step-by-step journey. You get both the aggregate picture (top pages, top actions, active people) and per-user trends. Open it from User Journeys in the sidebar. (Pro plan and above.)
What's captured automatically
Once the SDK is on your site, usage recording runs with no extra code:
- Pageviews — every page load and single-page-app route change (normalised to a stable path, so
/orders/8412and/orders/9930group together as/orders/:id). - Clicks — with a human-readable label taken from the element's text,
aria-label, orname.
Events are buffered and sent in small batches (and once more when the tab closes), so a session is recorded even if the visitor leaves abruptly.
Tell it who the user is
By default sessions are anonymous (grouped by a per-device id). To unlock per-user trends, call identify() once you know who the signed-in user is:
ErrorPage.identify({
id: 'u_12345', // your stable user id (best key)
email: 'sam@acme.com',
name: 'Sam Lee'
});
From then on, that user's sessions roll up under one person in the People list, and you can open their profile to see usage trends across every visit.
Record custom events
Track the moments that matter to your product — not just pageviews and clicks:
ErrorPage.track('Checkout started', { plan: 'pro' });
ErrorPage.track('Invited teammate');
Custom events appear inline in the session journey and can be compared in aggregate.
What you'll see
- Aggregate — sessions and identified people over the last 30 days, a sessions-per-day trend, and your top pages and top actions.
- People — every signed-in user, most-recently-active first, with their session and pageview counts. Open one for their full history.
- Session replay — a clean, ordered timeline of one session: each pageview, click and custom event in sequence, with a Play button that steps through the journey. Because it's a labelled sequence of actions (not a pixel recording), it reads clearly no matter how your pages are built.
Conversions & missed opportunities
The Conversions page turns recorded sessions into a funnel so you can see where visitors drop off and which opportunities you're missing:
- Funnel — Visitors → Engaged → Signup intent → Signed up, with the drop-off at each step. Engaged means more than one page or at least 10 seconds; signup intent means the visitor reached a signup/checkout step (pages whose path looks like
/signup,/register,/checkout,/trial, and similar). - Conversion detection — a session converts when an anonymous visitor becomes identified during it (i.e. they signed up or logged in). That's why calling
ErrorPage.identify()at signup/login is what powers this page. Visitors who are already identified on arrival count as returning users, not new conversions. - Incomplete signups — anonymous sessions that reached a signup step but never converted: your clearest missed opportunities. Each row shows time on site, pages viewed, and the page they left on, with a link to replay the session.
- Timing — average time on site, average time to signup (browse → convert), bounce rate, plus time on each page so you can see where visitors linger or get stuck, and the exit pages where non-converters most often leave.
Time-on-page and time-on-site are measured from the visitor's own clock, so they stay accurate even though events are sent in batches. Fire ErrorPage.track('Signup started') and similar to enrich the picture with your own funnel steps.
Privacy
Recording is built to be safe to turn on:
- Query strings are dropped and id-like path segments are collapsed, so URLs never carry personal data into analytics.
- Click labels and titles are PII-redacted before storage — anything that looks like an email, phone number, or similar is removed.
- Form input values are never captured by the usage stream.
- Identity is only what you pass to
identify()— you stay in control of what's attributed to a person.
Turn recording off entirely by initialising with usage: false:
ErrorPage.init({ projectId: 'ep_xxx', slug: 'my-store', usage: false });
See also Getting started, Account Health, and Engagement & lead capture.