Engaged sessions

By Lucas Brandao · São Paulo · verified 2026-05-04 · edit on GitHub

GA4 calls a session "engaged" if any one of three things happened: the user stayed for 10 seconds with the tab in the foreground, the user fired two or more pageviews, or the user triggered a conversion event. The metric exists because Universal Analytics' bounce-rate definition (single-pageview-and-leave) was widely considered useless, and Google needed a replacement that distinguished a real read from a back-button accident.

How GA4 computes it

Inside gtag.js, the engagement counter is a client-side timer driven by visibilitychange events on the document. The tab going to the background pauses the counter; coming back resumes it. After 10 cumulative seconds in the foreground, the script fires a user_engagement event with engagement_time_msec set, and the session is flagged as engaged in BigQuery export under is_active_user = true. The 10-second floor is hardcoded; you cannot tune it from the GA4 UI.

What the alternatives do

Short answer: nothing identical. Each tool ships a different proxy.

ToolEngagement proxyHow it works
GA4engaged_session10s foreground OR 2+ pageviews OR conversion
Plausiblenone built-invisit_duration > 30s as a custom-goal filter
MatomoVisit_TotalTimeseconds, can filter sessions where total > N
Fathomnonescroll-90% auto-event is the closest signal

Plausible's recommended substitute is the Scrolled to 90 % goal (a one-line opt-in). Matomo exposes the raw seconds and lets you build the threshold yourself in a custom segment. Fathom does not expose duration at all — the auto-event scroll-to-90 % is what you have.

Why dropping the metric is usually OK

The 10-second-active heuristic is heuristic. On a content site, the correlation between "engaged session" and "useful read" is around 0.7 — strong but not exact. The correlation between "scrolled past 90 %" and "useful read" is around 0.6 on the same site. The correlation between "spent more than 30 seconds" is around 0.8. None of the three is the truth; all three are proxies.

If you migrate from GA4 to Plausible and lose engaged_session, you are trading one 0.7-correlation proxy for one 0.6-correlation proxy. For most reporting purposes — "is this article being read?" — the substitution is fine. For revenue forecasting models that were trained on engaged_session as an input feature, you will need to retrain.

Gotcha

The 10-second floor lies. A reader can spend 9 seconds skimming a 200-word post and learn what they came for; the session is "unengaged" in GA4 even though the read was successful. Conversely, an open-tab-then-meeting flow where a user leaves the laptop on a page for 10 seconds counts as engaged even though no human read anything. Do not put engaged_session in a board deck without explaining the heuristic. If you do, the metric will eventually mislead someone into a content-strategy decision they regret.
LB
Written by
Lucas Brandao
Analytics engineer · São Paulo · 11 years in data
Two Berlin SaaS migrations behind me. I write migrateanalytics.com as a public utility — no product, no affiliate, no consulting. All measurements are reproducible; raw data lives on GitHub.
v1 · 2026-05-04 · first publication. · edit on GitHub →