Skip to main content

Standardized Measurement

The recommendation policy and the UI are configurable. The event schema is not. Every UI track WatchLens supports (bundled presets, in-browser code, visual block tree) emits the same 33 events across the same 6 categories. The policy that produced each recommendation and the position the participant saw it in attach to every row.

This page explains what the schema captures, why it is invariant, and what behavioural questions it makes answerable.

The six categories​

CategoryEventsWhat they capture
SessionSESSION_START, SESSION_ENDParticipant identity plus environment plus lifetime
NavigationPAGE_LOAD, PAGE_EXIT, NAVIGATIONWhere in the app the participant was, with dwell time
PlaybackVIDEO_PLAY, VIDEO_PAUSE, VIDEO_SEEK, VIDEO_ENDED, VIDEO_PROGRESS, VIDEO_WATCHED_1S, VIDEO_WATCHED_5S, VIDEO_BUFFERING, VIDEO_META_CAPTURED, PLAYBACK_RATE_CHANGE, VOLUME_CHANGE, FULLSCREEN_CHANGE, KEYBOARD_SHORTCUTEvery measurable thing a video player does
ImpressionsHOME_FEED, RECOMMENDATIONS, IMPRESSION, VIEWPORT_VISIBILITYWhich videos were on screen and for how long
InteractionsFEED_CLICK, LIKE, DISLIKE, VIDEO_CLICK, THUMBNAIL_HOVERWhat the participant did with the videos
Browser stateMOUSE_MOVEMENT, SCROLL, VISIBILITY_CHANGE, WINDOW_FOCUS, WINDOW_BLUR, LAYOUT_CHANGETab focus, scroll, mouse traces. The signal behind attention

The full payload contract for each event is in the Event Schema reference.

What "exposure-aware" means​

Every impression event carries the position_in_feed the participant saw it at. Click-through rate is therefore a precise quantity, not a proxy.

CTR per session = | feed_clicks ∩ impression_videos | / | impressions |

Sessions with no impressions contribute nothing. They are not 0/0 = NaN, and they are not a synthetic 0 that would dilute the average.

Watch ratio (the fraction of the video duration the participant actually watched) rides on VIDEO_ENDED. The platform uses median across all playbacks, since the distribution is heavy-tailed (loops, replays, near-zero abandons) and means are misleading.

Why the schema is invariant​

The schema is defined by surface primitives, three React components that the platform ships.

  • <FeedSurface> wraps a feed page. It wires page-load, scroll, mouse, viewport, and visibility events. It fires HOME_FEED for newly seen videos.
  • <WatchSurface> wraps a watch page. Same as <FeedSurface>, plus VIDEO_META_CAPTURED for the current video and RECOMMENDATIONS for the related list.
  • <VideoSurface> wraps a single card or player. Card mode emits IMPRESSION, THUMBNAIL_HOVER, and either FEED_CLICK or VIDEO_CLICK. Watch mode produces the playback event family via render-prop handlers.

A UI track must mount these surfaces. There is no way to render a feed page through the platform's data hooks without going through <FeedSurface>. The contract is enforced by where data lives.

  • Data hooks (useFeed, useVideo, useRelated, useComments, useLikes, useUser) are the only sanctioned reads.
  • Surface primitives are the only sanctioned writes.
  • Bypassing them (calling axios directly, etc.) breaks the contract silently. The platform refuses to do that work, but a determined researcher can. The recommended habit is to not.

This is the part of WatchLens that makes data from different studies comparable. Two studies run on different policies and different UIs land identical-shape rows in the events table.

What you can answer with this schema​

A short and incomplete list.

  • Position effects. Did changing the feed layout (for example, 4-col grid → 1-col mobile list) change which positions get clicked?
  • Algorithm comparisons. With the policy attached to each event, CTR / Watch Ratio / Session Length / Session Duration medians are directly comparable across groups.
  • UI confounds. With device assignment per group (see device routing), a viewport-driven layout difference cannot silently confound a treatment.
  • Behaviour patterns. Mouse, scroll, focus, and tab visibility give a signal-rich attention proxy without survey overhead.
  • Self-report alignment. Surveys (with three timings, pre / post / inter-session) attach to the same user identity, so behavioural and self-report data sit in the same data model.

Where to go next​