Audience: QA · Engineering · Sales · Support · Management · Where in app: Surfaced inside Recorded Sessions replay/detail and in Nox answers · Plan availability: All plans (signal extraction runs on every analyzed session)
This page documents exactly what the analysis worker pulls out of each recording. These structured signals are the building blocks behind everything downstream — replay markers, lead scoring, the intent label, friction detection, cohort aggregates, and Nox's person-centric answers. If you've ever wondered what "intent: evaluatepricing, friction: rage cluster on pricing" is computed _from, this is it.
What it does
Turns raw rrweb events into a structured, queryable artifact (session_analyses) of discrete signals, then synthesizes a single primary intent with confidence and supporting evidence. The same artifact powers replay markers, semantic search, lead scoring inputs, and Nox aggregations.
How it works
The recording-analysis worker (see Recorded Sessions › Analysis pipeline) runs an extractor per signal type after stitching the stream and rebuilding the DOM. Each extractor writes a section of the session_analyses row keyed by file_id.
Page trips — one URL visit within a session
| Field | Meaning |
|---|
url | Full URL |
title | Document title at entry |
entered_at / exited_at | Timestamps |
dwell_ms | Total time on the page |
active_ms | Time with tab focused and visitor interacting |
enter_via | direct / link_click / back_button / spa_route |
exited_to | Next URL (or unload) |
Clicks
| Field | Meaning |
|---|
target | CSS selector + nearest heading text |
coords | x/y pixel position |
dom_changed_within_500ms | Did anything visibly change after the click? |
led_to_navigation | Did the URL change? |
was_dead_click | Click with no visible response (no nav, no DOM change) |
was_part_of_rage_cluster | 3+ clicks in the same region within ~1 second |
| Field | Meaning |
|---|
max_depth_pct | Furthest scroll position |
time_at_depth_histogram | Time bins by scroll percentage |
oscillation_count | Up-and-down scrolls (indecision) |
reading_posture | scanner / reader / comparator / bouncer |
| Field | Meaning |
|---|
focus_ms | Time the field had focus |
backspaces | Edits / corrections |
abandoned_at_field | Did the user leave without submitting from this field? |
retry_cycles | Submit → error → fix → resubmit |
submit_result | success / error / abandoned |
Hovers
| Field | Meaning |
|---|
dwell_ms | Time hovered |
led_to_click | Did hover convert to click? |
time_to_commit_ms | Latency from hover to click |
Idles
| Field | Meaning |
|---|
tab_hidden | Tab went to background |
inactive_in_tab | Tab focused, no input |
dead_session | Long idle that ended the session |
Selections (highlights)
| Field | Meaning |
|---|
selected_text | What they highlighted |
nearest_heading | Section context |
dwell_highlighted_ms | Time the highlight persisted |
Viewport
dims (width/height), orientation, zoom (1.0 = default).
Console errors
Any thrown error or console.error on the page — useful for "is something broken that's hurting conversion?"
SPA route history
For single-page apps the widget emits knock:spa-route custom events so route changes are seen even without a full navigation. These drive page-trip detection on SPAs.
Intent (synthesized)
| Field | Meaning |
|---|
primary | One of a small fixed taxonomy: research / evaluate_pricing / support / transact / bounce / compare (verify full taxonomy) |
confidence | 0..1 rule-based confidence (not a learned probability) |
evidence[] | The specific signals that pointed to this intent |
friction_points[] | Stuck-points: rage cluster, dead click, abandoned form, error |
high_intent_signals[] | Configurable hints (visited pricing 3+ times, demo-related search, etc.) |
Configuration & options
| Setting | Where | Effect |
|---|
companies.knox.high_value_pages[] | Company Nox config | Which pages contribute to high_intent_signals[] |
| Rage-cluster definition | Worker heuristic | 3+ clicks, same region, within ~1s |
| Dead-click definition | Worker heuristic | Click with no navigation and no DOM change within ~500ms |
| Intent taxonomy | Worker (intent-synth) | Fixed small set of primary intents (verify exact list/thresholds) |
These are extraction heuristics tuned in the worker, not per-tenant UI settings (except high_value_pages[]). QA validating signal accuracy should compare the artifact against the replay.
Behaviors & edge cases
- Intent and confidence are rule-based, not a machine-learned probability of conversion. Treat them as heuristics.
- Dead-click detection is approximate — fast SPAs can update the DOM in ways the heuristic misses, producing false dead-clicks or missing real ones.
- High-intent signals are configurable via
companies.knox.high_value_pages[] and similar — a misconfigured high-value list pollutes both intent and lead scoring.
- rrweb + analysis budget impose a practical per-visitor-per-day limit — extremely heavy or numerous sessions may be sampled/truncated.
- SPA page trips depend on
knock:spa-route events — if the widget can't observe route changes (custom routers, shadow DOM), page-trip counts on SPAs can be undercounted.
Plan & limits
- Signal extraction runs on every analyzed session on all plans — it is the standard analysis output, not a paid add-on.
- The narrative/prose layer that summarizes these signals in plain English is the selective tier-2 LLM pass and is capped (see Recorded Sessions).
Technical implementation
- Service:
ms-sessions recording-analysis worker — extractors for page-trip, click, scroll, form, hover, idle, viewport, error, selection; intent-synth for the synthesized intent block.
- Collection:
session_analyses (keyed by file_id) holds all sections above; rolled into visitor_profiles.
- Consumers: replay markers (frontend
SessionPlayer), Lead Scoring inputs, ms-ai semantic index, and Nox aggregations.
- Nox tools:
knox-session-analysis(file_id) for a single session's full artifact; knox-aggregate for cohort metrics (bounce_rate, top_exit_pages, funnel_path, quality_breakdown, country_breakdown, silent_visitors, unengaged_visitors, yesterday_summary, missed_bookings).
- Subsystems: Session Recording.