Scroll depth tracking is implemented
Why it matters
Scroll depth tells you whether visitors actually read the page or bounced after the hero. Without it, a visitor who scrolls past every pricing tier, reads every testimonial, and leaves looks identical to one who bounced after two seconds. You cannot distinguish content that holds attention from content that fails, cannot identify the fold where engagement drops, and cannot quantify the impact of page length experiments. Long-form marketing pages become uninstrumented.
Severity rationale
Medium because missing scroll data degrades content performance analysis but does not break core conversion tracking.
Remediation
If you use GA4, enable Enhanced Measurement in Admin > Data Streams > your stream > Enhanced Measurement > Scroll. For PostHog, Mixpanel, Plausible, or custom setups, add explicit tracking in lib/scroll-tracking.ts:
const milestones = [25, 50, 75, 90]
const fired = new Set<number>()
window.addEventListener('scroll', () => {
const pct = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100
milestones.forEach(m => { if (pct >= m && !fired.has(m)) { fired.add(m); analytics.track('scroll_depth', { percent: m }) } })
}, { passive: true })
Detection
-
ID:
scroll-depth-tracking -
Severity:
medium -
What to look for: Scroll depth tracking fires events (or GA4 scroll milestone triggers) when users reach certain percentages down a page (typically 25%, 50%, 75%, 90%). Look for:
- Explicit scroll depth code using
IntersectionObserver,window.addEventListener('scroll', ...), or a scroll depth library - GA4 enhanced measurement with scroll tracking enabled (check for
send_page_viewand enhanced measurement config) - GTM scroll depth trigger configuration (cannot detect from code alone — note this in detail)
- Third-party scroll depth packages in
package.json
- Explicit scroll depth code using
-
Pass criteria: Scroll depth events are tracked via explicit code with at least 2 milestone thresholds, OR GA4 Enhanced Measurement (which includes automatic scroll tracking to 90%) is likely enabled (indicated by GA4 being used without disabling enhanced measurement). Count the number of scroll milestones configured.
-
Fail criteria: No scroll tracking code found and the analytics tool used does not automatically provide scroll depth (PostHog, Mixpanel, Plausible, Fathom — these do not automatically track scroll depth unless configured).
-
Skip (N/A) when: No analytics is present. Skip for single-screen apps (dashboards, apps where pages are not long-form content) — signal: no long-form page components detected.
-
Detail on fail:
"PostHog detected with no scroll depth tracking code. PostHog does not track scroll depth automatically — users reading only part of long-form pages will be indistinguishable from users who read everything." -
Remediation: For GA4 users, enable Enhanced Measurement in your GA4 property (Admin > Data Streams > select stream > Enhanced Measurement > enable Scroll). This tracks when users reach 90% scroll depth automatically.
For other analytics tools, add explicit scroll depth tracking:
// lib/scroll-tracking.ts export function initScrollDepthTracking() { const milestones = [25, 50, 75, 90] const fired = new Set<number>() window.addEventListener('scroll', () => { const scrolled = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100 milestones.forEach(m => { if (scrolled >= m && !fired.has(m)) { fired.add(m) analytics.track('scroll_depth', { percent: m }) } }) }, { passive: true }) }
Taxons
History
- 2026-04-18·v1.0.0·Initial import from marketing-analytics·automated