Skip to content
GDPR compliant. Hosted in DE.
14-day free trial →
Scroll depthAttentionCookieless
Analytics 13 min read 17 Sept 2026

Measure Attention: Scroll Depth Instead of Bounce Rate

Bounce rate only shows whether a second page followed. Scroll depth, visible time per section and events show how far people read - and all three can be collected without touching device storage.

X

XICTRAQ

XICTRAQ

AnalyticsCookie-freeContentConversion
57 %
of page-viewing time fell above the fold (Nielsen Norman Group 2018)
74 %
of viewing time fell within the first two screenfuls, up to 2160 pixels (Nielsen Norman Group 2018)
55 %
of visits spent fewer than 15 seconds actively on a page (Chartbeat 2014)
Attention across the page lengthCumulative share of viewing time, eyetracking 2018 on 1920 x 1080. . .FoldTop 20 % of the page (general websites)over 42 %Above the fold (screenful 1)57 %Up to 2160 px (screenfuls 1 and 2)74 %Above the fold over time2010: 80.3 % on 1024 x 768 - 2018: 57 % on 1920 x 1080Source: Nielsen Norman Group, Scrolling and Attention (2018 and 2010)
Bounce rate sits near the top of almost every report, and it rarely answers the question that actually matters: did anyone read what is on the page? In the classic definition, a bounce is a single-page session on your site (Google), and such sessions are assigned a duration of zero seconds because no second hit follows from which a length could be calculated (Google). So someone who reads a text from top to bottom and then closes the browser shows up in the report as a bounce. How far people actually read, by contrast, can be measured: in the more recent eyetracking work by the Nielsen Norman Group, roughly 57 percent of page-viewing time fell above the fold (Nielsen Norman Group 2018). This article shows how scroll depth, visible dwell time and events together produce a defensible picture of attention - and how to collect all three without touching storage on the end user's device.

What bounce rate measures - and what it does not

The older definition is the simpler one: a bounce is a single-page session on your site (Google). Technically that means exactly one request reached the measurement and no second one followed. From this comes the quirk on which the metric fails: such single-page sessions have a session duration of zero seconds, because after the first hit there is no subsequent hit from which the length could be calculated (Google). The number therefore does not measure disinterest, it measures the absence of a second data point. On a contact page, a directions page or a long technical article, that is the normal case - and not a bad sign.

The newer counting method inverts the metric. It defines the engaged session first and derives the bounce from it: the bounce rate is the percentage of sessions that were not engaged (Google). A session counts as engaged if it lasts longer than ten seconds, contains a key event, or includes at least two page or screen views; if none of that applies, it does not count as an engaged session (Google). That is progress, because time and events now feed in. But it remains a threshold with three conditions that someone chose: ten seconds are not an insight about reading, they are a setting. Anyone placing two reports from different years side by side is therefore often comparing two different quantities under the same name.

  • How far the page was read: whether someone stops after two lines or finishes the text produces the same value under both definitions.
  • Where the drop-off sits: the metric applies to the whole page. Which section costs readers is not in it.
  • Whether the tab was visible at all: a page in the background produces time, but no attention.
  • Whether the page did its job: a phone number that is read off the screen and dialled leaves no second pageview behind.
One metric name, two definitions

The classic method calls every single-page session a bounce (Google). The newer one puts engagement first and describes the bounce rate as the percentage of sessions that were not engaged (Google). Both numbers carry the same name and mean different things. Before any comparison over time, the report should therefore state which of the two definitions produced the series - otherwise a change of definition gets read as a trend.

How far people actually read

Eyetracking supplies what server data cannot: where the eyes actually go. For the 2018 analysis, the x and y coordinates of over 130,000 eye fixations on a 1920 x 1080 screen were evaluated (Nielsen Norman Group 2018); they come from 120 participants in a study covering sites from a wide range of sectors and industries (Nielsen Norman Group 2018). The result: around 57 percent of page-viewing time fell above the fold, and 74 percent within the first two screenfuls, up to 2160 pixels (Nielsen Norman Group 2018). On general websites, more than 42 percent of viewing time fell within the top 20 percent of the page and more than 65 percent within the top 40 percent (Nielsen Norman Group 2018). Attention is therefore not spread evenly across the page length; it declines with depth.

The comparison with the same group's earlier study sharpens the picture. In 2010, 80.3 percent of viewing time fell above the fold and 19.7 percent below it (Nielsen Norman Group 2010); the analysis drew on a total of 57,453 fixations (Nielsen Norman Group 2010) from 21 users across 541 different web pages (Nielsen Norman Group 2010). Between the two measurements lie larger screens and a design shift towards long pages. Attention has therefore moved downwards, but it has not become even: in the more recent study as well, the upper part of the page collects the largest share. Both figures come from older studies and serve as an order of magnitude, not as a target value for any particular page.

