Scroll Depth
Zenovay records how far each visitor scrolls. Three surfaces in the dashboard turn that signal into something you can act on:
- Scroll Depth card on a website's Analytics page, with two lists: Top pages (your busiest pages) and My pages (pages you choose to watch). Each row shows how many page views reached 25 / 50 / 75 / 90% of the page and its end.
- Heatmaps view, Scroll mode rendering a gradient overlay on top of your page screenshot.
- Session detail, Max scroll depth displayed inline with session time and pages viewed.
What's tracked
While a visitor is on a page, the tracker measures how much of the scrollable distance they have covered: scrollTop / (documentHeight - viewportHeight) × 100. At the top of a long page that is 0%. A page that is shorter than the screen counts as 100%, because the visitor sees all of it without scrolling. The page height is re-measured on every scroll event, so dynamic content (infinite scroll, accordions, lazy-loaded images) is handled naturally.
For every page view, the tracker keeps the deepest point the visitor has reached on that page and reports it about every 15 seconds while the tab is in view, when the tab is hidden, and when the visitor leaves the page or a single-page app moves to the next route. A position only counts once the page has been on screen for about 1.5 seconds, so a page that is still loading is never mistaken for a short page read to the end. New scroll data is therefore usually visible in the dashboard within a few minutes. Separately, each session keeps its deepest value across all its pages (see Session detail max scroll below).
When heatmaps are enabled, the tracker also emits fire-once milestone events at five thresholds:
| Milestone | Fires when | Stored as |
|---|---|---|
| 25% | First time scroll_percent >= 25 | event_type='scroll_milestone', event_data.depth=25 |
| 50% | First time scroll_percent >= 50 | event_type='scroll_milestone', event_data.depth=50 |
| 75% | First time scroll_percent >= 75 | … depth=75 |
| 90% | First time scroll_percent >= 90 | … depth=90 |
| 100% | First time scroll_percent >= 100 | … depth=100 |
Once a milestone fires for a page, it does not fire again: scrolling back up and down again is a no-op. On SPA route changes (pushState / replaceState / popstate), the milestone-reached set is reset so the new route starts fresh.
Milestone events and the scroll heatmap are part of the heatmaps feature, available on the Pro plan and above. The Scroll Depth card works from the scroll depth that every pageview reports and does not need heatmaps.
Scroll Depth card
Open Domains, select your site, then open Analytics. The full-width Scroll Depth card sits below the Sources / Pages / Locations / Devices cards. If you don't see it, click Customize above the chart and switch on Scroll depth.
Each row is one page:
- Scrolled to shows five bars for 25%, 50%, 75%, 90% and End. Each bar is the share of page views that scrolled at least that far down the page, and the percentage sits beneath it. Hover a bar for the exact counts, for example "27% of page views (54 of 200) scrolled at least 50% down the page"
- Views is the number of page views the row is based on (see Which page views are counted below)
- Avg depth is how far a view of this page scrolled down on average
Because scroll depth only ever grows, the bars descend from left to right. The shape is the signal: a long staircase means visitors read deep, a short one means they leave near the top. Pages with fewer than 10 page views, or where almost nobody reaches 25%, are dimmed and marked with a warning, so a handful of views doesn't pass for a pattern.
The card shows the top 5 rows of the selected list. Details opens every row in a searchable, sortable table. On a narrow screen or in a half-width card, each row stacks: the page on top, the bars and numbers below.
Which page views are counted
Every page view whose scrolling was measured counts, with the deepest point the visitor reached on that page. A visit that opens your homepage, then pricing, then sign-up adds one view to each of the three pages, each with its own value. A page view that was left within about 1.5 seconds, or from which no measurement arrived, is not counted.
Zenovay has measured scroll depth per page view since the tracker update in October 2026. Before that, it stored one value per visit: the deepest point on any of its pages. For those earlier dates the card therefore counts only visits that viewed this single page, because only for them does the value belong to this page with certainty. A period that spans the update combines both. Pages that people reach by clicking through your site, such as pricing or sign-up pages, have far more page views to evaluate since the update.
Several hostnames
If your tracking code runs on several hostnames (for example both example.com and docs.example.com), each hostname and path combination gets its own row. The hostname appears as a muted prefix before the path, so you can tell example.com/en apart from docs.example.com/en at a glance. Sites on a single hostname show the path only.
Practical-100% tolerance
At the visual bottom of a page, subpixel rendering and mobile address-bar resizing mean the math often tops out just below 100. The tracker therefore snaps to 100 when the bottom of the viewport is within 2 px of the end of the page, and the End bar counts every page view that reached at least 95%.
How to read it
| Pattern (25 / 50 / 75 / 90% / End) | Likely cause | Action |
|---|---|---|
| 80% / 45% / 18% / 6% / 0% | Healthy funnel; long-form content read partially | Optimise the content above the 50% mark, most readers see it |
| 95% / 90% / 80% / 70% / 50% | Very short page or strong reader engagement | Check whether the bottom CTA actually loads in the viewport |
| 30% / 5% / 1% / 0% / 0% | Visitors leaving at the fold | Investigate above-the-fold copy, load time, or layout shift |
A drop from 19% (75%) to 6% (90%) on a sales page is the most common diagnostic signal: something near the bottom is losing readers before they reach the CTA.
My pages: watch your own pages
My pages keeps the pages you care about in one list, whether or not they are among your busiest pages: a landing page for a campaign, your pricing page, a key article.
To add a page, open the My pages tab of the Scroll Depth card and click Add page. You can enter:
| You enter | It watches |
|---|---|
https://example.com/pricing | /pricing on example.com (with or without www.) |
/pricing | /pricing on every hostname of the website |
/blog/* | /blog and every page below it, combined into one row |
Query strings and #anchors are ignored, as are upper and lower case and a trailing slash, so https://example.com/Pricing/?utm_source=x and /pricing mean the same page. A full URL must belong to the website's domain or one of its subdomains.
You can also add a page straight from Top pages: hover a row and click the bookmark icon. A highlighted bookmark means the page is already in My pages; click it again to remove it. In My pages, the × at the end of a row removes the page, and Undo in the confirmation brings it back.
Data shows up right away. Zenovay already records scroll depth on every page, so a page you add immediately shows its page views for the selected period. If it has none yet, the row says No page views to evaluate in this period yet: values appear automatically once visitors open the page, usually within a few minutes. A longer period may already show older page views.
Testing with your own visit? If your IP address is excluded in the website's tracking exclusions, your visit is not recorded, and a private browser window does not change that. Test from another network, for example a phone on mobile data.
My pages is shared by everyone in the workspace. Owners, admins and editors can add and remove pages; viewers and client portal users see the list read-only. Each website can watch up to 25 pages.
Scroll heatmap overlay
In Domains, select your site, then open the Heatmaps tab. The segmented control in the header lets you switch between Click and Scroll modes. Scroll mode renders a gradient overlay on the page screenshot. The colour at each height encodes the percentage of page views that reached that point, counted the same way as in the Scroll Depth card.
Because the top of every page is reached by everyone, the top of the screenshot is always the hottest colour. The gradient fades as the percentage drops. A sharp transition is a "fall-off point" and usually maps to a specific design element (the end of the hero section, a layout shift, a heavy-ad block).
The scroll heatmap requires the page screenshot to be captured. Screenshots are automatically captured on the first heatmap-enabled pageview per page; allow a few minutes after enabling heatmaps for the first screenshot to appear.
Session detail max scroll
When you open a session from the live globe or visitor list, the side panel shows Max scroll depth: X% next to Pages viewed and Session time. This is the deepest scroll the visitor reached across all pages in that session.
A visitor showing 12% max scroll on a long-form page probably left without reading much of it. A visitor showing 100% scroll on a long page is highly engaged regardless of session time: they read the whole thing. Scroll depth does not change the bounce rate: a visit with one page view is a bounce however far it scrolls.
Privacy and consent
Scroll-depth tracking lives entirely inside the tracker's in-memory state per page load. Nothing is written to cookies or localStorage, so the feature is unaffected by cookie consent banners. A visitor whose browser reports Global Privacy Control sends nothing at all through the tracking script, because the script stops before any capture. For a request that reaches the API another way carrying Sec-GPC: 1, the milestone-event ingest path is skipped server-side and only the visitor-level max scroll is retained, the same field Zenovay records for non-GPC traffic.
Related
- Page Quality Metrics: bounce rate, exit rate, median time on page
- Page Flows: Sankey diagram of how visitors move between pages
- Heatmaps (pro features): click density and scroll overlay
On this page