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.
- Enable the built-in Video variables: Video Provider, Video Status, Video URL, Video Title, Video Duration, Video Current Time, Video Percent, Video Visible.
- 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=1still report. - Create a GA4 Event tag
video_engagementwith parametersvideo_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
- Create a Scroll Depth trigger, vertical, percentages 25, 50, 75, 100, scoped to content pages.
- GA4 Event tag
scroll_depthwithpercent_scrolledfrom 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:
- Timer trigger: interval 60000 ms, limit 1, on content pages. Name it
Timer - 60s content. - Scroll Depth trigger: vertical 50 percent, on content pages. Name it
Scroll - 50 content. - Trigger Group containing both. It fires once when both have fired, in any order.
- GA4 Event tag
content_readwithpage_pathand, if you have it in the dataLayer,content_typeandcontent_lengthin 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:
- Element Visibility trigger: CSS selector
.blog-cta, once per page, 50 percent visible, observe DOM changes. - GA4 Event tag
section_viewwithsection_nameset to a constant such asaudit_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:
- An Exploration with page path,
content_readcount and page views gives you a read rate per guide. - A table of
video_titlebyvideo_percentshows where viewers drop off. section_viewfor the CTA versusgenerate_leadby page shows whether people who see the offer take it.
Build an audience of users with content_read on three or more pages for remarketing or for a newsletter prompt.
Test
- Preview on a guide page. Scroll slowly: expect 25, 50, 75, 100 scroll events once each.
- Stay 60 seconds after passing 50 percent: expect one
content_read. - Play an embedded video: expect start, progress and complete events with the title.
- Scroll the CTA into view: expect one
section_view. - 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.
