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
| Region | Controls |
|---|---|
| Top bar | Filters, Saved filters, Date range, range shift arrows, Refresh data, live users indicator |
| Hanging chip bar | Active filter chips, Save filter, scoped Issue / Replay set chip |
| Left list | Replay cards, skeleton loading, infinite scroll, empty/error states |
| Right pane | Selected 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.
| Control | Behavior |
|---|---|
| Calendar icon | Opens custom calendar range picker |
| Range dropdown | Presets grouped under LAST and TO DATE |
| Back arrow | Jumps back by preset span; shortcut Z |
| Forward arrow | Jumps forward when the resulting range does not end in the future; shortcut X |
Presets
| Group | Values |
|---|---|
| LAST | Last hour, Last 24 hours, Last 7 days, Last 30 days, Last 6 months, Last 12 months, All time |
| TO DATE | Today, 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:
| Field | Operator label in chips |
|---|---|
| User | is / is not |
| Event | contains / doesn't contain |
Nested categories:
| Category | Fields |
|---|---|
| Pages | Page, Entry page, Exit page |
| Attribution | Channel, Referrer, Campaign, Source, Search keyword |
| Technology | Browser, OS, Device, Screen size |
| Location | Country, Region, City, Language, Timezone |
| Custom | Registered 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:
| Control | Behavior |
|---|---|
| Search input | Placeholder Search {field}; filters option labels, values, emails, and external IDs where available |
| Value rows | Multi-select; selected rows show a checkmark |
| Count | Option counts appear on unselected rows when available |
| Apply filter | Enabled after at least one value is selected |
| Back arrow | Returns 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:
| Piece | Meaning |
|---|---|
| Field icon | Visual category |
| Field label | Resolved label, including group-type names when registered |
| Operator button | Click to toggle between in and not_in |
| Values | One or two labels, then +N more |
| Remove button | Removes that rule immediately |
Operator copy:
| Field type | Positive | Negative |
|---|---|---|
| Event, Page, Funnel step | contains | doesn't contain |
| Other fields | is | is 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 / control | Behavior |
|---|---|
| Loading | Loading... |
| Empty | No saved filters yet |
| Saved filter row | Click applies all saved rules |
| Active saved filter | Shows a checkmark |
| Row flyout | Shows saved rules; operators can be toggled and removable rules deleted |
| Delete | Deletes the saved filter |
When active rules do not match a saved filter, the chip bar shows Save filter. Saving opens a modal:
| Modal field | Behavior |
|---|---|
| Segment name | Required, max length 80, placeholder e.g. Mobile signup funnel |
| Filter preview chips | Operators can toggle; filters can be removed before saving |
| Submit | Creates 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:
| Query | Chip label | Meaning |
|---|---|---|
?issue=:id | Issue · is · N matching replay(s) | List is restricted to sessions linked from an Issue |
?sessions=:ids | Replay 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:
| Status | Meaning |
|---|---|
live | In-progress and actively emitting; the player streams over SSE |
processing | In-progress but idle, not finalized yet |
archived | Finalized 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:
| Requirement | Details |
|---|---|
| SDK heartbeat | Browser sends /api/ingestion/heartbeat roughly every 30 seconds |
| Unarchived session | The session is not finalized by the archiver yet |
| Recent activity | Live 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:
| Control | Behavior |
|---|---|
| Refresh data | Refetches the first page with current filters |
| Tooltip | Shows last refresh time or Refresh data |
| Shortcut | Cmd+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:
| Piece | Source |
|---|---|
| Title | AI short description, else start URL, else Inactive Session |
| Status badge | Live / processing state when present |
| Start time | Relative or formatted date based on preferences |
| Duration | mm:ss |
| Counts | Clicks, keypresses, console errors |
| End user | External 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 / control | Behavior |
|---|---|
?replay=:id | Opens that replay |
?t=:epochMs | Initial seek target for deep links, usually from Issues |
| Manual replay selection | Clears t so a seek intended for one session is not applied to another |
| Close player | Removes 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
| State | UI |
|---|---|
| SDK status loading | Blank background while connection status initializes |
| SDK not connected | No replays yet, Install Human Behavior, More options -> View demo, Book a call |
| List loading | Replay card skeletons |
| List error | Error banner with Retry |
| Filtered/list empty | No replays yet / Sessions will appear here once recorded. |
| Player events loading | Progress bar and Loading replay... |
| Player events error | Error text + Retry |
| Player no events | No 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
| Goal | Filter recipe |
|---|---|
| Checkout friction | Page contains /checkout, maybe Country / Device |
| Mobile bugs | Device is Mobile, Browser is Safari/Chrome |
| Campaign QA | Campaign or Source is the launch value |
| Identified customer support | User is the identified user after identifyUser |
| Issue replay review | Open from Issue, then remove scoped chip to broaden |