Skip to main content
Pro Plan5 minutesBeginner

Scroll Depth: Reading the Bar Chart, Heatmap, and Session Max

Understand the three scroll-depth surfaces in Zenovay — the analytics-tab funnel chart, the heatmap scroll overlay, and the max scroll on the session-detail card.

scroll-depthmilestonesheatmapsengagementpages
Last updated:

Zenovay tracks how far each visitor scrolls on every pageview. The dashboard turns that signal into three actionable surfaces.

The three surfaces

  1. Analytics tab → Scroll depth card — a full-width row beneath the Sources/Pages/Location/System breakdown cards. Each row is one page with a 5-bar "falling staircase" mini-chart (bar heights = 25 / 50 / 75 / 90 / 100% reach). It's an optional card, so you add it from the Customize menu first (see below).
  2. Heatmaps view → Scroll mode — gradient overlay on the page screenshot
  3. Session detail → Max scroll depth — one-liner on the visitor card

What the milestones mean

Each milestone fires the first time a visitor crosses that scroll threshold on a page. After that it's silent — scrolling back up and down again doesn't re-fire. On single-page apps, route changes (pushState / replaceState) reset the state so the new route can fire all 5 milestones fresh.

MilestonePlain-language meaning
25%"Visitor read past the hero / opening section"
50%"Visitor is half-way through the page"
75%"Visitor is approaching the end-of-content / CTA"
90%"Visitor is at the bottom of the readable content"
100%"Visitor reached the footer"

Reading the funnel chart

Open a domain and stay on the Analytics tab. The Scroll depth card is off by default, so click Customize (the sliders icon at the top of the dashboard), turn on the Scroll depth card, and close the drawer. It renders in its own full-width row beneath the breakdown cards. Each row is one page; the mini-chart in the middle has five bars in a single accent colour, baseline-aligned, with heights proportional to the milestone reach. Because scroll depth is monotonic (50% reach is always ≤ 25% reach), the bars naturally form a falling staircase — that shape is the funnel.

Healthy long-form page:

/blog/long-post       80% • 45% • 18% •  6% •  0%

~80% of pageviews got past the hero, 45% read half, only 18% reached the 75% mark.

Short page with strong engagement:

/checkout-thank-you   95% • 90% • 80% • 70% • 50%

Most visitors saw the whole thing — typical for short transactional pages.

Above-the-fold bounce:

/landing-2           30% •  5% •  1% •  0% •  0%

Two-thirds of visitors leave before scrolling a quarter — investigate hero copy, load time, or layout shift.

The most common diagnostic pattern is a sharp drop between two adjacent milestones (a sudden short bar after several tall ones). A drop from 19% (75%) to 6% (90%) on a sales page means something at the bottom — usually right before the CTA — is losing readers.

Exact percentages per milestone are shown directly under each bar — no hover needed. Pages with fewer than 10 visitors in the period (or with effectively zero scroll engagement) are marked "low signal" and dimmed so they don't dominate the view.

Subdomain disambiguation

If your tracking code is used on multiple subdomains — for example zenovay.com and docs.zenovay.com both fire to the same tracker — each subdomain × path combination is shown as its own row. The hostname appears as a muted prefix before the bold path, so zenovay.com/en/ and docs.zenovay.com/en/ are easy to tell apart at a glance.

The widget shows the top 5 pages by default with a "Show all N pages" button to reveal the rest inside a fixed-height scroll area, so the card height stays consistent with neighbouring widgets.

About the 100% milestone

The tracker measures how far down the scrollable area a visitor has travelled: scrollTop / (documentHeight − viewportHeight) × 100, capped at 100. When a page is shorter than the viewport (nothing to scroll) or the visitor reaches the very bottom, the tracker reports 100 directly, with a small tolerance so footer padding doesn't keep it just under. The 100% milestone fires when the visitor crosses that mark. So when you see "1.8% reached 100%" on a page, read it as the share of visitors who scrolled all the way through.

Reading the scroll heatmap

In the Heatmaps view, click the Scroll button in the segmented control at the top. The heatmap canvas re-renders as a vertical gradient over the page screenshot. Red bands are where many people reached; blue bands are where few did.

Because the top of the page is reached by everyone, the top is always the hottest colour. Use the heatmap to spot:

  • Sharp transitions — a sudden cold zone usually maps to a specific design element (end-of-hero, layout shift, heavy ad block, CTA placement)
  • Long warm tails — most visitors are reading deep, congratulations on engaging content
  • Cold middles with warm bottoms — a "jump-to-CTA" pattern, common when there's a sticky anchor link to the conversion step

Info

The scroll heatmap needs a page screenshot. Screenshots are automatically captured on the first heatmap-enabled pageview per page. Allow a few minutes after enabling heatmaps for the first screenshot.

Reading max scroll on session detail

When you click a visitor on the live globe or open them from the visitor list, the side panel shows Max scroll depth: X% next to Pages viewed and Session time.

This is the deepest point that visitor reached across all pages in their session. Useful when triaging a single session:

  • 12% max on a long-form page → probable bounce
  • 100% max on a long page → highly engaged regardless of session time (they read the whole thing)
  • 40-60% on a short page → typical, no action needed

Plan requirements

Scroll-depth tracking is part of the heatmaps feature and requires a Pro plan or above. Free-tier websites don't record scroll events, so the bar chart shows an empty state on those domains.

Privacy

Scroll-depth state lives entirely in memory inside the tracker for the duration of the page load. No cookies, no localStorage. Cookie consent banners don't gate this feature.

Zenovay honours the Sec-GPC: 1 Global Privacy Control header: when a visitor's browser sends it, behavioural enrichment (such as company identification and demographic inference) is switched off and the visitor row is flagged as opted out. The scroll-depth measurement itself is the same cookieless, window-scoped signal Zenovay keeps for all traffic.

What if the bar chart is empty?

A few common reasons:

  1. The website is on the Free plan — upgrade to Pro to enable heatmaps.
  2. Heatmaps were just enabled — wait a few minutes for live traffic to populate.
  3. Selected date range has no traffic — try expanding to the last 30 days.
  4. The tracker is on a page that has very short content — the visitor reaches 100% in one viewport; the bar chart still shows it correctly (often 100/100/100/100/100% for a single-viewport page).

Was this article helpful?