Problem
I’ve set up a Web Analytics drain to Axiom and I’m trying to replicate the bounce rate metrics I see in the Vercel dashboard, but I’m running into issues.
Data Available in Drain
The drain sends pageview events with these relevant fields:
sessionId: Always0for real traffic (only populated with test data)deviceId: Persists across visits, so it’s a device identifier, not a session identifierreferrer: The traffic source (e.g. https://www.google.com)path: The page viewedtimestamp
Current Issues
Since sessionId is always 0, I can’t group pageviews into sessions. And deviceId spans across multiple visits over days, so grouping by deviceId treats a returning visitor’s entire history as one session — which massively undercounts bounces.
For example, the Vercel UI shows 57% bounce rate for a page, but my drain-based calculation shows 93.5% (using deviceId + first page via arg_min).
I know from the docs that Vercel defines bounce rate as (Single-Page Sessions / Total Sessions) × 100 and that visitors are identified by a daily-rotating hash. But this visitor/session logic isn’t exposed in the drain data.
What I’ve Tried
- Grouping by
deviceId: Overcounts session depth since it spans days/visits - Grouping by
deviceId+ time gaps (30min inactivity): Haven’t implemented yet but seems fragile
Questions
- Is
sessionIdbeing0a bug, or is session grouping intentionally not included in the drain? - Is there a recommended way to reconstruct sessions from drain data to match the dashboard metrics?
- Any plans to expose the visitor hash or session boundaries in the drain payload?