# Users and identity

> Sequential files every event under one user id. It is an anonymous id until your app identifies the visitor, then exactly the value your app passes.

> **In short**
>
> - Pass one value for each person. Two values for one person make two users.
> - Sequential stores the value exactly as your app passes it. It does not rank identities.
> - With the Sequential SDK, PostHog or Mixpanel, a visitor who identifies counts as one person on **Users**, each user's page, **Sessions**, **Funnels**, **Flows**, **Retention** and the user counts on **Events**.
> - A **User ID** filter with the identified value, or with a linked anonymous id, finds all of that person's events.
> - The **Dashboard** tiles count user ids. There, the anonymous id is still a separate user. On the **Traffic** tile, this figure is labelled **User IDs**, with the hover text "Distinct user ids. A visitor who signed in during a visit counts once per id they used." On the **Top pages** tile, each row reads like "12 user IDs".
> - The judge never sees the user id.

## What it is for

The user id lets Sequential answer questions about people, not only events:

- How many people, not clicks, used the new export this week?
- Of the people who signed up in March, how many came back a week later?
- What did this customer do before they emailed support?

Each answer is only as good as the user ids your app sends.

## How it works

Every stored event carries exactly one user id.

- **Before your app identifies the visitor**, the user id is an anonymous id. The Sequential SDK creates one the first time a browser loads your site. It keeps the id in that browser's storage.
- **After your app identifies the visitor**, the user id is the value your app passes. The Sequential SDK keeps the value, so later visits from that browser carry it too. The SDK keeps the value until your app calls `sequential.reset()` on sign-out.

Other SDKs have their own anonymous ids. Sequential does not store an id as anonymous. The lists decide it when they show the id: a user id with an identify event, or with a linked anonymous id, is identified. On **Users**, **Sessions** → **Latest** and **Events**, the avatar of an identified user reads **Identified user** when you hover it. It has no check mark. Any other id has a dashed avatar and reads "Anonymous visitor" and its first 6 characters. On **Users**, only identify events in your date range and filters count.

> **Call `sequential.reset()` on sign-out**
>
> If your app does not call `sequential.reset()`, Sequential files the next person on that browser under the previous user's id. If your app then identifies the next person, the SDK links the previous user's value to the next person's value. The **Users** list then shows all the events stored under the previous user's value under the next person, from every device.

## Use one value for each person

Sequential stores the value that your app passes to identify exactly as it is. Any stable identifier works. For example: your own account id, an email or an account key.

Sequential does not rank identifier types, and it does not guess that two values are one person. If your app identifies one person with two values, Sequential sees two users. For example: an email on one screen and an account key on another.

Your app must keep the value the same. Pick one identifier and pass it for that person every time. [Identify your users](/docs/identify-users) shows how for each SDK.

> **Pass a string**
>
> With the Sequential SDK, the value must be a non-empty string. A call such as `sequential.identify(42)` has no effect and shows no error. The visitor stays under the anonymous id, so pass `String(id)`.

## What uses the user id

These pages use the stored user id and the identify link. With the Sequential SDK, PostHog or Mixpanel, they count a visitor who identifies as one person:

- The **Users** list and each user's page.
- The user id on each row of **Sessions** and Watch.
- [Funnels](/docs/funnels), [Flows](/docs/flows) and [Retention](/docs/retention).
- The **Unique users** line and the **Active users** tile on **Events**.
- A **User ID** condition on **Events**, **Sessions** and **Users**, and in funnel and flow steps. See [Filters, date ranges and saved views](/docs/filters-and-saved-views).

See **The link to the anonymous id** below.

These use only the stored user id:

- The tiles on **Dashboard**. They count user ids, so a visitor who identifies counts once under each id. On the **Traffic** tile, the figure is **User IDs**.

**Events**, **Users**, **Accounts** and **Sessions** never count a blank id as a user, an account or a session. **Funnels**, **Flows** and **Retention** never count an event without a user id as a user.

The replay is the exception. It uses the recording's own user id. See **Replays and the user id** below.

## What does not use the user id

Judgments are about sessions, not people. The judge never sees the user id or anything your app passes to identify. See [Judgments](/docs/judgments).

## Limits

