Page Flows
Page Flows reveal the most-trodden paths through your site as a Sankey diagram. They sit alongside Funnels (which are pre-defined step sequences) and Goals (which are end-states): Page Flows show emergent behaviour — what visitors actually do, not what you asked them to do.
You'll find Page Flows under Journeys → Flows in the dashboard.
Page Flows is a Pro feature. Free-tier teams see an upgrade card; PageCards and TopPathsTable on the same tab remain available at every plan.
How to read the diagram
The Sankey is shaped left-to-right:
- Entry pages sit on the left (green). These are the first pages visitors land on.
- Intermediate pages in the middle (indigo) are pages reached after one or more navigations.
- Exit pages on the right (amber) are the last pages visitors viewed before leaving.
Line thickness is proportional to the number of sessions that took that transition. Hover any node or link for exact counts.
[Entry: /home] ───────► [/pricing] ─────────► [Exit: /signup]
───────► [/blog/...] ─────────► [Exit: /]
[Entry: /landing-a] ────► [/pricing] ─────────► [Exit: /signup]
Depth control
The Depth stepper above the chart sets the maximum number of layers in the visualisation. Allowed values: 3 to 7.
- Lower depth (3) gives you a wide, easy-to-read overview — the highest-volume entry → mid → exit triplets.
- Higher depth (7) shows deeper drilldowns — sequences of up to 7 page hops.
Changes are debounced 300 ms, so rapid clicks don't fire a network request per click. The current depth is reflected in the URL (?depth=N) so a deep-link restores your choice.
At depth 6 and 7, the diagram trims to the top 30 transitions per layer to keep the rendering legible. A footer note appears under the chart when truncation is in effect. Apply a filter to focus on a specific entry page or channel if you need to see beneath the cap.
Filters
Page Flows reuses the Flows filter that PageCards and TopPathsTable already use. Open the filter button on either of those cards, add a condition, and the Sankey re-fetches automatically — the three views stay in lockstep.
Supported filter categories that push down to the SQL aggregation:
| Category | Examples |
|---|---|
entry_page | /home, /landing-a |
channel (traffic source) | organic, paid, direct, social, email, referral |
device | desktop, mobile, tablet |
Filter values are applied at the SQL layer in our pre-aggregated table, so even on a 1-million-visitors-per-week site, filtered queries return in well under a second.
How the data is computed
Behind the scenes, Page Flows uses a daily pre-aggregated table called page_flows_daily:
- Closed days (yesterday and earlier). A daily cron at 00:00 UTC iterates each session, dedupes consecutive page reloads, derives
(from_page → to_page)transition pairs, and stores per-day aggregate counts. Reads come straight from the pre-aggregated table. - Today. Computed live from the visitor stream via the same SQL aggregation — the route never holds raw per-pageview data in memory.
The two paths are merged on the natural composite key (from_page, to_page, entry_page, channel, device_type). You see one consistent Sankey across any date range.
Single-page sessions don't appear in flows because they have no transition. If you see fewer total sessions on the Sankey than on the dashboard's KPI bar, that's why.
Privacy
Page Flows respects every other Zenovay privacy commitment:
- On
data-cookieless="true"setups, no cookies orlocalStorageare used to derive sessions. - The Sankey only ever shows counts, never individual visitor data.
- High-cardinality URLs (e.g.
/post/<id>with thousands of variants) may collapse to Other in the diagram so the visualisation stays legible. The underlying counts still drive the totals.
Limitations
- The Sankey caps each layer-pair at 30 transitions. For high-cardinality sites, apply filters to surface the long tail.
- The
hostnamefilter category is currently a no-op for Page Flows —page_flows_dailystores normalised paths, not full URLs. To restrict by hostname today, fall back to PageCards which queries the full URL. - New websites see no historical data until either (a) the daily cron has run for a day, or (b) the team's account ages past the first overnight aggregation. Today's data is always live.
See also
- Real-time Tracking — the live event pipeline
- Saved Segments — turn one-off filters into reusable segments
- Visitor Value Scoring — overlay value on the journey