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.
Medium because missing scroll data degrades content performance analysis but does not break core conversion tracking.
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 })
ID: marketing-analytics.event-conversion-tracking.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:
IntersectionObserver, window.addEventListener('scroll', ...), or a scroll depth librarysend_page_view and enhanced measurement config)package.jsonPass 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 })
}