MetricAnswersBlind spotCollectable without device storage
Bounce rate (classic)Was there a second page?Reading, duration, drop-off pointyes
Bounce rate (engaged session)Ten seconds, event or second page?Where in the text the drop-off sitsyes
Session durationGap between first and last hitLast page and background tabsyes
Scroll depthHow far the page was movedWhether the area was actually viewedyes
Visible time per sectionHow long a section stood on screenWhether it was read or only seenyes
Active timeTime with a visible tabQuiet reading phases without inputyes
Events (click, copy, playback)Whether something was doneEverything that happens without interactionyes
End-of-text markerWhether the end of the text was on screenWhether the path there was readyes

How attention spreads across the page length was shown by a 2013 analysis of a random sample of 25 million user sessions (Chartbeat 2013). The most viewed area sat just above the fold at about 550 pixels, with just over 80 percent viewership (Chartbeat 2013). On content pages around 50 percent of readers reached the 1500 pixel mark, while on home pages and section fronts 50 percent made it to pixel 1000 (Chartbeat 2013). A broader analysis of two billion visits over the course of a month concluded that most people who click do not read (Chartbeat 2014): 55 percent spent fewer than 15 seconds actively on a page (Chartbeat 2014). Both studies are old and come mainly from the news sector; they say something about the shape of the distribution, nothing about your page.

Scroll depth is a distribution, not an average

An average scroll depth can mean that the readership as a whole gets to about the halfway point - or that one part drops off immediately while the other finishes the text. Each calls for a different fix, and each produces the same average. So plot the shares per marker and read the edge where the curve falls. That is exactly how cookieless analytics from XICTRAQ presents the distribution.

Three signals that add up to attention

Attention is not a single number but the intersection of three observations. First, scroll depth: how far was the page moved? Second, visible time: how long did a given section stand on screen while the tab was visible? Third, interaction: was there a click, a copy, a form field touched, a playback started? Each of these three signals can be fooled on its own. Scroll depth alone counts the person who swipes straight through. Visible time alone counts the tab left open next to a phone call. Interaction alone misses everyone who reads quietly. Together they produce a picture that none of the three delivers by itself.

Scroll depth per marker

Not an average, but the share of sessions that reach a marker. The edge where that share falls points to the section that costs readers.

Visible time per section

How long did a section stand on screen? The threshold from ad measurement works as a lower bound: at least 50 percent of the area for at least one continuous second (Media Rating Council 2014).

Active time instead of dwell time

The clock only runs while the tab is visible. The Page Visibility API reports the switch as soon as the user minimizes the window, switches to another tab, or the document is entirely obscured by another window (MDN).

Events as a cross-check

A click on a phone number, a copied address, a started playback: events prove use in exactly those places where no second pageview arises - which is to say, in the cases counted as a bounce.

Ad measurement solved the visibility problem earlier than content measurement did. The Media Rating Council guideline counts an ad as viewable when at least 50 percent of it was viewed for one continuous second or more (Media Rating Council 2014). That threshold transfers to text sections. It is deliberately low: one second does not prove reading. But it separates swiping past from stopping - and a lower bound is not meant to do more than that. Set it higher and you measure fewer cases, but the remaining ones carry more weight.

Choosing thresholds that mean something

The usual markers at 25, 50, 75 and 100 percent are a convention, not an insight. They refer to the pixel height of the document, and that depends on images, embeds, footer and viewport width. On a phone the same passage of text sits at a different percentage than on a wide screen. Comparing two pages therefore means comparing two different yardsticks. Then there is the footer: if navigation, legal texts and link lists make up a substantial part of the page height, the 100 percent marker says little about the text.

  1. Sections instead of percentages: anchor the markers to named sections - introduction, first argument, pricing block, form. Such markers stay comparable across devices and page lengths.
  2. One marker at the end of the text: an invisible anchor behind the last paragraph answers the question of completion more precisely than any percentage.
  3. Visible time rather than mere arrival: only count a marker once it passes the lower bound from ad measurement - 50 percent of the area for one continuous second (Media Rating Council 2014).
  4. Reading time as a reference: relate the measured visible time to the word count of the section. A section with high reach and consistently short visible time is a springboard, not a text.
  5. Evaluate by device class: the same marker means a different scrolling distance on a phone than on a desktop machine.
Percent of the page is not percent of the text

A page with a long footer reaches the 75 percent marker before the text ends; a page without a footer only afterwards. So measure against the body of the text, not against the document height. In practice that means putting the observer on the element holding the content, not on the window. How to build a per-page evaluation from this is shown in the article on heatmaps without a consent banner.