- Sequential stores the events sent before identify under the anonymous id. The pages that use the link count them under the identified value. The **Events** list and its group table still show the id that each event was stored under.
- The **Dashboard** tiles do not use the identify link.
- Only the Sequential SDK, PostHog or Mixpanel sends the link. With Amplitude, Pendo or Smartlook, the anonymous id and the identified id stay two users on every page.
- Until your app identifies the visitor, a second device, a private window or cleared storage makes the same person a new user. If the browser blocks storage, every page load starts a new anonymous id.
- With Smartlook, each identified person appears as two users.
- On a site with only the Sequential SDK or Smartlook, the replay shows **anonymous**. Its ‹ › buttons stay disabled.
- On a site with only the Sequential SDK, Session insights reads every recording as anonymous, even after your app identifies the visitor.
- From 10 October 2026, the **Users** list shows 100 rows at a time, with no limit on the pages. The most recent activity comes first.
- The **Users** list and the **Sessions** card of a user page cover the date range in the top bar. The top of a user page covers all the data that Sequential keeps. "No one with this id in this project." means that no event that Sequential keeps has the id.
- The **Users** list and user pages do not show user properties. The one exception: a name or email from an identify call shows in **Who**.
- Only Pendo and `sequential.account()` fill accounts.
- From `posthog.identify()` on the web, only a name or email shows anywhere: in **Who** on the lists. Other properties passed there do not appear.
- Sequential does not store `mixpanel.people.set`. Mixpanel's browser SDK gives no user properties.
- From an Amplitude `Identify`, Sequential stores only `set` and `setOnce`. It ignores `add`, `append` and `unset`.
- With Amplitude, Pendo or Smartlook, if your app identifies a visitor mid-session, **Total sessions** on **Users** counts that session twice, once under each id.
- By default, **Retention** puts each user in the cohort of the day of their first start event ever, when that day is in the selected date range. A user who did the start event before the range is in no cohort. With **Count** set to **everyone active in the range**, it uses the first start event in the range.

### Where each source's user id comes from

| Source | Stored user id | Falls back to |
|---|---|---|
| Sequential SDK | Its anonymous id, then the value you pass to `sequential.identify()` | — |
| PostHog (web and mobile) | `distinct_id`, which PostHog's `identify` sets | — |
| Mixpanel | `distinct_id`, which `mixpanel.identify()` sets | `$device_id` |
| Amplitude | The id from `amplitude.setUserId()` | `device_id` |
| Pendo | The `visitor.id` you pass to `pendo.initialize` | — |
| Smartlook | The id in `smartlook('identify', …)` | The Smartlook visitor id |

With Smartlook, only the identify call carries your id. Every other event stays under the Smartlook visitor id. Because of this, each identified person appears as two users.

### How each page uses the user id

- **Users** lists one row per user id with its **Activity**, **Top pages**, **Problems**, **First seen** and **Last seen**. With the Sequential SDK, PostHog or Mixpanel, an anonymous id that is linked to one identified value is counted in that value's row. Click the user in **Who** to open that user's page, with their sessions and **All events**. See [Users and accounts](/docs/users-and-accounts).
- An event without a user id is not a user. **Users** does not list it, and the **Users** tiles do not count it. On **Users**, a line under the tiles counts these events, for example "12 events in 3 sessions in this period aren't linked to a user."
- **Funnels** match each person's events to the steps in order. With the Sequential SDK, PostHog or Mixpanel, the steps before and after identify join. Each drop-off list shows user ids. For a person who identified, it shows the identified value. Each id links to the **Users** page.
- By default, **Retention** puts each user in the cohort of the day of their first start event ever, when that day is in the selected date range. This is not their first day ever. Then it checks whether they did a return event exactly N days later.
- **Flows** build paths per person. With the Sequential SDK, PostHog or Mixpanel, one path covers the events from before and after identify.
- **Events** counts distinct people for the **Unique users** line and the **Active users** tile. With the Sequential SDK, PostHog or Mixpanel, a visitor who identifies counts once. A blank id is not a user. Grouped by **User**, each row of the group table is a stored id, and the events without a user id are one row, "(no user)".

### Replays and the user id

In a replay, the ‹ › buttons (**Previous session of this user**, **Next session of this user**) step through that user's recordings. They use the recording's own user id.

On the web, the recording takes that id from the page while it records. It takes it from PostHog, Mixpanel, Pendo or the Sequential SDK, or from Amplitude after `setUserId()`.

In these cases the player shows **anonymous** and the buttons stay disabled:

- Only Smartlook is on the page.
- The visitor is an anonymous Amplitude visitor.
- The Sequential SDK is on the page, and the browser blocks storage.

### What the judge learns about the user

[Watch](/docs/watch) does not use the user id to pick sessions. The judge reads each session's events and a few facts about it. Sequential judges anonymous sessions like any other.

- For Watch and [Ask](/docs/ask), the judge learns only whether the visitor identified during the session.
- [Session insights](/docs/session-insights) tells the judge only whether the recording carries a user id. On the web, that id comes from PostHog, Mixpanel, Pendo, Amplitude or the Sequential SDK on the page. It can be an anonymous id.

