You published a 2,000-word blog post. Google Analytics says it got 5,000 pageviews. But how many of those 5,000 people actually read it? Did they scroll past the first paragraph? Did they make it to the CTA at the bottom?
Pageviews tell you who showed up. Scroll tracking tells you who actually engaged.
GA4 has built-in scroll tracking, but it only fires at the 90% scroll threshold. That means you know who reached the bottom, but you have no idea what happened between the top and the bottom. GTM scroll tracking gives you granular data — 25%, 50%, 75%, 90% — so you can see exactly where readers lose interest.
GA4 Built-In Scroll vs. GTM Scroll Tracking
GA4 automatically collects a scroll event via Enhanced Measurement. But it has a significant limitation:
| Feature | GA4 Enhanced Measurement | GTM Custom Scroll |
|---|---|---|
| Thresholds | 90% only | Any (10%, 25%, 50%, 75%, 90%, 100%) |
| Customization | None | Full control |
| Page-specific rules | No | Yes (fire on specific pages) |
| Horizontal scroll | No | Available |
| Event parameters | Minimal | Custom (scroll depth, page path, etc.) |
If all you need is “did they scroll to the bottom,” GA4’s built-in tracking is fine. If you want to understand content engagement at a granular level, use GTM.
Important: If you set up GTM scroll tracking, disable GA4’s built-in scroll event to avoid duplicate data. Go to GA4 → Admin → Data Streams → your stream → Enhanced Measurement → turn off “Scrolls.”
Setting Up Scroll Tracking in GTM
Step 1: Enable Built-In Scroll Variables
GTM has built-in variables for scroll depth, but they’re disabled by default.
- Open GTM → Variables → Configure (Built-In Variables)
- Under the Scrolling section, enable:
- Scroll Depth Threshold — The percentage value (25, 50, 75, etc.)
- Scroll Depth Units — Whether the threshold is percentage or pixels
- Scroll Direction — Vertical or horizontal
Step 2: Create a Scroll Depth Trigger
- GTM → Triggers → New
- Trigger type: Scroll Depth
- Configure:
- Vertical Scroll Depths: Check “Percentages”
- Values: Enter
25, 50, 75, 90(comma-separated) - This trigger fires on: All Pages (or specific pages — more on this below)
Name it: Trigger - Scroll Depth (25, 50, 75, 90)
Step 3: Create the GA4 Event Tag
-
GTM → Tags → New
-
Tag type: Google Analytics: GA4 Event
-
Configuration:
- Measurement ID: Your GA4 ID (use a constant variable for this)
- Event Name:
scroll_depth - Event Parameters:
- Parameter name:
scroll_threshold— Value:{{Scroll Depth Threshold}} - Parameter name:
scroll_direction— Value:{{Scroll Direction}} - Parameter name:
page_path— Value:{{Page Path}}
- Parameter name:
-
Trigger: Select your scroll depth trigger from Step 2
Name it: GA4 - Scroll Depth
Step 4: Test in Preview Mode
- Click Preview in GTM
- Navigate to a page on your site
- Scroll down slowly
- In the GTM debug panel, watch for “Scroll Depth” events
- Click each one and verify:
- The trigger fired at the correct thresholds
- The tag fired with the correct parameters
- Scroll Depth Threshold shows 25, 50, 75, 90 as you scroll
If the tag isn’t firing, check our GTM debugging guide for troubleshooting steps.
Step 5: Verify in GA4 DebugView
While testing in GTM Preview Mode, open GA4 DebugView simultaneously:
- GA4 → Admin → DebugView
- Look for
scroll_depthevents appearing as you scroll - Click each event to verify the
scroll_thresholdparameter has the correct value
Once confirmed, publish your GTM container.
For a complete guide to GA4 DebugView, see our DebugView walkthrough.
Configuring Scroll Tracking for Specific Pages
Tracking scroll depth on every page generates a lot of data, much of it not useful. Your checkout page scroll depth doesn’t tell you much. Your blog post scroll depth tells you a lot.
Option 1: Page Path Filter on the Trigger
Edit your scroll depth trigger:
- Change “This trigger fires on” from “All Pages” to “Some Pages”
- Add a condition:
Page Path→contains→/blog/
Now scroll tracking only fires on blog pages. You can add multiple conditions:
Page Path contains /blog/ORPage Path contains /guides/ORPage Path contains /resources/
Option 2: Multiple Triggers for Different Page Types
Create separate triggers with different thresholds for different content:
Blog posts (long-form content):
- Thresholds: 25, 50, 75, 90
- Condition: Page Path contains
/blog/
Product pages (short content):
- Thresholds: 50, 90
- Condition: Page Path contains
/products/
Landing pages (conversion-focused):
- Thresholds: 25, 50, 75, 90, 100
- Condition: Page Path matches specific landing page URLs
Each trigger fires the same GA4 event tag. The page_path parameter in the event distinguishes the data in reports.
Pixel-Based vs. Percentage-Based Tracking
GTM supports both:
Percentage-based (recommended for most cases):
- 25%, 50%, 75%, 90%
- Consistent across different page lengths
- Easy to compare across pages
Pixel-based:
- 500px, 1000px, 2000px, etc.
- Useful when you want to know if users reached a specific element
- Better for pages with dynamic content that changes height
When to use pixel-based: You have a CTA at approximately 1,500 pixels down the page and you want to know how many users scrolled past it. Set a pixel threshold at 1500.
Analyzing Scroll Data in GA4
Custom Exploration
- GA4 → Explore → Blank
- Technique: Free form
- Dimensions:
Page path,Event name - Metrics:
Event count,Total users - Filter: Event name =
scroll_depth - Add
scroll_thresholdas a secondary dimension
This gives you a table showing how many users reached each scroll depth on each page.
Building a Scroll Engagement Report
Create a calculated metric to measure content engagement:
Scroll Completion Rate = Users who reached 90% / Total pageview users
In Explore:
- Segment 1: Users where scroll_threshold = 90
- Segment 2: All users with page_view event
- Compare the two across pages
Pages with high traffic but low scroll completion need better content, better formatting, or a different structure.
Identifying Content Drop-Off Patterns
Look for patterns in your scroll data:
| Pattern | What It Means | What to Do |
|---|---|---|
| 80% reach 25%, 20% reach 50% | Users bail after the intro | Improve the hook or restructure the content |
| 60% reach 50%, 15% reach 75% | Middle of content loses them | Break up long sections, add visuals |
| 70% reach 75%, 70% reach 90% | Once they’re engaged, they finish | Focus on getting them past the early drop-off |
| Low scroll across all pages | Site-wide engagement issue | Check page load speed, design, content quality |
Page-Level Comparison
Compare scroll completion rates across similar content:
- Which blog posts get read all the way through?
- Do listicle-format posts have better scroll depth than narrative posts?
- Do posts with images every 300 words outperform text-heavy posts?
This data directly informs your content strategy.
Advanced: Tracking Scroll to Specific Elements
Sometimes you don’t care about percentages — you want to know if users saw a specific element (a pricing table, a CTA, a testimonial section).
Using Element Visibility Trigger
GTM’s Element Visibility trigger fires when a specific DOM element enters the viewport:
- Triggers → New → Element Visibility
- Selection Method: CSS Selector (e.g.,
#pricing-tableor.testimonial-section) - When to fire: Once per page
- Minimum on-screen duration: 1 second (optional, prevents accidental scroll-throughs)
This is more precise than percentage-based tracking because it accounts for dynamic page heights and responsive layouts.
Example: You want to know if users see your pricing table:
Trigger: Element Visibility
Selector: #pricing
Minimum visible: 50% (at least half the element visible)
Duration: 1000ms (visible for at least 1 second)
Tag fires a GA4 event: element_viewed with parameter element_id = pricing.
Common Scroll Tracking Mistakes
Mistake 1: Not Disabling GA4 Enhanced Measurement Scroll
If you leave GA4’s built-in scroll event enabled while also firing custom scroll events from GTM, you get duplicate data. Disable Enhanced Measurement scrolls before setting up GTM scroll tracking.
Mistake 2: Tracking Every Page
Scroll depth on your contact page, 404 page, and login page is noise. Filter to pages where scroll depth is actually meaningful — content pages, product pages, landing pages.
Mistake 3: Ignoring Page Load Speed
If a page takes 5 seconds to load and users bounce before content renders, you’ll see very low scroll rates. The problem isn’t content — it’s performance. Check page speed first.
Mistake 4: Not Accounting for Page Length
A page that’s 500 pixels tall will have 90% scroll depth for almost every visitor because the entire page fits in the viewport. Only analyze scroll depth on pages long enough that scrolling is required.
Mistake 5: Over-Granular Thresholds
Tracking every 5% increment (5, 10, 15, 20…) generates excessive events and doesn’t give you proportionally more insight. Stick to 25, 50, 75, 90 for most use cases.
Scroll Tracking and Content ROI
Combining scroll data with traffic source data answers a critical question: which channels send readers who actually engage?
Build a GA4 exploration with:
- Rows: Session source/medium
- Columns: scroll_threshold values
- Metric: Event count
You might discover that organic search traffic scrolls 70% of your content while social media traffic scrolls 20%. That changes how you allocate content promotion budgets.
Similarly, combining scroll depth with conversion data reveals whether deeper engagement correlates with higher conversion rates on specific pages.
Verify Your GTM Setup
Scroll tracking is one of many GTM configurations that can silently break after container updates, site redesigns, or CMS changes. A misconfigured trigger or a missing variable means you’re collecting incomplete data without knowing it.
Run a free scan on your site to check your GTM container for configuration issues, broken tags, and missing events — including scroll tracking.