Product pages

Filters

Every shipped filter, date, saved segment, scoped replay, refresh, live-session, and player-adjacent control on the Replays route.

Replays is not a separate search product. The shipped route uses the same URL-backed analytics filter system as Dashboard, then adds replay-specific scoped chips for issue and replay-set deep links.

Route: /projects/:id/replays
Selection query: ?replay=:sessionId
Scoped query: ?issue=:issueId or ?sessions=:commaSeparatedSessionIds
Seek query: ?t=:epochMs for issue/error deep links into the player

Page regions

RegionControls
Top barFilters, Saved filters, Date range, range shift arrows, Refresh data, live users indicator
Hanging chip barActive filter chips, Save filter, scoped Issue / Replay set chip
Left listReplay cards, skeleton loading, infinite scroll, empty/error states
Right paneSelected replay player, close button, replay metrics, live streaming, fidelity banner, activity panel toggle inside player

The list fetches 30 rows at a time and appends more as the scroll sentinel enters view.

Shared date range controls

Replays reads range, offset, startDate, endDate, and filters from the same URL state as Dashboard.

ControlBehavior
Calendar iconOpens custom calendar range picker
Range dropdownPresets grouped under LAST and TO DATE
Back arrowJumps back by preset span; shortcut Z
Forward arrowJumps forward when the resulting range does not end in the future; shortcut X

Presets

GroupValues
LASTLast hour, Last 24 hours, Last 7 days, Last 30 days, Last 6 months, Last 12 months, All time
TO DATEToday, Week to date, Month to date, Year to date

Default when no URL range exists is Month to date.

Live presets re-anchor roughly every 60 seconds while the current range reaches "now". Historical offsets do not live-tick.

Filters dropdown

Click Filters in the top bar.

Top-level fields:

FieldOperator label in chips
Useris / is not
Eventcontains / doesn't contain

Nested categories:

CategoryFields
PagesPage, Entry page, Exit page
AttributionChannel, Referrer, Campaign, Source, Search keyword
TechnologyBrowser, OS, Device, Screen size
LocationCountry, Region, City, Language, Timezone
CustomRegistered group slots only; hidden when no group type is registered

Fields intentionally not shown in the modal: raw UTM source/medium/term/content and funnel step. They exist in the backend filter grammar but are not first-class picker fields on Replays.

Value picker

After choosing a field, the value picker shows:

ControlBehavior
Search inputPlaceholder Search {field}; filters option labels, values, emails, and external IDs where available
Value rowsMulti-select; selected rows show a checkmark
CountOption counts appear on unselected rows when available
Apply filterEnabled after at least one value is selected
Back arrowReturns to field/category selection

For page/event filters, the chip reads Session contains ... because the filter asks whether the session included that page/event anywhere in its event stream.

Active filter chips

Each chip contains:

PieceMeaning
Field iconVisual category
Field labelResolved label, including group-type names when registered
Operator buttonClick to toggle between in and not_in
ValuesOne or two labels, then +N more
Remove buttonRemoves that rule immediately

Operator copy:

Field typePositiveNegative
Event, Page, Funnel stepcontainsdoesn't contain
Other fieldsisis not

Removing the last chip collapses the hanging chip bar after its exit animation; the URL updates immediately.

Saved filters / segments

The bookmark button beside Filters opens saved filters.

State / controlBehavior
LoadingLoading...
EmptyNo saved filters yet
Saved filter rowClick applies all saved rules
Active saved filterShows a checkmark
Row flyoutShows saved rules; operators can be toggled and removable rules deleted
DeleteDeletes the saved filter

When active rules do not match a saved filter, the chip bar shows Save filter. Saving opens a modal:

Modal fieldBehavior
Segment nameRequired, max length 80, placeholder e.g. Mobile signup funnel
Filter preview chipsOperators can toggle; filters can be removed before saving
SubmitCreates the segment; disabled until name is non-empty

If the active rules already match a saved filter, the same icon removes that saved segment.

Scoped replay chips

Replays has two route-specific scopes that sit above normal filter chips:

QueryChip labelMeaning
?issue=:idIssue · is · N matching replay(s)List is restricted to sessions linked from an Issue
?sessions=:idsReplay set · is · N matching replay(s)List is restricted to an explicit session set

The Remove replay filter button deletes both issue and sessions from the URL and returns to the normal filtered replay list.

Scoped chips combine with date range and shared filters. If a replay linked from an issue is outside the selected date range, widen the range.

Live sessions

Rows can have three lifecycle statuses:

StatusMeaning
liveIn-progress and actively emitting; the player streams over SSE
processingIn-progress but idle, not finalized yet
archivedFinalized and served from stored replay events

When any live/processing row is visible, the page refreshes page 1 in the background about every 15 seconds while the tab is visible. This updates badges and prepends new in-progress sessions without resetting your scroll.

Requirements for live presence:

RequirementDetails
SDK heartbeatBrowser sends /api/ingestion/heartbeat roughly every 30 seconds
Unarchived sessionThe session is not finalized by the archiver yet
Recent activityLive rows require events/heartbeats inside the active window

If you never see live rows, archived replays still work normally.

Refresh

The top-bar refresh button:

ControlBehavior
Refresh dataRefetches the first page with current filters
TooltipShows last refresh time or Refresh data
ShortcutCmd+R on Mac, Ctrl+R elsewhere; hard reload still works with Shift

The list also uses stale-while-revalidate: for a previously fetched filter URL, it can paint cached rows before the fresh page 1 response replaces them.

Replay cards

Each left-list card can show:

PieceSource
TitleAI short description, else start URL, else Inactive Session
Status badgeLive / processing state when present
Start timeRelative or formatted date based on preferences
Durationmm:ss
CountsClicks, keypresses, console errors
End userExternal ID, email, name, and internal user id when identified

Clicking a card sets ?replay=:id. The selected replay can be fetched directly if the URL points to a replay outside the currently loaded list.

Player-adjacent filters and seek

Query / controlBehavior
?replay=:idOpens that replay
?t=:epochMsInitial seek target for deep links, usually from Issues
Manual replay selectionClears t so a seek intended for one session is not applied to another
Close playerRemoves replay and clears t

If the selected replay is live or processing, the route uses the live replay player instead of the archived events fetch.

Empty and error states

StateUI
SDK status loadingBlank background while connection status initializes
SDK not connectedNo replays yet, Install Human Behavior, More options -> View demo, Book a call
List loadingReplay card skeletons
List errorError banner with Retry
Filtered/list emptyNo replays yet / Sessions will appear here once recorded.
Player events loadingProgress bar and Loading replay...
Player events errorError text + Retry
Player no eventsNo replay data available

Not shipped on this route

There is an older ReplaysSearchBar component in the codebase with AI search, device presets, duration presets, company-size presets, locked scopes, and search history. It is not imported by the current project Replays route and is not documented here as a shipped control.

Useful investigation filters

GoalFilter recipe
Checkout frictionPage contains /checkout, maybe Country / Device
Mobile bugsDevice is Mobile, Browser is Safari/Chrome
Campaign QACampaign or Source is the launch value
Identified customer supportUser is the identified user after identifyUser
Issue replay reviewOpen from Issue, then remove scoped chip to broaden