DOM recordings, not video
Full-fidelity DOM snapshots reconstruct the page your user saw, including dynamic content and inlined stylesheets. Nothing is screen-recorded, so the recording stays small and scrubs instantly.
DOM recordings of real user sessions (clicks, scrolls, rage clicks and navigation) with input masking on by default, element-level controls for everything else, and a link from every error to the sessions it hit.
When a user hits an error or drops off, a session replay shows you every click, scroll, and navigation that led up to that moment. No log grepping. Just press play and watch exactly what happened.
Full-fidelity DOM snapshots reconstruct the page your user saw, including dynamic content and inlined stylesheets. Nothing is screen-recorded, so the recording stays small and scrubs instantly.
Input values are masked before they leave the browser on applications you create, and password fields are masked whether or not that setting is on. Page-text masking is a separate switch, off by default.
Nothing is recorded until you create a session filter with replay capture turned on. Replay is opt-in per rule, not a default that runs against every visitor.
Every error group lists the sessions it occurred in, each with a Watch Replay link, so you go from a stack trace to a recording without searching.
Three or more clicks on the same element inside one second are recorded as a rage click, so you can filter straight to the sessions where someone was fighting the interface.
Every click, navigation, network request, and error shown chronologically alongside the replay so context is never missing.
Input masking is on by default for applications you create, so values are replaced before the recording leaves the browser. Page text is a separate setting and it is off by default: anything your page renders as visible text is recorded unless you turn page-text masking on or mark the element. Both settings are per application, and a change applies to sessions that start after it rather than to a recording already running.
rr-mask, rr-block and rr-ignoreOpen any error group and it lists the sessions the error occurred in, with the user, the timestamp and the URL. Each row carries a Watch Replay link that opens that session's recording. Replay is part of the same SDK as the rest of RUM, so there is no second script to install.
element-level controls: rr-mask, rr-block, rr-ignore
from an error to the replay of a session it hit
replay retention, the same window on every plan
free tier, 100 replay sessions included
Input values are masked before the recording leaves the browser on applications you create, and password fields are masked whether or not that setting is on. Page text is a separate setting and it is off by default, so visible text your page renders (names, addresses, order contents, message bodies) is recorded unless you turn page-text masking on for the application or mark the element. Content inside a cross-origin iframe is never recorded at all, which is why a hosted payment field cannot be captured. Applications created before this default was corrected keep the setting they were stored with, so check the toggle in RUM settings for any application you set up earlier.
Add a class to the element. rr-mask masks the text inside it, rr-block stops the element being recorded at all, and rr-ignore stops input events on it being recorded. These are the recorder's own class names and Site Qwality does not override them, so they work as documented upstream. There is no data-sq-mask or data-sq-unmask attribute; earlier versions of this page said there was, and that was wrong.
The core RUM script is 5.7 kB gzipped over the wire and loads asynchronously. The recorder itself is a separate 22 kB gzipped chunk that is only fetched when a session actually matches a capture filter, so a visitor who is not being recorded never downloads it. Mutations are batched and flushed on a timer rather than per event.
Open the error in Error Tracking. The detail view lists the sessions the error occurred in, and each row has a Watch Replay link that opens that session's recording. The recording plays from the point the session was selected for capture; there is no pre-error buffer.
You can filter the session list by browser, operating system, whether the session contained an error, whether it has a replay, and whether it shows frustration signals, and search by the user id or email address you passed to setUser. Filtering by URL, device class, session duration or custom attribute is not available today.
30 days, on every plan including the free tier. The window is not configurable in either direction: paid plans do not extend it, and unlike the two other real user monitoring windows it cannot be shortened either. A request that tries to set a shorter replay window is refused with an error naming the reason rather than quietly accepted and ignored. The reason is that the index row we keep in the database only points at the stored recording, and the recordings are expired by a separate storage rule that applies to all of them equally and cannot follow a per-application setting; honouring a shorter window would delete the pointer while leaving the recording in place. What a plan changes is how many sessions you can record, not how long they are kept.
Uptime, cron, synthetic, logs, RUM, incidents, and status pages. Free tier on every product.