Skip to main content

Per-Session Signals

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

FieldMeaning
urlFull URL
titleDocument title at entry
entered_at / exited_atTimestamps
dwell_msTotal time on the page
active_msTime with tab focused and visitor interacting
enter_viadirect / link_click / back_button / spa_route
exited_toNext URL (or unload)

Clicks

FieldMeaning
targetCSS selector + nearest heading text
coordsx/y pixel position
dom_changed_within_500msDid anything visibly change after the click?
led_to_navigationDid the URL change?
was_dead_clickClick with no visible response (no nav, no DOM change)
was_part_of_rage_cluster3+ clicks in the same region within ~1 second

Scroll

FieldMeaning
max_depth_pctFurthest scroll position
time_at_depth_histogramTime bins by scroll percentage
oscillation_countUp-and-down scrolls (indecision)
reading_posturescanner / reader / comparator / bouncer

Forms — per form, per field

FieldMeaning
focus_msTime the field had focus
backspacesEdits / corrections
abandoned_at_fieldDid the user leave without submitting from this field?
retry_cyclesSubmit → error → fix → resubmit
submit_resultsuccess / error / abandoned

Hovers

FieldMeaning
dwell_msTime hovered
led_to_clickDid hover convert to click?
time_to_commit_msLatency from hover to click

Idles

FieldMeaning
tab_hiddenTab went to background
inactive_in_tabTab focused, no input
dead_sessionLong idle that ended the session

Selections (highlights)

FieldMeaning
selected_textWhat they highlighted
nearest_headingSection context
dwell_highlighted_msTime 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)

FieldMeaning
primaryOne of a small fixed taxonomy: research / evaluate_pricing / support / transact / bounce / compare (verify full taxonomy)
confidence0..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

SettingWhereEffect
companies.knox.high_value_pages[]Company Nox configWhich pages contribute to high_intent_signals[]
Rage-cluster definitionWorker heuristic3+ clicks, same region, within ~1s
Dead-click definitionWorker heuristicClick with no navigation and no DOM change within ~500ms
Intent taxonomyWorker (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.