session replay
A replay of one real visit, cursor and clicks and all, so you can watch exactly where a person got stuck and gave up.
See it
What it is
Session replay plays back one real visit: cursor path, clicks, typing, scrolls, resizes, the lot. It is almost never an actual video. The general trick is the same everywhere: record the initial DOM snapshot, then a stream of DOM mutations and input events, and re-render the page in an iframe on playback. That is why the file is small and why the text stays crisp and searchable. rrweb is one open-source implementation of that idea, used by PostHog among others; Hotjar, Clarity and the rest each ship their own recorder, so capture limits and masking behavior differ tool by tool.
Use it after your funnel has already told you where people drop, to find out why. The signals worth filtering for are rage clicks (five taps on the same dead spot), dead clicks (clicking something that only looks clickable), thrashed cursors, and u-turns back to the previous step. Ten replays of one broken step will usually explain a number that a month of dashboards did not.
Gotchas: replay records whatever is on screen, so mask inputs by default and block anything with card numbers, health data, or someone else's personal details, or you have built a compliance incident. Canvas, WebGL, video, and cross-origin iframes often replay as blank boxes. And it is qualitative: eight sessions are a hypothesis, not evidence. Confirm the fix with an experiment before you claim a win.
Ask AI for it
Add privacy-safe session replay to my web app using PostHog, whose recorder is built on rrweb. Initialize with replay enabled but mask all text inputs by default, block any element marked data-private, and skip recording entirely on billing and account settings routes. Sample at 10 percent of sessions, but always record a session that fires an error event or a rage-click event. Capture console errors and network request metadata without bodies. Then show me how to filter the replay list down to sessions that reached the checkout step and did not complete it.