Engaged sessions
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.
| Tool | Engagement proxy | How it works |
|---|---|---|
| GA4 | engaged_session | 10s foreground OR 2+ pageviews OR conversion |
| Plausible | none built-in | visit_duration > 30s as a custom-goal filter |
| Matomo | Visit_TotalTime | seconds, can filter sessions where total > N |
| Fathom | none | scroll-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
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.