Skip to content

Session Replay

Session Replay reconstructs a user’s session as a video: every page view, every DOM mutation, every click, every keystroke (with privacy controls). Use it to see what a user actually did.

  • A user reports a bug you can’t reproduce.
  • You’re investigating an error and want to see the exact path that triggered it.
  • You’re studying a confusing UX flow and want to watch real users navigate it.
  • A customer asks “why was I charged twice?” You can replay the actual checkout.
  • For aggregate analytics. That’s RUM’s measurement layer.
  • As your only data source. Replay is captured only for sessions a recording rule matches.

Replay is built on rrweb. The recorder:

  1. Snapshots the initial DOM.
  2. Records every mutation (additions, deletions, attribute changes).
  3. Records input events (pointer moves, clicks, scrolls, typing), masked as the application’s privacy settings say.
  4. Pauses while the tab is hidden or idle and on never-record pages, then resumes with a fresh snapshot.
  5. Ships the recording as gzipped segments to https://in-replay.siteqwality.com. Every tab records its own window.

In the dashboard player, scrub the timeline, slow down, click an event or marker to seek to it, and step between errors with Previous error / Next error (keys Shift+E and E).

Share (key L) gives a link that opens the replay at that moment, and Open full replay on an error’s page opens the replay at the error. See replay links.

Replay records only sessions that match a Replay recording rule. A new application starts with Errored sessions, which replays every session with an error, and an Auto sample.

When a Replay rule could still match a session, the SDK records into a memory buffer from page load, keeping the last 60 to 120 seconds. A match, such as the session’s first error, sends that buffer and then streams the recording, so an error replay usually shows what led up to the error. A fresh page, delayed config or consent, a pause, memory pressure or a large snapshot can leave less than 60 seconds before the match; see replay buffer and privacy. Without a match nothing is uploaded, and the buffer is dropped when the page goes.

Once replay activates for a session, it stays on for the rest of that session, in every tab and across page loads.

What a recording masks comes from the application’s privacy level, delivered to the SDK with its config:

LevelInputsPage textImages and video
StrictMaskedMasked, except unmask selectorsBlocked
Balanced (new applications)MaskedVisible, with emails, card numbers and runs of 9+ digits scrubbedRecorded
RelaxedMaskedVisibleRecorded
Custom (applications created before levels)mask_inputsmask_textRecorded

Password, email and telephone inputs are always masked, and hidden inputs are never recorded. The settings are stored per RUM application, under RUM → Settings → Privacy or settings.privacy in GET /rum/{app_id}. Check them before you rely on them: an application created before privacy levels keeps the flags stored at its creation, which can include mask_inputs: false.

Per-element controls are application settings too, under settings.privacy:

SettingEffect
mask_selectorsText inside matching elements is replaced with *, keeping the layout.
unmask_selectorsUnder Strict, text inside matching elements stays visible.
block_selectorsMatching elements are recorded as empty boxes of the right size; nothing inside them is recorded. Block selectors always win.
ignore_input_selectorsInput events fired on a matching element are not recorded.
never_record_urlsRecording pauses on matching pages.

rrweb’s own rr-block and rr-ignore classes still work in your markup, with the same effect as a block or ignore selector. Do not rely on rr-mask: when the application masks or scrubs text, the SDK’s own masking decides instead. Use mask_selectors.

An ignore selector or rr-ignore must match the <input> itself: it is checked only on the element the event fired on. It suppresses input events only, so with input masking off, a value already in the field when recording starts is still captured in the snapshot. Keep input masking on, or block the field.

Replay is metered by recorded session, separately from Observe and Analyze, and recording rules control which sessions are recorded. See pricing.

  • Segments: gzipped, closing at 20 seconds or about 2.5 MB of JSON. A page whose snapshot is larger than 4 MB is not recorded.
  • Retention: 30 days. An application can shorten it to 7 or 14 days; see shorten retention.