On Watch rows, the user id is only a label that links to the user's page. On Ask results, it is plain text.

### Example: a visitor who identifies mid-session

Ana reads your pricing page on Monday and leaves. On Tuesday she returns in the same browser and starts a trial. Your app identifies her as `ana@example.com`. With the Sequential SDK:

- Sequential stores Monday's session, and Tuesday's up to sign-up, under her anonymous id. It stores the rest of Tuesday, and later visits from that browser, under `ana@example.com`.
- The **Users** page shows one user, `ana@example.com`, with both sessions. **Total sessions** counts Tuesday once.
- The **Sessions** list and Watch show `ana@example.com` on Monday's session and on Tuesday's.
- Her user page lists both sessions, and all of Tuesday.
- Funnels, flows and retention count her once. Her steps from before sign-up join her steps after it.
- A **User ID** filter with `ana@example.com` finds Monday's events too.
- The **Dashboard** tiles count her anonymous id and `ana@example.com` as two users: 2 under **User IDs**.

### The link to the anonymous id

When identify runs, the Sequential SDK also sends the anonymous id that it replaces. Sequential records that link. Sequential does not change the stored events. It applies the link each time a page that uses it loads. See **What uses the user id** above:

- **The session where identify ran** shows under the value from that identify.
- **The other sessions of that anonymous id**, earlier or later, show under the same value. If the anonymous id is linked to two values, they show under the first value that Sequential received for that anonymous id.
- **All other events** keep the stored user id.

More about the link:

- It also applies to events from before identify, on any date. So the result for a past period can change after a later identify.
- A new link can take up to 5 minutes to show.
- Only the Sequential SDK, PostHog or Mixpanel sends the link. For Mixpanel, Sequential keeps the link from 12 October 2026. A Mixpanel identify stored before that date has no link.
- The link is one step. If your app identifies Ana by her email and then by an account key in the same session, the anonymous part shows under the email. The events stored under the email show under the account key.
- If one anonymous id is linked to two values, each session where identify ran shows under its own value. The other sessions of that id show under the first value that Sequential received for that anonymous id. "First" means the first link to arrive at Sequential, not the earliest identify call. If two links arrive together, do not rely on which one is first. This applies on **Users**, each user's page, **Accounts**, **Sessions**, **Events**, the **User ID** filter, funnels, flows and retention.
- Two links from one anonymous id are not frequent. Identify links the id that the page has at that moment. So if two people sign in one after the other on one page without `sequential.reset()`, the second identify links the first person's value, not the anonymous id. See **Call `sequential.reset()` on sign-out** above.
- After `sequential.reset()`, the browser has a new anonymous id. Nothing links it to the previous user.

### User properties

User properties describe the person, not one event. The filter fields call them **Visitor Property**.

| Source | Stored as user properties |
|---|---|
| Sequential SDK | None. Properties passed to `identify()` are stored on its `$identify` event, and `register()` properties on every later event. |
| PostHog | None. `posthog.setPersonProperties()` leaves `$set` and `$set_once` on its `$set` event as JSON. From `posthog.identify()` on the web, a name or email shows in **Who** on the lists. Other properties passed there do not appear. |
| Mixpanel | Not from `mixpanel.people.set`: Sequential does not store it. A group update (`/groups`) is stored as user properties on a user with no id. |
| Amplitude | `set` and `setOnce` from an `Identify`. `add`, `append` and `unset` are ignored. |
| Pendo | Visitor metadata, and the properties on `pendo.track` calls. Account metadata becomes account properties. |
| Smartlook | `identify` properties and `smartlook('properties', …)`. |

You find user properties in these places:

- The **Visitor Property** and **Account Property** filter fields. They match the name and value exactly.
- The replay's **Info** tab, under **User properties**, when the session's first event carries them.

The lists and user pages do not show them. The **Who** column of **Users**, **Sessions** → **Latest** and **Events** shows only a name and an email, from identify events.

### Accounts

Pendo fills accounts, from the `account.id` you pass to `pendo.initialize`. The Sequential SDK fills them from `sequential.account(id, traits)`. No other source fills accounts.

To see accounts:

1. Open **Accounts**, under **Explore** in the sidebar.
2. Set the dates, and click **Apply**.

See [The Accounts list](/docs/users-and-accounts#the-accounts-list).

## Related

- [Identify your users](/docs/identify-users)
- [Users and accounts](/docs/users-and-accounts)
- [Events](/docs/events)
- [Sessions](/docs/sessions)
- [Judgments](/docs/judgments)
- [What each SDK supports](/docs/support-matrix)
- [Glossary](/docs/glossary)
