Analyse behaviour › Basics

Sessions and session ids

A session is one visit: all events with the same session id, plus the recording filed under that id. Your SDK sets the id. Replays, Watch and Ask need it.

On this page

What a session is

A session is one visit, as your analytics SDK defines it. For example: a trial user opens your pricing page, starts a trial, invites a teammate and leaves. That is one session.

Sequential groups events by the session id that each event carries. It files recordings under the same value. These features work per session and depend on the id: the Sessions → Latest list, with one row per id; Watch and Ask; and the events on the timeline of a replay, and its Insights tab.

Where the session id comes from

Your SDK sets the id. Sequential stores it exactly as sent. On the web, the Sequential recorder can set an id if your SDK has none. See Session replay (web).

The events and the recording must use exactly the same id. If your own code forwards the events, do not change the session id.

Events without a session

If an event arrives with no session id, Sequential stores it with an empty id. The event still counts as an event on Events, Funnels, Flows, Retention and Users. But the empty id is never a session:

  • Not in the list. Latest and the agent tool list_sessions never show a row for it.
  • Not counted as a session. The Sessions counts on Users and Accounts, and the Total sessions tile, do not count it.
  • No replay link. Sequential cannot match it to a recording.
  • Never judged. Watch, Ask and background judging skip it.

To see how many events arrive without a session id, open Events. Set grouped by to User Session. The row "(no session)" counts them.

What a session needs to be judged

Background judging is the source of Watch. It picks up a session only if all these conditions are true:

  • It has a session id.
  • It has at least 3 events that are not System events.
  • It has had no new event for 30 minutes.
  • Its last event is in the past 7 days. Sequential never judges older sessions automatically. This is also true when background judging is turned on again.
  • Background judging is on for your project and on your Sequential server.

Sequential judges a session one time only. If more events arrive later under the same id, Sequential does not add them to the judgment. This is important for ids that last a long time, such as the recorder's own id.

Check your sessions

  1. Click Watch in the left rail. It opens Sessions. Click the Latest tab. It lists the sessions in the date range. The date range is at the top of the page.
  2. To find events without a session id, open Events and set grouped by to User Session. A "(no session)" row counts them. Latest does not list them.
  3. On an Amplitude site, also look for the session -1. In the same grouping, its row reads "-1".
  4. Check the end of each row on Latest. ▶ Replay (Play session replay) means a recording exists under exactly that id and you can play it. Otherwise the row says why you cannot play a recording now. "No recording" means that Sequential has no recording under that id, or that the recording expired and Sequential removed its index. "Processing · ready by 14:05" and "Expired" mean that a recording exists. In Latest, the sessions of each page get their state with the page. In Watch and the session list of a user, up to 200 sessions get their state with the list. The other sessions get their state when their rows come into view. Until a row has its state, a dim "…" shows in place of ▶ Replay, the label or the chip. Its label is "Checking recording…", and you cannot click it. It shows from the moment the list appears, also for a session without a recording. So ▶ and "No recording" never show before Sequential answers. If you scroll past a row before Sequential asks for its state, the row keeps "…" until it comes into view again. This usually takes less than a second. It takes longer when many rows come into view at once, or after a "Too many requests" refusal. If Sequential cannot read the state, it tries one more time, about 30 seconds later. After a "Too many requests" refusal, it waits as long as the refusal asks. Meanwhile, a row shows ▶ if Sequential has an index of a recording, even if the recording expired. The other rows keep "…". If the second try also fails, the rows with an index keep ▶. The other rows read "Couldn't check recording": as text in Latest, and as a chip in Watch and in the session list of a user. A failed check never shows "No recording". If Sequential has an index of a recording but finds no part of it near the dates of the list, the row keeps ▶. A "Processing" row checks again after the time in its label. When the recording is ready, the row shows ▶ without a reload. Ask results, the sample sessions of a finding and the Worth watching tile on Dashboard get their state with the answer. A row there without a state gets it when it comes into view, and a "Processing" row there checks again in the same way.