Measuring without touching the device

Scroll depth, visible time and events need no storage on the end user's device. The legal assessment hangs on exactly that: under Section 25 (1) of the German TDDDG, storing information in the end user's terminal equipment and accessing information already stored there are only permitted if the end user has consented on the basis of clear and comprehensive information (TDDDG). A measurement that neither writes nor reads typically does not trigger this consent requirement. The General Data Protection Regulation is unaffected: processing the transmitted values still needs a legal basis, a defined purpose and an entry in the privacy notice. How this works day to day is set out in detail in the article on tracking without a consent banner.

Technically the route has been stable for years. The Intersection Observer API provides a way to asynchronously observe changes in the intersection of a target element with an ancestor element or with a top-level document's viewport (MDN); it has been available across browsers since March 2019 (MDN). That removes the old scroll handler which burns processing time on every scroll event. The Page Visibility API supplies the second half: as soon as the user minimizes the window, switches to another tab, or the document is entirely obscured by another window, it sends an event to registered listeners (MDN). It too is long established and has been available across browsers since July 2015 (MDN).

attention.js
// Visible time per section, without touching storage on the device
const markers = new Map();           // element -> { since, total, onScreen }
const THRESHOLD = 0.5;               // share of the area on screen
let pageVisible = document.visibilityState === 'visible';

function start(el) {
  const m = markers.get(el);
  if (m && m.since === null && m.onScreen && pageVisible) m.since = performance.now();
}

function stop(el) {
  const m = markers.get(el);
  if (m && m.since !== null) {
    m.total += performance.now() - m.since;
    m.since = null;
  }
}

const observer = new IntersectionObserver((entries) => {
  for (const e of entries) {
    const m = markers.get(e.target);
    if (!m) continue;
    m.onScreen = e.isIntersecting && e.intersectionRatio >= THRESHOLD;
    m.onScreen ? start(e.target) : stop(e.target);
  }
}, { threshold: [0, THRESHOLD, 1] });

for (const el of document.querySelectorAll('[data-section]')) {
  markers.set(el, { since: null, total: 0, onScreen: false });
  observer.observe(el);
}

// The clock only runs while the page is visible and the section is on screen
document.addEventListener('visibilitychange', () => {
  pageVisible = document.visibilityState === 'visible';
  for (const el of markers.keys()) pageVisible ? start(el) : stop(el);
  if (!pageVisible) report();
});
addEventListener('pagehide', report);   // second route, no unload

function report() {
  const values = [];
  for (const [el, m] of markers) {
    stop(el);
    if (m.total >= 1000) {              // lower bound: one second
      values.push({ section: el.dataset.section, ms: Math.round(m.total) });
      m.total = 0;                      // do not send reported time twice
    }
  }
  if (values.length) xictraq.event('attention', { sections: values });
}

Two details decide the data quality. First, the clock only runs while the page is visible - without that coupling, a forgotten tab collects hours of supposed attention overnight. Second, a lower bound applies: sections under one second are discarded. That drops the sections which merely slid past during a swipe, and it keeps the result on the same threshold that ad measurement uses (Media Rating Council 2014). Applying the method across several pages adds a comparison on top: the same marker, different texts, one yardstick.

The report has to arrive

The most careful measurement is worthless if the report does not leave the page. The obvious route is also the worst one: the unload event is extremely unreliable (Chrome for Developers), and it is being switched off in stages. The published rollout plan puts milestone 154 on 22 September 2026 at 100 percent of Chrome page loads (Chrome for Developers). Instead of unload it is recommended to use visibilitychange (Chrome for Developers). In practice that means sending the report as soon as the page becomes hidden, plus on pagehide, and handling delivery via sendBeacon so it survives the switch. If this rebuild is still ahead of you, the steps are in the article on the end of unload in Chrome.

$ rg -n "addEventListener\('unload'" src/ static/
static/analytics-old.js:118: addEventListener('unload', report);
$ rg -c 'visibilitychange|pagehide' src/attention.js
2
$ rg -o 'data-section="[a-z-]+"' build/ | sort -u | wc -l
7
$ node --check src/attention.js

A bounce rate tells you whether a second pageview arrived. A scroll depth with visible time tells you at which line the readers turned away. Only the second answer can be translated into a change.

— XICTRAQ

Turning attention into decisions

The analysis pays off only once a change follows from it. Three patterns show up regularly. If the share of readers drops noticeably before the first subheading, experience suggests the introduction is too long or the headline's promise is not being kept. If the share stays high right up to the call to action and collapses there, the call sits in the wrong place or asks for too much at once. If many reach the end of the text while the visible time per section stays consistently low, the page is being skimmed rather than read - and then shorter paragraphs and more subheadings help more than additional arguments.

