# Flows: the paths users take

> Flows shows, as a Sankey diagram, the order in which users move between events you choose: what they do after a step, before it, and where they stop.

> **In short**
>
> - Flows shows the routes users take between the events that you add as steps, in any order.
> - Each user has one path for the whole date range.
> - An event counts toward every step that it matches.
> - Use three steps or fewer. Flows labels four or more steps wrongly.
> - Flows needs one user id for each person and events with exact values.

## What it is for

A funnel checks one route that you already expect. Flows shows the routes users actually take between a few events that you choose, with loops and detours. Flows sees only the events that you add as steps.

### Example questions

Flows answers "which of these came next", not "what did they do next" across all the events your product records.

- **What happens after pricing?** Of the users who view your pricing page, how many start checkout, how many book a demo and how many do neither?
- **Do users follow onboarding as designed?** Do new users go Create project → Invite teammate → Connect data? Or do they invite first, or go back and forth?
- **What comes before an upgrade?** Did users who upgraded hit a plan limit first, open billing settings first or both?
- **Where do users stop?** After which of these steps does nothing more happen?

> **Use three steps or fewer**
>
> With four or more steps, Flows shows later steps under the name of an earlier step. This affects the diagram, **Drop-off analysis**, **Most common paths** and the **AI prompt** text. Use three steps or fewer until this is fixed.

## How it works

Each step is a filter. Sequential builds one **path** for each user from the events that match your steps, for example Pricing → Checkout → Pricing → Upgraded. Sequential then counts how many users share each path.

### How a path is built

For each user with a matching event in the date range, Sequential does this:

1. It takes the user's matching events, oldest first.
2. It labels each event with every step that the event matches, in step order. An event that matches steps 1 and 2 gives 1, then 2.
3. If the same step comes two times in a row, it keeps only one.

Each step uses the same condition builder as the rest of Sequential.

- **Each user has one path for the whole date range.** Flows does not keep visits apart. Pricing on Monday and checkout on Friday is the path Pricing → Checkout.
- **A path starts at the first of your steps that the user did.** This is not always Step 1.
- **A user is a person.** It is the user id, exactly as stored. With the Sequential SDK, PostHog or Mixpanel, an anonymous id that identify links to a value counts as that value. See [Users and identity](/docs/users-and-identity).
- **Flows does not limit how long the next step can take.**

## Build a flow

1. In the left rail, open **Explore** and click **Flows**.
2. Set the dates in the bar at the top. The first time, the range is the last 10 days, in whole UTC days. After that, the page opens on the range that you last applied or ran here.
3. In **Flow steps**, click **+ Add step**.
4. Replace the default name **Step 1** with your own name.
5. Click **+ Condition**.
6. Choose a **Field**. Usually this is **Event Name**, **Event Type** or **URL**.
7. Type the **Value**. A field condition matches the exact value. For a property, choose a type and an operator first.
8. Add the other steps. To reorder them, use **↑** and **↓**.
9. Click **Run**. The results appear under **User flow**.

To let one step catch any of several events, switch its selector from **All of** to **Any of**.

An event that matches two steps is in both. From 9 October 2026, a flow whose steps can match the same event can show longer paths than before. Before that date, an event went only to the first step that it matched. The agent tool `user_flows` uses the same rule, and its count for each step is the number of people with an event that matches that step.

### Use a saved filter as a step

1. In **Flow steps**, click **+ Step from saved view**, next to **+ Add step**.
2. Pick a saved filter. Greyed-out filters show why you cannot use them.
3. Click **Run**.

To put a saved filter into a step that you already have, click **Replace with saved view** on that step.