Limits

  • Blocked storage separates events and recording. If the browser blocks site storage, the Sequential SDK starts a new session on each page load. The recorder creates its own id. So the events of that visitor do not join their recording.
  • Mixpanel sessions can last all day. If you do not register your own $session_id, the session uses the recorder's id. Then a tab that stays open all day is one session. See End Mixpanel sessions after idle time below.
  • Latest loads 100 sessions at a time. The next 100 load when you scroll near the end of the list, or when you press Load more. The count next to the tabs is the number of sessions in the range, not the number on the screen. If Sequential cannot count them in 2 seconds, the count reads 10,000+.
  • Another analytics SDK takes the recording. If PostHog, Amplitude, Pendo, Smartlook or Mixpanel also runs, Sequential SDK events do not join the recording.
  • Session ids have a fixed format. Use at most 128 letters, digits, dots, underscores, colons or hyphens. Sequential refuses recordings under any other id.
  • Amplitude -1 is a real session. Sequential joins all users' -1 events into one session and can judge it. Do not send session_id -1.
  • Server-side events have no session. If your backend sends events, pass the visitor's session id with each event. Otherwise they get no replay or judgment.
  • Mixpanel events can join an old session. After the recorder runs, events on excluded pages or with recording off go into the last recorded session.
  • Judging waits for the allowance. If your project uses its daily judging allowance, sessions wait until it resets at midnight UTC.
  • A short session is never judged later. If a session has fewer than 3 non-System events after 30 idle minutes, later events do not change this.
  • Ask reads at most 2,000 sessions. It takes the newest 2,000 in your date range and filters, and ignores the rest.
Session id per SDK

On the web, the recorder files the recording under the session id that your analytics SDK already uses. On iOS and Android, PostHog's SDK sends the events and the recording under the same session id, with no recorder (Mobile apps).

On a Mixpanel site, sessions come from the web recorder, or from a $session_id super property that you register yourself.

Source Session id stored If the SDK has none
Sequential SDK Its own id, on every event —
PostHog (web and mobile) PostHog's $session_id On the web, the recorder's id, which the recorder registers with PostHog. None on mobile
Amplitude Amplitude's session_id, stored as text None. The recorder does not register its id with Amplitude
Mixpanel $session_id. Mixpanel's browser SDK does not set it by default The recorder's id, which the recorder registers as a super property
Pendo Pendo's session id The recorder's id, sent as visitor metadata
Smartlook compatibility script The script's own id —
When a session ends, per SDK

Your SDK decides when a session ends and a new id starts.

Source When a new session starts
Sequential SDK On the first event after 30 minutes with no event, 24 hours after the session started, or when you call sequential.reset(). Each browser tab keeps its own session. The recorder follows each change within a second.
Smartlook compatibility script After 30 minutes with no event.
PostHog, Amplitude and Pendo Their own rules. The recorder follows each change within a second.
Mixpanel The $session_id super property. If you do not register your own, the session uses the recorder's id. Then a tab that stays open all day is one session.
An id that the recorder created No idle limit. The id lasts as long as the tab.
How the recorder picks the id
  1. The recorder loads the recording settings of your project first. If recording is off for the project, or the page is excluded, the recorder stops and sets no id.
  2. For up to 2 seconds, it looks for a session id from PostHog, Amplitude, Mixpanel, Pendo, the Smartlook script or the Sequential SDK, in that order. It takes the first id it finds. The Sequential SDK stores its id in the storage of the browser tab before it starts the recorder, so the two start on the same id.
  3. If it finds none, it reuses the session id in the storage of the browser tab.
  4. If there is still no id, the recorder creates one. It registers the id with PostHog, Mixpanel and Pendo, so their events carry it from then on.
  5. While it records, the recorder checks every second if the PostHog, Amplitude, Mixpanel, Pendo, Smartlook or Sequential SDK id has changed. If it has, the recorder closes the recording under the old id and continues under the new id. The part under the old id keeps the user id that it had before the change, also after a reset() at sign-out.

The recorder takes the id of the Sequential SDK only if no other analytics SDK on the page gives one. If PostHog, Amplitude, Pendo, the Smartlook script or a Mixpanel $session_id is also there, the recorder takes that id. Then the events of the Sequential SDK do not join the recording.

For example, this can happen during a migration.

Sampling and early stops

Each browser tab has one sampling decision per session id. So in one tab, a visit never has some pages kept and others dropped.

  • A session that spans several tabs is sampled in each tab separately.
  • If the browser blocks storage, every page load is sampled separately.
  • A session that sampling leaves out still gets its id. It has no recording.

A recorded session can also stop early:

  • Each page load stops recording after the Max minutes of the project.
  • Sequential stops accepting the recording of a session when it reaches Max MB.
  • Both are under Session caps in Recording settings. The defaults are 60 minutes and 25 MB.
  • If a single-page app moves to an excluded page, recording stops until the next page load.