ObservationLikely causeNext stepCross-check
Drop-off before the first subheadingThe introduction does not carry the headline's promiseShorten the opening, put the benefit in the first two sentencesShare at the first marker, before and after
High share up to the call to action, then drop-offCall too early, too large or without contextMove the call to the edge, name the effort requiredEvent rate at the call per session
End of text reached, short visible time per sectionSkimming instead of readingShorten paragraphs, add subheadings, pull in listsVisible time per section
Deep sections with high visible timeThe load-bearing part sits too far downMove the section upwardsShare at the upper marker
High scroll depth without eventsThere is nothing to doOffer an action within the viewportEvents per marker reached
Wide spread between phone and desktopThe layout shifts the markersEvaluate separately, bind markers to sectionsDistribution per device class

Each of these changes is a hypothesis, not a solution. It becomes an insight only when the next measurement supports it - ideally as a comparison of two versions of the same page. The procedure for that is in the article on A/B testing without a consent banner. The order matters: set the marker first, then change, then measure. Move the marker afterwards because the result is not to your liking, and what you end up measuring is your own expectation.

Keeping attention in view over time

A one-off analysis shows a state, not a development. The metric becomes interesting once it runs over weeks: a section that used to hold readers and now loses them is a signal - about a changed opening, a new image, slower loading or a different origin of traffic. Attention measurement therefore belongs next to the other series, not in a separate report. Where readers come from is shown by the analysis of page transitions; whether they are the same people can be approximated without cookies.

Two side conditions decide how much the series can carry. First, data quality: automated requests produce scroll patterns that are not attention - how to filter them out is covered in the article on bot traffic in analytics. Second, the ability to respond: anyone storing events per session has to be able to disclose them in response to an Article 15 GDPR request; what to watch for is set out in the article on the right of access. And anyone expecting load peaks in the fourth quarter is better off checking the measurement chain beforehand, so that collection does not fail in the most important week of all - the article on preparing for the peak season pulls the points together.

Sources and studies

The figures in this article come from the eyetracking studies by the Nielsen Norman Group from 2018 and from 2010, from a 2013 analysis of 25 million user sessions and the related analysis of two billion visits. The visibility threshold is in the Media Rating Council guidelines, the bounce rate definitions in the Google's help pages, the unload rollout plan at Chrome for Developers and the wording of Section 25 in the TDDDG.

Is a high bounce rate a bad sign?
As a rule, not without further information. Under the classic definition a bounce is simply a single-page session on your site (Google), and such sessions are assigned a duration of zero seconds (Google). On a contact page or in a long technical text that is typically the normal case. The number only becomes meaningful alongside scroll depth and visible time per section.
What scroll depth counts as a good value?
Experience suggests there is no universally valid target value, because page length, image share and footer shift the percentages. The eyetracking studies serve as an order of magnitude: in 2018, roughly 57 percent of viewing time fell above the fold and 74 percent within the first two screenfuls, up to 2160 pixels (Nielsen Norman Group 2018). More useful than an absolute target is the comparison of the same page over time.
Does measuring scroll depth require consent?
Under Section 25 (1) of the German TDDDG, consent is tied to storing information in terminal equipment or accessing information already stored there (TDDDG). A measurement that neither writes nor reads typically does not trigger that obligation. It does not exempt anyone from the General Data Protection Regulation: a legal basis, a defined purpose and an entry in the privacy notice remain necessary. This note does not replace a legal review of the individual case.
How do I tell reading apart from swiping past?
Through a lower bound on visibility. Ad measurement sets it at a minimum of 50 percent of the area for at least one continuous second (Media Rating Council 2014); the same threshold transfers to text sections. The ratio of visible time to the word count of the section helps as well: if the visible time sits well below the time the text takes to read, it was skimmed.
When should the browser send the measured values?
Not on the unload event. It is considered extremely unreliable (Chrome for Developers) and is being switched off in stages; the rollout plan puts milestone 154 on 22 September 2026 at 100 percent of Chrome page loads (Chrome for Developers). Instead of unload it is recommended to use visibilitychange (Chrome for Developers), supplemented by pagehide and delivery via sendBeacon.
Does scroll depth replace bounce rate?
It does not replace it, it puts it in context. Bounce rate still answers whether a second page was opened - in the newer counting method as the percentage of sessions that were not engaged (Google). Scroll depth answers how far the page was read, visible time answers how long. Only together do the three produce a picture from which a change to the page can be derived.

Related in XICTRAQ

Start in 60 seconds

Let XICTRAQ watch your website.

Permanent free plan available. No credit card, no installation, no hidden fees.