← All Guides

Engagement Tracking with GTM: YouTube Video Events, Scroll Depth, Read Time and Visible Sections in GA4

How to measure whether people actually consume your content: YouTube embed tracking with GTM's built-in video trigger, scroll depth that means something, a read-time event that combines scroll and time, and section visibility, all sent to GA4 as clean events.

Atiqul Islam
Written by Atiqul Islam

Tracking & analytics specialist. 278+ GTM, GA4 and server-side tracking projects for clients in the US, UK and Australia.

Rather not do this yourself? I set this up for clients every week. Free 15-minute audit, no obligation.

Book a Free Audit

Page views say someone arrived. Engagement events say what they did. For content-driven sites, and for anyone who publishes tutorials and guides, knowing which pages are read and which videos are watched is the difference between guessing at content strategy and measuring it. This guide covers the four signals I set up on content pages, all through GTM, all sent to GA4 as clean events.

Scope Everything to Content Pages

Create a trigger exception or a condition such as Page Path matches RegEx ^/(blog|guides)/ and apply it to every trigger below. Engagement on a checkout page is noise.

Signal 1: YouTube Video Events

GTM's YouTube Video trigger listens to embedded players.

  1. Enable the built-in Video variables: Video Provider, Video Status, Video URL, Video Title, Video Duration, Video Current Time, Video Percent, Video Visible.
  2. Create a YouTube Video trigger. Capture Start, Complete, Pause, Progress at 25, 50, 75 percent. Tick Add JavaScript API support to all YouTube videos so embeds without enablejsapi=1 still report.
  3. Create a GA4 Event tag video_engagement with parameters video_status, video_percent, video_title, video_url. Fire on the trigger.

If you prefer GA4's standard names, send separate tags for video_start, video_progress and video_complete with conditions on Video Status, which matches enhanced measurement's naming and keeps reports consistent if you later turn it on.

For non-YouTube players such as Vimeo or Wistia, use their JavaScript API to push the same events to the dataLayer; the GA4 tag stays identical.

Signal 2: Scroll Depth That Means Something

  1. Create a Scroll Depth trigger, vertical, percentages 25, 50, 75, 100, scoped to content pages.
  2. GA4 Event tag scroll_depth with percent_scrolled from Scroll Depth Threshold.

Keep enhanced measurement's own scroll event on or off, not both, to avoid two scroll events in reports.

Signal 3: Read Time, the Combined Signal

A read is scroll plus time. Build it with a Trigger Group:

  1. Timer trigger: interval 60000 ms, limit 1, on content pages. Name it Timer - 60s content.
  2. Scroll Depth trigger: vertical 50 percent, on content pages. Name it Scroll - 50 content.
  3. Trigger Group containing both. It fires once when both have fired, in any order.
  4. GA4 Event tag content_read with page_path and, if you have it in the dataLayer, content_type and content_length in words. Fire on the trigger group.

Now content_read counts only visitors who both scrolled past the middle and stayed a minute. Report it per page to find which guides are read rather than skimmed.

For long guides, adjust the timer to a share of the expected reading time pushed in the dataLayer, for example reading_time_seconds, read by a Custom JavaScript variable so the timer threshold scales with the content.

Signal 4: Section Visibility

To know whether a specific element was seen, such as the audit call-to-action or the FAQ:

  1. Element Visibility trigger: CSS selector .blog-cta, once per page, 50 percent visible, observe DOM changes.
  2. GA4 Event tag section_view with section_name set to a constant such as audit_cta.

Use these sparingly, for a handful of elements where the answer changes a decision.

Sending Context With Every Event

Push content metadata on content pages before GTM loads, so every engagement event can carry it:

<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
  content_type: 'guide',
  content_category: 'tool-guide',
  content_author: 'Atiqul Islam',
  content_length: 1450,
  reading_time_seconds: 420
});
</script>

Map content_type and content_category in the Google tag's shared event settings so they ride along on every event, and register them as custom dimensions in GA4.

Reporting

In GA4, register percent_scrolled, video_percent, video_title, section_name, content_type and content_category as event-scoped custom dimensions. Then:

Build an audience of users with content_read on three or more pages for remarketing or for a newsletter prompt.

Test

  1. Preview on a guide page. Scroll slowly: expect 25, 50, 75, 100 scroll events once each.
  2. Stay 60 seconds after passing 50 percent: expect one content_read.
  3. Play an embedded video: expect start, progress and complete events with the title.
  4. Scroll the CTA into view: expect one section_view.
  5. Open a non-content page: expect none of the above.

Outcome

You know which guides people actually read, which videos they finish, and whether the offer at the end was seen. Content decisions stop being a matter of opinion.

Frequently Asked Questions

Does GA4 enhanced measurement already track video and scroll?

It tracks YouTube video start, progress and complete if the embed has the JS API enabled, and a single 90 percent scroll event. The setup here gives you control over thresholds, works when enhanced measurement's video option is off, and adds the combined read-time signal that enhanced measurement cannot produce.

Why is 90 percent scroll a poor engagement signal on its own?

A visitor can reach the bottom of a page in two seconds. Scroll says the page was traversed, not that it was read. Combine it with time on page: scrolled past 50 percent and stayed at least 60 seconds is a far better definition of a read.

What is required for the YouTube trigger to work?

The embed URL must include enablejsapi=1, or you tick the option in the trigger to add it, which reloads the player on first use. Players loaded by some lazy-load plugins are not detected until they are in the DOM.

Should engagement events be key events?

Not usually. They are context for content decisions and audience building, not outcomes. A content business might treat a completed video or a long read as a micro key event; a lead business should not.

Will these events cost me anything in GA4?

There is no per-event charge in standard GA4, but each property has a cap on distinct events and parameters, and noisy events make reports harder to read. Fire them only on content pages.

Want This Done Right the First Time?

Book a free 15-minute audit call. I'll review your setup, show you what is broken, and tell you exactly what it takes to fix it.

Chat Now