Insights

Session replays with AI assessment: watch the friction, then have it graded

Analytics tells you that 62% of people left the checkout. It cannot tell you that they left because the delivery field rejected their postal code without saying why. Session replay can, and it is usually the fastest route from a conversion problem to a fix.

GoGee records sessions in the browser, stores them efficiently, and then adds the part that makes replays survive first contact with a busy team: AI that reads a session and tells you what went wrong, so nobody has to watch forty recordings to find the one that matters.

GoGee feature series · 16 of 33

How it's actually built

Recorder
rrweb with all inputs masked by default
Masking controls
Block and mask by CSS class or selector
Buffering
Flush every 5 seconds or 500 events; beacon on page hide
Storage
Compressed event chunks in object storage, metadata in Postgres
Assessment model
google/gemini-2.5-flash with schema-validated output
Grounding
Funnel counts computed in SQL and substituted into AI output
Replay pipeline
  1. 01Input

    Recorder

    rrweb with all inputs masked by default

  2. 02Deterministic

    Buffer and flush

    Every 5 seconds or 500 events; beacon on page hide

  3. 03Database

    Store

    Compressed event chunks in object storage, metadata in Postgres

  4. 04Deterministic

    Funnel counts in SQL

    Numbers computed, not guessed

  5. 05AI

    Assessment

    Gemini 2.5 Flash, schema-validated, SQL figures substituted in

  6. 06Output

    Session report

    Friction findings a human can act on

Guardrails and fallbacks

  • Block and mask by CSS class or selector
  • Masking on by default, not opt-in

Session replays + AI assessment, data flow, generated from the shared GoGee feature diagram template.

What is recorded, and what never is

Recording uses rrweb with all inputs masked by default. On top of that, any element given the block class or selector is excluded from the recording entirely, and any element given the mask class has its text masked. Canvas recording and font collection are off.

The practical result is a replay you can show a client: the layout, the scrolling, the hesitation and the clicks, without the card number, the ID number or the password. Do-not-track is respected, admin and sign-in paths are skipped, and sampling rules control what proportion of traffic and which paths are captured at all.

  • All form inputs masked as a default, not an option
  • Element-level block and mask classes for sensitive regions
  • Do-not-track respected; admin and authentication paths excluded
  • Path, campaign and sample-rate rules decide what records

Meaningful events, not just mouse noise

Alongside raw rrweb events, the recorder emits custom markers: navigation, page view, form start, form submit, rage clicks and long dwell. Rage clicks are detected as three or more clicks within a second in the same small area, the strongest single signal that something on the page looks clickable and is not.

Server-side, each session is summarised into visited URLs, click count, rage-click count, input changes, scrolls, captured errors and duration. That summary is what makes both the AI assessment and the reporting cheap to run.

Efficient capture, sane storage

Events are buffered and flushed every five seconds or every 500 events, compressed in the browser where supported, and sent as chunks with a hard per-chunk size ceiling. On tab hide or page unload the remainder is sent by beacon, so the end of a session is not lost.

Event data lives as compressed chunks in object storage, while session metadata lives in Postgres: device, browser and operating system family, viewport, referrer, campaign parameters and click identifiers, entry and exit URL, duration, event and chunk counts, and a hashed visitor address rather than a raw one. Retention and per-session byte caps are settings, not code changes.

The AI assessment, and its guardrails

For a single session, the summary and metadata are sent to a model that returns schema-validated JSON: a headline, friction points, likely intent, suggested changes and a severity of low, medium or high. That result is stored on the session with a timestamp so it is generated once and read many times.

Across many sessions the design is stricter, and this is the part worth reading twice. The funnel, how many sessions reached each step, how many dropped from the previous step, and the percentages, is computed in SQL. The model is explicitly forbidden from producing any number at all. It clusters issues, picks which funnel step each issue belongs to and which computed metric applies, and the real number is then substituted into its output by code.

So the narrative is AI and the arithmetic is the database. You get prioritised, plain-language findings that are safe to forward to a client, because no figure in them was ever generated by a language model.

Playback and reporting around it

Sessions play back in the browser with a scrubbing controller, alongside a derived action timeline of clicks, filled fields and navigations where each entry seeks the player to that moment. Journeys are classified deterministically from URL patterns, so pricing exploration, checkout and support paths can be filtered without an AI call.

Reporting covers session volume, average duration and top paths over a rolling window, with comparison and diagnostic views for funnel work, plus per-admin watched flags and notes so a team can review a set of sessions without duplicating each other's work.

Questions we get asked

Is this POPIA-safe?

Inputs are masked by default, sensitive regions can be blocked entirely, visitor addresses are hashed rather than stored raw, do-not-track is respected and retention is configurable. Configuration still needs to match your own privacy notice.

Does the AI invent statistics?

No. Funnel counts and drop-offs are computed in SQL and substituted into the AI output. The model is instructed not to output numbers at all.

Do we have to watch every session?

No. Single sessions are graded with a severity level and a headline, so you can sort to the sessions that show real friction and watch those.