What Engaged Sessions Actually Measure
In GA4, a session is classified as engaged if it meets any one of three conditions:
- The user was active on the page for at least 10 seconds
- The session included a conversion event
- The session included 2 or more page views or screen views
Engagement rate is the percentage of sessions that qualify as engaged. Bounce rate — when you add it back as a custom metric — is the inverse (100% minus engagement rate).
For content publishers, the 10-second threshold is the primary qualifier for most single-article sessions. A user who lands on an article, reads for 30 seconds, and leaves will be counted as engaged. A user who arrives, sees a paywall or a load error, and leaves in 2 seconds won't. This is more accurate than the old bounce rate, which counted any single-page session as a bounce regardless of how long the user stayed.
Better Engagement Signals for Content
Average engagement time per session
GA4's average engagement time measures time the page was in the foreground — the browser tab was visible and the user was active. This is more meaningful than the old "time on page" metric, which measured time between page loads (and therefore couldn't measure the last page in a session at all).
For content sites, average engagement time per page is the closest proxy to "time reading" that GA4 provides without additional implementation. Find it in Reports → Engagement → Pages and Screens, where it appears as "Average engagement time per active user".
Scroll depth + time together
Enhanced measurement's scroll event fires at 90% depth. Combined with engagement time, this produces a much stronger reading signal than either metric alone: a user who scrolled to 90% AND spent more than 2 minutes on the article almost certainly read it.
You can cross-reference these in a Free Form Exploration: filter to page_view events on article pages, then look at the percentage of sessions with a scroll event where average engagement time is above your chosen threshold. Pages with high traffic but low scroll+time rates are ones where users are arriving and not reading — often a sign of misleading titles, poor formatting, or content that doesn't deliver on the headline.
Per-article completion events
For publishers where reading completion is the success metric (newsletters, editorial, research publications), implement a custom event that fires when a user reaches the end of an article body. This is more precise than the 90% page scroll — an article with a long comments section or sidebar content will reach 90% scroll well before the reader finishes the article body.
Implementation: add a small IntersectionObserver on the last paragraph or a dedicated "end-of-article" marker element. When it enters the viewport and the user has been on the page for at least 60 seconds, fire article_completed with article_title and estimated_read_time as parameters.
Content-Specific Events Worth Tracking
newsletter_signup— fires on confirmed email subscription from an article's inline or exit-intent CTA. The most valuable conversion event for ad-supported and subscription publishers — it converts a one-time visitor into a returnable audience member.article_completed— as described above, a custom completion signal for long-form content.content_share— fires when a user clicks a social share button. A share is the strongest audience endorsement signal, and most publishers don't track it explicitly.paywall_hit— for subscription publishers, fires when a user encounters a paywall. Useful for understanding the reach of your free content and the conversion rate from paywall encounter to subscription.subscription_started— the revenue conversion event for subscription publishers. Should includeplan_typeandvalueso GA4 can report on subscription revenue by acquisition channel.
Content Dimensions to Register
Beyond events, content publishers benefit from custom dimensions that make GA4's reports segmentable by content properties:
article_author— compare engagement metrics by author to understand audience preferences and writer performancecontent_categoryorarticle_topic— segment traffic and engagement by editorial section or topic clustercontent_type— article, video, podcast, interactive, gallery — to understand which formats perform bestpublication_date— distinguish traffic to new vs evergreen content; useful for understanding content decay over timepaywall_status— free, metered, locked — to segment acquisition metrics by content access level
Register these as event-scoped custom dimensions in Admin → Custom Definitions. Send them with each page_view event via GTM or your CMS template. Once registered, they become available as dimensions in all GA4 reports and Explore analyses.
When to Go Beyond GA4 to BigQuery
GA4 covers most content reporting needs directly. BigQuery becomes valuable when:
- You manage multiple sites or properties and need cross-property readership reporting
- You want to calculate true article completion rates from raw scroll + time data at the session level (not aggregated)
- You want to build cohort analyses — do readers who subscribe in month 1 return more often than those who subscribe in month 6?
- You're combining GA4 readership data with ad revenue data, subscriber data, or editorial metadata from your CMS
Our GA4 BigQuery query patterns for content publishers covers the SQL for these use cases in detail, including article performance queries, referral source analysis, return visitor rates, and content velocity tracking.
GA4 Health Check audits your property configuration to ensure the event tracking and custom dimension setup that powers content analytics is correctly implemented. Run a 60-second audit to check your content tracking setup.
