Google Analytics (GA4): Data Model, Sessions, Key Events, and Reporting Mechanics
The Google Analytics domain tests whether you can explain a GA4 number rather than just read it. Items are scenario-shaped: a property reports an unexpected engagement rate, a custom dimension is empty, a conversion total disagrees with Google Ads. You must trace the result back to the event model, session logic, or configuration.
The event-driven data model
- Every hit is an event carrying parameters. Sessions, users, and conversions are derived from events, not from hit types.
- Enhanced measurement events (page_view, scroll, outbound click, site search, video, file download, form interactions) fire automatically when enabled; only page_view cannot be switched off.
- Event names are 40 characters or fewer, use letters, digits, and underscores, and start with a letter. Limits: 25 parameters per event, 100-character parameter values.
- Custom dimensions are registered from event- or user-scoped parameters after collection and are never backfilled.
Sessions, engagement, and key events
- A session starts with the first event and ends after 30 minutes of inactivity (configurable 5 minutes to 7 h 45 min) or at midnight in the property time zone.
- An engaged session lasted longer than 10 seconds, OR contained 2+ page_view events, OR contained 1+ key event. Bounce rate = non-engaged sessions ÷ sessions.
- "Conversions" were renamed key events in 2024. Counting is once per event or once per session, and only key events feed Google Ads bidding and the Conversions report.
Attribution
- Session-scoped acquisition dimensions use last non-direct click. The Attribution Paths report applies data-driven attribution with a 30/60/90-day lookback (30 days by default).
Worked example
A store reports 20,000 sessions and 12,000 engaged sessions, so bounce rate is 40%. The team marks scroll as a key event; 3,000 of the previously non-engaged sessions had fired scroll. Engaged sessions become 12,000 + 3,000 = 15,000, so engagement rate is 75% and bounce rate 25%. The metric moved, but user behavior did not - the definition changed, and Smart Bidding now optimizes toward a weak signal. Correct action: keep scroll as an ordinary event and flag purchase or lead_submit instead.
Traps that cost marks
- Per-session versus per-event counting silently changes key event totals.
- High-cardinality dimensions collapse into an (other) row; missing parameters show as (not set).
- Google Signals and demographics can trigger thresholding that hides rows.
- Data filters and custom dimensions are forward-only; they never rewrite history.
- User-scoped data retention (2 or 14 months) does not affect aggregated standard reports.