Home
Pricing
Platform Blog About Contact FAQ Partners
Sign in Start free
Session Replay

Watch exactly what
your users experienced.

DOM recordings of real user sessions (clicks, scrolls, rage clicks and navigation) with input masking on by default, privacy levels and selectors for everything else, and a link from every error to the sessions it hit.

Free tier included No credit card 2-minute setup
Site Qwality RUM overview with sessions and Core Web Vitals

The full picture, not just the stack trace.

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.

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.

Input masking on by default

Input values are masked before they leave the browser under every privacy level, and password, email and phone fields are masked whatever the setting. Page-text masking is a separate switch, off by default.

You choose which sessions record

Recording rules decide which sessions are replayed. A new application starts with three: every session with an error is replayed, an automatic sample is replayed within your replay quota, and 10% of sessions get detailed capture without replay. Change, disable or delete any of them.

From an error to the sessions it hit

Every error group lists the sessions it occurred in. When a session was recorded, its Watch Replay link opens the recording at the moment the error happened, so you go from a stack trace to a recording without searching.

Rage-click detection

One rage click per burst of three or more clicks on the same control within a second, so you can filter straight to the sessions where someone was fighting the interface.

Timestamped event timeline

Every click, navigation, network request, and error shown chronologically alongside the replay so context is never missing.

Privacy controls

Mask what you must.
Know what you keep.

Input values are masked under every privacy level, so they are replaced before the recording leaves the browser. Page text is recorded by default: Balanced, the level new applications start on, replaces email addresses, card-like numbers and long digit runs, and the rest of the visible text is recorded unless you turn page-text masking on, choose Strict or add a mask selector. These settings are per application. A change reaches a running recording when the SDK next loads the settings, which restarts it from a fresh snapshot, and recordings are masked again under the application's rules when they are compacted.

  • Input values masked under every privacy level; password, email and phone fields masked either way
  • Page-text masking is a separate setting, off by default
  • Mask, block and ignore-input selectors per application, plus the Strict, Balanced and Relaxed levels
  • Cross-origin iframes are never recorded, so a hosted payment field cannot be captured
app.siteqwality.com / replay / b7d4e1
Session #b7d4e1: Signup Form MaskedLIVE
DURATION1m 28s
INPUTS MASKED4
PASSWORD FIELDSmasked
/signup44ms
/verify89ms
/onboarding134ms
/dashboard31ms
Error-to-replay linking

From stack trace
to what actually happened.

Open any error group and it lists the sessions the error occurred in, with the user, the timestamp and the URL. When a session was recorded, its row carries a Watch Replay link that opens the recording at the moment the error happened. Replay is part of the same SDK as the rest of RUM, so there is no second script to install.

  • Affected sessions listed on every error group, with a Watch Replay link where a recording exists
  • Recording runs from the rule match onward, plus any bounded lead-up held in memory
  • Correlated with the full error stack trace and source-mapped code
install RUM + Session Replay<!-- add once, inside <head> -->
<script>
  (function(w,d,s,u){var r=w.SiteQwalityRUM=w.SiteQwalityRUM||{_q:[]};if(r._q&&!r._h){
  ['init','setUser','clearUser','setGlobalAttribute','removeGlobalAttribute',
   'addError','addAction','setView','setTrackingConsent','optOut','optIn',
   'isOptedOut','startReplay','stopReplay','getSessionUrl','getStatus'].forEach(function(m){
    r[m]=function(){r._q.push([m,arguments])}});
  r._h=function(e){r._q.push(['_e',[e]])};w.addEventListener('error',r._h);
  w.addEventListener('unhandledrejection',r._h);
  var e=d.createElement(s);e.async=1;e.src=u;(d.head||d.documentElement).appendChild(e)}
  })(window,document,'script','https://cdn.siteqwality.com/rum/v2/sdk.min.js');

  SiteQwalityRUM.init({
    applicationId: 'YOUR_APPLICATION_ID',
    clientToken: 'YOUR_CLIENT_TOKEN',
    trackingConsent: 'pending'
  });
</script>

✓ replay uploads once a recording rule matches
3

privacy levels: Strict, Balanced and Relaxed

1-click

from an error to its replay, when the session was recorded

30d

default replay retention, with shorter application ceilings

$0

free tier, 100 replay sessions included

FAQ

SDK 2.2.1 uses the application’s privacy settings. Balanced privacy masks inputs and applies configured sensitive-data patterns to text; Strict also masks page text and blocks media. Masking all page text is off by default in Balanced, so ordinary visible text can still be recorded. Password, email, telephone and payment-card inputs remain protected, and cross-origin iframe content is not recorded. Review RUM Settings → Privacy for each application, especially one created with older settings.

Configure CSS selectors in RUM Settings → Privacy to mask text, block elements or ignore input events. For example, selectors such as .rr-mask, .rr-block and .rr-ignore can target classes you add to your elements. The class alone is not enough under Balanced or Strict: rr-mask only works by itself when the application applies no text masking of its own. Blocking takes precedence. Strict-mode text exceptions do not unmask input values. SDK 2.2.1 gives data-sq-mask and data-sq-unmask no built-in behavior; configure a matching selector if you use your own attributes.

The core RUM script loads asynchronously. In SDK 2.2.1 it is 25.8 KB gzipped, and the recorder is a separate 29.4 KB gzipped file that loads only when a session is eligible to buffer or record replay. An eligible session may therefore download the recorder before a rule triggers an upload; a session with no eligible Replay rule never downloads it. Replay buffering is bounded in memory, and recording work and uploads are batched. Test the SDK with your own pages and recording rules to assess its impact.

Open the error in Error Tracking and choose Watch Replay for a session with a retained recording. The link seeks to the error timestamp. SDK 2.2.1 can keep a bounded in-memory replay buffer before an eligible recording rule matches, so an error-triggered recording can include the lead-up. This requires recording permission and an eligible Replay rule; it cannot recover activity from before buffering started, and memory limits, pauses or privacy controls can shorten the available history.

You can filter the session list by browser, operating system, country, visited page, whether the session contained an error, whether it has a replay, and whether it shows frustration signals. Search matches the user id or email address you passed to setUser, a session id, any visited URL and any error message in the session. You can also filter by session duration and recorded custom attributes. Choose Duration (ms) in the filter picker, or enter attr.<key> for an attribute.

Replay retention defaults to 30 days. Account admins can choose a 7, 14 or 30-day ceiling in RUM Settings → Data settings, within the account entitlement. Shortening the ceiling permanently removes older recordings and indexes asynchronously; saving the setting does not mean cleanup has finished. Removing a ceiling does not restore erased data. See the retention guide.

Account admins can request erasure by user ID, email, anonymous ID or session in RUM Settings → Data requests, or through the API. Review and confirm the scope, then follow its status and confirmed counts in request history. Optional do-not-record blocks future recording under a matching identifier. Shared stylesheet assets, audit evidence and aggregate billing records remain; backups and unrelated telemetry are outside this request. See the privacy guide.

Start free. No credit card.

Uptime, cron, synthetic, logs, RUM, incidents, and status pages. Free tier on every product.