Causes and other effects of events without a session
  • Mixpanel in a browser where the recorder has never registered an id. For example: no recorder, recording off, only excluded pages visited, or events sent on a first visit before the recorder registers its id.
  • Events that your backend sends through a server-side SDK or API, unless you pass the session id of the visitor with each event.
  • Profile-only updates that some SDKs send outside a session, such as calls to Amplitude's Identify API.

Mixpanel after the recorder has run

Mixpanel keeps the id that the recorder registers as a super property. All tabs of your site share this id. Mixpanel keeps it across visits. So after the recorder has run in a browser, the Mixpanel events that it does not cover still have a session id.

These events carry the id that the recorder registered most recently, so they go into that older session:

  • events sent while the recorder starts in a new tab
  • events on excluded pages
  • events after you turn recording off

Amplitude session_id of -1

Amplitude uses a session_id of -1 to mark events outside a session. Sequential does not treat these events as events without a session. It stores -1 like any other id.

  • All such events, from all users, form one session on Latest, with the session id -1.
  • Unlike events without a session id, this is a session. Sequential can judge it, and Ask can return it.
  • If you send Amplitude events yourself, do not send session_id at all. Do not send -1.
End Mixpanel sessions after idle time
  1. Register a $session_id super property with Mixpanel.
  2. Change it when a visit ends. The recorder finds the change.

Use an id of at most 128 characters. Use only letters, digits, dots, underscores, colons or hyphens. A UUID works. Sequential refuses recordings under any other id, so the session has events but no replay.

Linked recordings of one user

If a new recording of the same user starts in 30 minutes or less after the previous one ends, the replay links them. The Info tab shows ← previous segment.

This needs a user id on the recording:

  • On the web, the recorder reads it from PostHog, Amplitude, Mixpanel, Pendo or the Sequential SDK.
  • In iOS and Android apps, it comes from PostHog.
  • On a site that uses only the Smartlook compatibility script, recordings have no user id. So the replay never links them.
Judging times and other judged views

Background judging reads events, so it does not need a recording. For what Ask and the Insights tab need, see below and Judgments.

Events that count for judging

Events that are not System events are page views, clicks, form submits, identifies, errors, rage and dead clicks, or custom events (Events).

When the judgment arrives

Sequential looks for sessions to judge every 5 minutes. So the earliest judgment arrives 30–35 minutes after the last event. It takes longer in these cases:

  • Many sessions are waiting. Each check picks up at most 500 sessions per project.
  • Your project has used its daily judging allowance. Then sessions wait until it resets at midnight UTC.

Sessions marked too short

Some sessions have 3 or more events, but fewer than 3 that are not System events. After 30 minutes with no new event, Sequential marks such a session too short. It never judges the session, even if more events arrive later under the same id.

Ask and Insights

  • Ask looks only at sessions with a session id and at least 3 events of any kind. Of those in your date range and filters, it takes the newest 2,000.
  • The Insights tab needs a recording and at least 3 meaningful events. If not, it shows "Not enough activity to judge — fewer than 3 meaningful events".
More checks in a replay
  1. To see the events of a session on the Events page, open the ⋯ menu of its row on Latest. Then choose Open events.
  2. Play a session. The Info tab shows the Session id.
  3. Check the Events tab of the replay. It lists the events that your SDK sent from 5 minutes before the recording starts to 5 minutes after it ends. It shows at most the first 2,000.
Why the SDK session changes during a page

The Sequential SDK starts a new session after 30 idle minutes, after 24 hours, or when you call sequential.reset(). For example, you can call it at log-out. If this happens while a page stays open, the recorder follows the new id within a second.

What a row on Latest shows

A row on Latest shows:

  • Who: the label of the latest User ID in the session. With the Sequential SDK, PostHog or Mixpanel, an anonymous id that is linked to an identified value shows as that value. See Users and identity.
  • What happened: the route of the first page view, then how many different routes the session viewed, such as /pricing → 6 pages. Below it is the verdict of background judging, or "Not judged yet".
  • Problems: JS errors and failed requests, such as "2 JS errors". They count the whole session in your date range, whatever your filters.
  • Duration, and When the session started, such as "3 h ago". Hover When for the exact local time.

The list shows no session id. The ⋯ menu of a row has Copy session ID, Copy user ID, Show only this user and Open events.

What happened, Duration and When count only the events in your date range. From 9 October 2026, a filter decides which sessions are listed, not which of their events count. Duration is the time from the first event to the last. So if a session crosses the edge of the range, the row shows only the part in the range.