Tracking6 min read
Scroll depth and engagement
Two signals are tracked automatically on every page: how far down a visitor scrolled, and how long they were actually paying attention. Both have deliberate rules to keep them honest on short pages.
Scroll-depth thresholds
Mrkr reports scroll depth at four points: 25%, 50%, 75%, and 100%. The percentage is how far the bottom of the viewport has reached through the whole document, not how far a scrollbar handle has moved: a visitor who saw the entire page without scrolling (because it fit on screen) is already at 100%, and a visitor at the very top of a page with a short bit of scrollable content below is not at 0%.
Why short pages report nothing
A page needs at least 240px of content below the initial viewport to be tracked for scroll at all. Below that, there's genuinely nothing meaningful to report: a page that entirely fits the screen would otherwise report "scrolled to 100%" on every single load, which describes what was visible, not what the visitor did.
On pages that do qualify, any threshold already satisfied by what was visible on load is marked as reached silently, without firing an event. Only depth the visitor earns by actually scrolling gets reported, so a page where 60% of the content is visible at rest only ever reports the 75% and 100% thresholds, and only when a visitor genuinely scrolls that far.
Geometry is re-measured on every real pageview, every SPA route change, and (debounced) on window resize, so rotating a phone or resizing a window mid-visit doesn't misfire thresholds against stale measurements.
Engaged time
Engaged time only accumulates while the tab is visible and the visitor has interacted (mouse movement, a key press, a scroll, a click, or a touch) within the last 30 seconds. A tab left open and idle, or backgrounded, stops accumulating engaged time until activity resumes, so a tab left open overnight doesn't inflate a page's average time-on-page. Each page's totals are capped at 30 minutes, the same window that ends an idle session.
Three numbers are reported together, per page, on a page_leave event: wall-clock duration, visible time, and engaged time. They are cumulative totals rather than increments, and the same page can report more than once (when the tab is backgrounded, then again when it is finally closed). The server keeps the maximum it has seen, so a repeated report is harmless and a lost final beacon still leaves the last good reading in place. A report whose numbers haven't moved by a whole second since the previous one is skipped.
A client-side route change closes out the page you're leaving and starts a fresh set of timers, so both engaged time and scroll depth are measured per route in an SPA. Web Vitals are the exception. See Single-page apps.