[▲ Vercel Community](/) · [Categories](/categories) · [Latest](/latest) · [Top](/top) · [Live](/live) [Help](/c/help/9) # How to calculate bounce rate from Vercel Web Analytics drain data 15 views · 1 like · 1 post Nextjsisstillquitegood (@jeremyalexander) · 2026-03-13 · ♥ 1 ## 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`: Always `0` for real traffic (only populated with test data) - `deviceId`: Persists across visits, so it’s a device identifier, not a session identifier - `referrer`: The traffic source (e.g. [https://www.google.com](https://www.google.com)) - `path`: The page viewed - `timestamp` ## 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 1. Is `sessionId` being `0` a bug, or is session grouping intentionally not included in the drain? 2. Is there a recommended way to reconstruct sessions from drain data to match the dashboard metrics? 3. Any plans to expose the visitor hash or session boundaries in the drain payload?