All posts
5 min readga4, engagement, content

Engagement events: tracking scroll, video, and time without the noise

Scroll and video events tell you whether content works — or they flood GA4 with junk that inflates engagement. Here is how to track them so the numbers mean something.


Engagement tracking is easy to turn on and easy to make useless. GA4's enhanced measurement will happily send a scroll event on every page, a click event on every outbound link, and a video event every ten percent of every video — producing a large volume of data that answers no question anyone asked. Useful engagement tracking is deliberately narrow: a few thresholds that correlate with something you care about, on the pages where it matters.

What enhanced measurement gives you free

Toggled in the GA4 data stream, enhanced measurement collects:

  • scroll — fires once per page at 90% depth.
  • click — outbound link clicks.
  • file_download — clicks on document file types.
  • video_start, video_progress, video_complete — for embedded YouTube with the JS API enabled.
  • form_start and form_submit — form interaction, with real reliability caveats.
  • view_search_results — site search.

This is a reasonable baseline. Two things to know: the 90% scroll threshold is the only one you get without custom implementation, and form tracking here is unreliable enough that most sites should implement it deliberately instead — why.

The noise problem

The failure mode is not missing data. It is drowning.

Scroll events on every page, including short pages where 90% is trivially reached. Click events for every outbound link including your own social icons. Video progress every quarter for an autoplaying background loop. None of it correlates with anything, all of it inflates your event counts, and it makes genuinely interesting engagement impossible to spot.

Worse, if any of it is marked as a key event, it dilutes your conversion reporting and — if imported into Ads — actively degrades bidding.

Track engagement that predicts something

The test for any engagement event: would a change in this number cause you to do something?

Signals that usually pass:

  • Scroll depth on long-form content — did they read the case study, or bounce at the header?
  • Video completion on a product or demo video, not on decorative loops.
  • Time on a pricing or documentation page, which on B2B sites is often the strongest pre-conversion signal available.
  • Calculator or configurator completion.
  • Documentation search, which tells you what people cannot find.

Signals that usually fail: scroll on short pages, clicks on your own navigation, video progress on autoplay backgrounds, generic time-on-site with no page context.

Custom scroll thresholds

If 90% is not the threshold you care about, implement your own. Multiple thresholds on long content let you see where people actually stop:

var seen = {};
[25, 50, 75].forEach(function (pct) {
  window.addEventListener('scroll', function () {
    var depth = (window.scrollY + window.innerHeight) /
                document.body.scrollHeight * 100;
    if (depth >= pct && !seen[pct]) {
      seen[pct] = true;
      window.dataLayer.push({
        event: 'scroll_depth',
        percent_scrolled: pct,
        content_type: 'article'
      });
    }
  }, { passive: true });
});

Two details: the seen guard prevents the same threshold firing repeatedly during scrolling, and the passive listener keeps the handler off the critical path. Fire this only on the templates where depth is meaningful — an article layout, not every page on the site.

Video tracking that means something

Enhanced measurement covers embedded YouTube when the JS API is enabled on the embed. For self-hosted or third-party players, implement against the player's own events.

Either way, be selective:

  • Track the videos that matter — product explainers, demos, testimonials — and not decorative ones.
  • Completion beats progress. One video_complete on a demo tells you more than four progress events on a background loop.
  • Include a video title parameter, or your report is a list of unidentifiable IDs.

The GA4 metrics engagement drives

Engagement events feed two metrics people often misread:

Engaged sessions — a session lasting over ten seconds, with a key event, or with two or more pageviews. Engagement events do not directly create engaged sessions; the duration and key-event criteria do.

Engagement rate — engaged sessions over total sessions. Bounce rate is its inverse and has no independent definition in GA4.

So adding more engagement events does not improve your engagement rate. It gives you the detail to explain it.

Auditing engagement tracking you already have

If enhanced measurement has been on for a while and nobody has looked, spend twenty minutes on this:

  1. Rank your events by volume. If scroll or click sits above your actual conversion events by an order of magnitude, that is the noise. Ask what decision each one has ever informed.
  2. Check which pages generate them. Scroll events concentrated on short utility pages — a contact page, a login screen — are pure volume with no meaning.
  3. Check your key events list for anything engagement-shaped that crept in. Every one of those is diluting conversion reporting, and any imported into Ads is actively misdirecting bidding.
  4. Turn off what fails the test. Enhanced measurement options are individually toggleable; you do not have to accept the whole bundle.

The goal is a short list of engagement events you would actually notice if they moved.

Keep them out of your key events

Engagement events should almost never be marked as key events. They are diagnostic — they explain behaviour, they are not outcomes worth spending money to cause.

The exception is a genuine micro-conversion with demonstrated predictive value, such as a configurator completion that reliably precedes purchase. Even then, assign it a value consistent with its actual predictive power rather than treating it as equal to a sale.

FAQ

Should I use GA4's enhanced measurement or custom events?

Start with enhanced measurement for the baseline, then add custom events where you need thresholds or context it does not provide. Turn off the parts producing noise you will never act on.

Why is my scroll event firing on every page?

Because enhanced measurement's scroll tracking fires at 90% depth on any page, including short ones where that is trivially reached. Implement custom thresholds on the templates where depth is meaningful and disable the blanket version if it is not useful.

Does tracking more engagement events improve my engagement rate?

No. Engagement rate is defined by session duration, key events, and pageview count — not by how many engagement events you send. More events give you explanation, not improvement.

Should engagement events be key events?

Almost never. They are diagnostic signals rather than outcomes. Marking them as key events dilutes conversion reporting and degrades bidding if imported into Ads.

How do I track video on a non-YouTube player?

Implement against the player's own event API — play, progress, ended — and push dataLayer events from those callbacks. Enhanced measurement only covers YouTube embeds with the JS API enabled.

Engagement data is only as good as the tag collecting it — check yours with the free tracking audit on any URL.


See where your tracking stands

Run the same 13-check audit referenced in this post against any URL. No signup, results in seconds.

Run a free audit