You publish a Webflow page, traffic shows up in GA4… and you still don't know if people actually read it. GA4's default scroll tracking only fires once (around 90%), so it can't tell you whether users reached 25%, 50%, or your key sections.
This tutorial walks you through a clean, GA4-first setup using Google Tag Manager (GTM) on Webflow—without double-counting pageviews or creating messy scroll events you can't trust.
Scroll depth tracking solves a simple problem: you want to know how far users scroll on your Webflow pages, not just whether they landed. It's valuable because it helps you measure content engagement and make UX decisions based on actual behavior.
You'll learn how to install GTM on Webflow (app-first, manual fallback), set up GA4 correctly inside GTM, configure a Scroll Depth trigger for 25/50/75/90/100%, and verify everything in GTM Preview and GA4 DebugView.
Let's start by choosing the right approach for your goals.

Before you touch Webflow or GTM settings, decide what "scroll tracking" should mean for your site. This prevents the most common mess: duplicate scroll events and inconsistent thresholds.
GA4 can automatically collect a scroll event when a user reaches about 90% of the page. It's the fastest setup because you don't need a custom GTM trigger.
Use this if:
GTM's Scroll Depth trigger supports multiple thresholds and can fire once per threshold per page. This is what you want if your goal is true scroll depth tracking (25/50/75/90/100% or custom sets), or if you need stronger control over where and when tracking runs.
Use this if:
If you're reading this tutorial, you probably want the GTM approach. GA4's built-in scroll is fine as a baseline, but it's not scroll depth analytics.
Before you configure scroll depth tracking, you need GTM installed on Webflow and GA4 set up inside GTM. This guide follows a clean, single-source approach: Webflow → GTM → GA4.
If you haven't done this yet, complete these steps first:
Warning: If GA4 is installed in Webflow and also in GTM, you'll get duplicate page_view events and unreliable scroll depth data. This guide assumes GA4 is installed via GTM only.
Before moving to Step 1, verify you have:
If you're missing any of these, complete the prerequisites first.
Before continuing, verify where GA4 is installed on your site:
This guide assumes GA4 will be installed and managed through GTM only—not through Webflow's native integration.
Pick thresholds that match your pages. A common set is 25, 50, 75, 90, 100.
Also decide your event naming strategy now. A clean default is:
You'll implement this in the following steps.
This guide recommends installing GA4 through GTM (not directly in Webflow) for several practical reasons:
For teams serious about accurate analytics, GTM-to-GA4 is the cleaner, more scalable approach.
If you already have a GA4 Google Tag in GTM that fires on all pages, skip to Step 1. If you're setting this up fresh, follow these steps to create the foundation tag that connects GTM to GA4.
Tip: The Google Tag is the base tag for GA4. All other GA4 events (like scroll depth) will reference this tag.
Before moving forward, confirm your setup is clean and not duplicated:
Tip: Seeing the tag fire once is critical. If you skip verification here, you'll waste hours debugging scroll events that seem to fire twice or not at all.
Before creating triggers and tags, you need to enable the built-in scroll variables in GTM. These variables capture scroll data that you'll send to GA4.

These variables let you pass scroll details into GA4 as event parameters.
Now you'll create a trigger that fires when users reach specific scroll thresholds on your Webflow pages.

Tip: Enabling on Window Loaded improves accuracy because the trigger calculates page dimensions after the page fully loads. On Webflow pages with late-loading CMS images, fonts, or embeds, earlier timing can produce inaccurate thresholds.
If you want to track scroll depth only on certain page types (like blog posts), you can narrow the trigger:
You can apply the same logic for landing pages, product pages, or to exclude utility pages like /privacy and /terms.
Now you'll create a GA4 event tag that fires whenever the scroll trigger hits a threshold and sends the data to GA4.

Tip: GTM's GA4 Event UI varies—use Measurement ID if shown; otherwise link the event to your base Google tag. Either approach connects the scroll_depth event to your GA4 property. Don't set a threshold of 0—GTM can report it as "(not set)" in GA4, making analysis painful.
This is where most scroll tracking setups go wrong. The fix is simple: decide whether GA4's built-in scroll should exist alongside your custom GTM scroll depth events.
Since GA4 is installed via GTM in this guide (not separately in Webflow), you'll manage Enhanced Measurement settings directly in GA4. Do not add GA4 separately in Webflow—this would create duplicate tracking.
GA4's built-in scroll event:
If you keep it enabled and also run GTM thresholds, you'll have:
That's not "wrong," but it's easy to confuse stakeholders.
Recommended options:
To disable in GA4:

Two common strategies:
Strategy A: one event + one parameter (recommended)
This scales well and keeps GA4 tidy.
Strategy B: separate event names per threshold
This is easier to read at a glance, but it creates more event names and gets messy fast.
Tip: GA4's built-in "Percent scrolled" dimension is tied to GA4's own scroll event. If you want reports on your GTM percent values, register scroll_percent as a custom dimension in GA4. Keep the naming consistent and you'll thank yourself later.
The fastest way to waste time is to publish blindly and hope GA4 "eventually shows it." Test in GTM first, then validate in GA4.
Verification check:


Tip: Seeing events in DebugView is the best "is this wired correctly?" signal. Standard GA4 reports can take time to populate, especially for brand-new custom events.
If you use Webflow staging domains, decide whether to exclude them before you start collecting serious data.
GA4 Enhanced Measurement collects a built-in scroll event when a user reaches roughly 90% of a page, and it only fires once per page. GTM scroll depth tracking lets you fire multiple thresholds (like 25/50/75/90/100%) and pass the exact threshold value as a parameter. A practical tip: if you want multiple checkpoints, don't rely on GA4 alone—set up custom thresholds in GTM and send them as a single event with a percent parameter. For most Webflow teams, scroll depth tracking is more actionable when it's multi-threshold and controlled in GTM.
Use GA4 Enhanced Measurement if you only need one engagement checkpoint and want the simplest setup. Use GTM if you need custom thresholds, page-type targeting, or clean event design. The best practice tip: if you implement GTM thresholds, either disable GA4's built-in scroll or use a different event name so you don't confuse reports. For most marketing and UX use cases, the GTM Scroll Depth trigger is the better choice on Webflow because it gives you real control and cleaner data.
Before you can configure scroll depth tracking, you need GTM properly installed on your Webflow site. We have a complete step-by-step guide that covers both the Google site tools app method (recommended) and manual installation using custom code. The guide walks you through the entire process, from creating your GTM container to verifying the installation. Follow our tutorial on how to install Google Tag Manager in Webflow to get GTM running on your site first, then return to this guide to configure scroll depth tracking.
Before configuring scroll depth tracking, you need a base GA4 Google tag in GTM that fires on all pages. In GTM, create a new tag, select Google Tag, enter your GA4 Measurement ID (G-XXXXXXX), and set the trigger to Initialization – All Pages. Do not paste your GA4 Measurement ID in Webflow's Site settings → Integrations—this creates duplicate tracking. After saving the tag, use GTM Preview mode to verify the page_view event fires exactly once in Tag Assistant. Our guide on how to install Google Analytics 4 in Webflow covers the GTM method in detail—follow that approach to ensure clean, single-source GA4 tracking.
Create a Scroll Depth trigger with percentage thresholds (25,50,75,100), then fire a GA4 Event tag that sends one event name and one percent parameter. The best tip is to use a single event like scroll_depth and a parameter like scroll_percent so you don't create five separate event names. Then verify in GTM Preview and GA4 DebugView before publishing. If you want reliable analysis later, register the percent parameter as a custom dimension. This approach is the cleanest way to do GA4 scroll depth thresholds from Webflow via GTM.
In GA4, go to Admin, open Data streams, click your Web stream, open Enhanced measurement, and toggle Scrolls off. You'll need Editor-level access to change this setting. The practical tip: disable it only after you've confirmed your GTM scroll_depth event is firing correctly, so you don't create a temporary tracking gap (use the testing section to verify). If your GTM event uses a different name, you can also leave GA4's scroll enabled, but keep reporting clear. To prevent confusion, disable GA4 scroll when GTM thresholds are your primary source of truth.
Yes, you can connect GTM Preview to any accessible URL, including a Webflow staging domain, as long as GTM is actually installed on that environment. The actionable tip: don't assume your staging domain has the same scripts as production—verify by checking Tag Assistant shows your container and you can see Page View events. If you plan to keep staging traffic out of GA4, add hostname conditions so your GA4 tags only fire on production (see the troubleshooting section). For fast iteration, GTM Preview mode on staging is useful, but always re-test on the real production domain before you consider it done.
First, connect GTM Preview so events are sent with debug context. Then open GA4 Admin and go to DebugView. Scroll your Webflow page past your thresholds and look for your custom event (like scroll_depth) in the timeline. The best tip: click the event inside DebugView and confirm your percent parameter (like 25/50/75) is present—this proves the tag is configured correctly. If you don't see parameters in standard reports later, register them as custom dimensions. For troubleshooting and confidence, GA4 DebugView is the fastest way to validate scroll depth on Webflow.
Most "missing events" issues come from one of three causes: GTM wasn't actually published, the Webflow site wasn't published after code changes, or a tag/trigger condition prevents firing on the current page. Start by verifying the tag fires in Tag Assistant without Preview (production check), then verify it appears in GA4 Realtime. The actionable tip: DebugView confirms wiring, but GA4 reports can lag—don't judge success solely by standard reports immediately. Also confirm you're not filtered out by GA4 data filters or browser blockers. If you want fast answers, Webflow GA4 scroll events should be verified in GTM first, then GA4 Realtime, then reports.
Once GTM is installed cleanly on Webflow and GA4 is firing once, scroll depth tracking becomes a reliable engagement signal instead of a vague guess. With a Scroll Depth trigger and a single GA4 event design, you can track meaningful thresholds (25/50/75/90/100%) and avoid duplicate events that ruin reporting.
If you want to go further, consider tracking "section reached" with Element Visibility triggers, building scroll-based audiences, or implementing consent-aware tagging (without overcomplicating your baseline setup). If you'd rather have a team set this up end-to-end and QA it properly, our Webflow team at BRIX Templates can help—see our Webflow agency services.

Learn two Framer-native ways to embed unique HTML on every CMS page using the Embed Component and Page Custom Code with variables.

Learn three options to embed unique HTML on every Webflow CMS page using Dynamic Embeds, Page Custom Code, and Rich Text blocks.

Learn two ways to lazy load YouTube and Vimeo in Framer: a quick Code Override tweak plus a click-to-load pattern to boost performance.