The step is a copy. Change it as you like: the saved filter does not change. If the saved filter changes later, the flow does not change. The step shows **From saved view:** and the name of the filter. To copy the current conditions of the filter again, click **Update from view**. See [Use a saved filter as a funnel or flow step](/docs/filters-and-saved-views#use-a-saved-filter-as-a-funnel-or-flow-step).

> **Run again after you change the dates**
>
> After you change the dates, click **Run**. **Run** uses the dates as you typed them. **Apply** in the date bar only clears the old results.

### Step conditions and explanations

- The diagram shows the name that you give a step.
- To pick a **Value** from the stored values, click the value box.
- Example of step order: put "Viewed pricing" (a **URL**) above "Any page view" (**Event Type** `pageview`). If you do not, the pricing step never gets an event.
- By default, the selector at the start of a step reads **All of**, so a step matches only if **all** its conditions match. Two **Event Name** conditions with different values then match nothing.
- Sequential ignores a condition with no value.
- A step with no conditions, or only unfinished ones, matches every event that no step above it matched.
- To check one step in plain words, click its **?** (**Explain step filter**).
- To describe all the steps, click **Explain**.

### Save a flow

1. Click **Save**.
2. Enter a **Flow name**.
3. Click **Save flow**. The flow appears in the **Saved flows:** strip and on **Dashboard**.

The dialog shows what it saves, for example "3 flow steps with their configurations" and the date range. With one step, it says "1 flow step with its configuration".

A saved flow keeps the steps and the exact dates. It does not keep a rolling range.

Saved flows belong to the project. Everyone in the project sees them. Owners, admins and members can rename and delete any saved flow. Viewers can only open them.

### Saved flows

- When you open a saved flow, Sequential loads it but does not run it. Click **Run**.
- Each project has its own saved flows. Everyone in the project sees the same list.
- Hover over a saved flow to see who changed it last, and when.
- To rename a saved flow, click ✎. To delete it, click **×**. Sequential deletes it for everyone in the project.
- You cannot change the steps or dates of a saved flow. Save a new flow, then delete the old one.

See [Filters, date ranges and saved views](/docs/filters-and-saved-views).

## Read the results

Each column of the diagram is a position in the users' paths: the first of your steps that each user did, then the next, and so on. Block height is the number of users.

- Blocks named **Users who left after initial step**, **Users who left after second step** and so on hold users whose path ended there. Flows draws them all in the right-most column, so go by the name.
- "Left" means that the user did none of your steps again before the end of the date range. The user can still have used your product in that time.
- For exact figures, use the tables, not the hover text. **Total Events** counts users, not events.

To see what comes before a step, find it in **Most common paths** and read to its left.

### Flow summary tiles and tables

| Tile or table | What it shows |
|---|---|
| **Total steps** | The steps you defined. |
| **Unique paths** | How many different paths users took. |
| **Total Events** | Users, not events. It counts each user with at least one event that matches a step. |
| **Total drop-offs** | Users whose path ended before the last column. |
| **Drop-off analysis** | Each drop-off block (**Where users left**) with its **Users**. |
| **Most common paths** | The five most common paths in full, with their **Users**. |

### Diagram details and AI prompt

- The links between columns show who went from which step to which.
- One column can hold several of your steps. One step can appear in several columns.
- "Second step" in a drop-off name means the second position in the user's path, not your Step 2.
- The hover text shows "% of all users in this analysis". Its total counts each user once for every column they reach. So the percentage reads low.
- Flows does not list the users behind a path. The nearest is [Funnels](/docs/funnels). In Funnels, the drop panel lists the people who left at a drop. These users reached one of your steps, in your order, but not the next step.
- A Funnels drop-off is a different set from a Flows drop-off block. A Flows drop-off block holds users whose path, in any order, ended at that position.
- After a run, **AI prompt** writes your steps and these results as text. To copy the text for an AI assistant, click **Copy prompt**.

## What it needs

- **One user id for each person.** Pass the same value to identify for the same person every time. See [Identify your users](/docs/identify-users).
- **Events that you can tell apart by an exact value.** Custom events with fixed names, such as `checkout_started`, make the clearest steps. See [Send custom events](/docs/custom-events).
- **Differences in the event name.** A step cannot select on an event's own properties. So put the difference that you need in the event name.

Without identify, each browser or device is a separate user. With the Sequential SDK, PostHog or Mixpanel, Flows joins the events sent before identify to the identified user. So a visitor who signs up during the date range has one path, and counts once at each step. With Amplitude, Pendo or Smartlook, that visitor shows as two paths.

### User ids and anonymous events

- Call identify as soon as you know who the user is. Also call it on page load for users who are already signed in.
- Events sent before your app calls identify carry an anonymous id. With the Sequential SDK, PostHog or Mixpanel, Flows joins them to the identified user, also when the visitor identifies after the date range. So the result for a past period can change. A new link can take up to 5 minutes to apply.
- With Amplitude, Pendo or Smartlook, for a visitor who signs up during the date range, one path ends at signup and the other path starts there.
- Events with no user id are not a user. They are in no path and in no step count.
- Every role in your organisation can run flows. See [Roles and permissions](/docs/roles-and-permissions).

### Values that a step can match

- **Event Type** takes the stored type, such as `pageview`. It does not take the display name, **Page view**. See [Events](/docs/events).
- A **URL** step must match the whole stored address, with the scheme and host. For example: `https://app.example.com/projects/123`.
- `/projects/123` alone matches nothing. Each project's address is a separate value.
- Sequential drops anything after `#`. It stores most query values as `[redacted]`. See [What Sequential keeps from page URLs](/docs/url-policy).
- **Event Property** matches an event's own properties, with a type and an operator. So a step can be `upgraded` with `plan` **is** `pro`, or `checkout_completed` with `amount` **>** `100`.
- If "upgraded to Pro" and "upgraded to Team" must be separate steps, send separate event names.

## Limits

| Limit | What happens |
|---|---|
| No per-visit view | Each user has one path across the whole range. To focus on recent behaviour, shorten the range. |
| No timing | Flows does not measure the time between steps. [Funnels](/docs/funnels) shows the average time between steps. |
| Exact field matches | A field condition, such as **URL**, matches one whole value. Only property conditions have other operators. |
| 30-second time limit | A longer flow stops with **Something went wrong**. Shorten the range or make the steps more specific. |
| Up to 10 columns | The diagram draws no more than 10 columns. |
| Saved flows | You can rename a saved flow, but you cannot change its steps or dates. Save a new flow instead. |
| No user list | Flows does not list the users behind a path. |
- Events with no user id are in no path.
- A step with no finished condition matches every event that the steps above it did not match.
- A **URL** step must match the whole address, such as `https://app.example.com/pricing`. A path alone, such as `/pricing`, matches nothing.

### How the four-step labelling fails

With four or more steps, the diagram, **Drop-off analysis**, **Most common paths** and the **AI prompt** text currently show later steps under an earlier step's name:

| Your steps | Shown as |
|---|---|
| Fourth and fifth | The third |
| Sixth to eleventh | The fourth |
| Twelfth to twenty-second | The fifth |

The pattern continues for more steps. Then, if two steps next to each other in a path now have the same name, Flows merges them.

## Related

- [Funnels](/docs/funnels)
- [Identify your users](/docs/identify-users)
- [Users and identity](/docs/users-and-identity)
- [Send custom events](/docs/custom-events)
- [Filters, date ranges and saved views](/docs/filters-and-saved-views)
- [What Sequential keeps from page URLs](/docs/url-policy)
