Users vs Sessions in GA4: Why the Numbers Differ

GA4 shows several user counts and a session count side by side, and they rarely line up. This guide explains what total users, active users, new users and returning users each count, when a session starts and ends, why GA4 sessions differ from Universal Analytics sessions, and how the reporting identity setting changes your user numbers.

This guide is built from Google's Analytics Help pages: understand user metrics, about Analytics sessions, reporting identity and the GA4 vs Universal Analytics comparison, plus the other pages linked below. If you are still setting GA4 up, start with our GA4 basics guide. How engaged sessions are defined is in our engagement rate guide.

The short answer

A user is a person (or, more exactly, an identifier GA4 treats as one person). A session is one visit: in Google's words, "a period of time during which a user interacts with your website or app." One user can have many sessions in a date range, so sessions are normally higher than users. The longer the date range and the more often people come back, the bigger the gap.

The confusion comes from two places. GA4 has more than one user metric, and the one labelled "Users" in most reports is not a plain count of everyone. And GA4 estimates both sessions and users rather than counting them one by one, so small differences between tools are expected.

The four user metrics

Google's user metrics article lists four core metrics, all populated automatically:

MetricGoogle's definition
Total usersThe number of unique users who triggered any event in the date range
Active usersThe number of unique users who engaged with your site or app in the date range
New usersThe number of new unique users who logged the first_open or first_visit event in the date range
Returning usersThe number of unique users who initiated at least one previous session, whether or not that session was engaged

For a website, Google counts someone as an active user when they have an engaged session, or when Analytics collects the first_visit event or the engagement_time_msec parameter. For apps the triggers are first_open and engagement_time_msec on Android, and first_open or user_engagement on iOS.

Three consequences follow from these definitions:

  • Active users can be lower than total users. Google's example is a returning visitor who opens the site again but stays "for less than 10 seconds without being active on the page." That person meets none of the criteria, so they "will only be counted in the total user count, but not in the active users count."
  • New users can exceed active users. Google says so directly: "not all new users are active, so new users may exceed active users."
  • Neither should exceed total users, although Google notes that "factors such as thresholding may contribute to discrepancies in these numbers."

The "Users" column you see in most standard reports is active users. Google's comparison article puts it plainly: Universal Analytics highlighted Total Users, "whereas Google Analytics focuses on Active Users, also shown as Users." To see total users, use an exploration, which is also where Google suggests you look when comparing with old UA figures. One more detail from Google: reports show active users only, but "both active and inactive users will show in exports to Google Ads."

When a session starts and ends

A session starts when a user opens your app in the foreground, or views a page or screen "and no session is currently active", for example because the previous one timed out. At that moment GA4 collects a session_start event and creates two values: a session ID (ga_session_id), which is the timestamp in seconds when the session started, and a session number (ga_session_number), which counts how many sessions that user has started so far.

A session ends "after 30 minutes of user inactivity" by default, and "there is no limit to how long a session can last." On a website you can change the timeout per web data stream: Admin, Data Streams, pick the web stream, Configure tag settings, Show all, then Adjust session timeout. For apps the default is changed with the setSessionTimeoutDuration method. An app session starts to time out when the app moves to the background, unless you send events with an extend_session parameter set to 1, which Google suggests for apps such as navigation or music players.

The timeout has a direct effect on the session count. A shorter timeout splits long, slow visits into more sessions. A longer one merges them. If you change it, note the date, for example with an annotation, so the jump in sessions is not read as a change in traffic.

The session_start event also carries the attribution for the whole session: the gclid, UTM parameters and referrer. How those values are sorted into channels is covered in our channel groups guide.

How GA4 counts sessions

GA4 does not add up session_start events. It "calculates the number of sessions that occur on your site or app by estimating the number of unique session IDs." Since October 2021 it uses an algorithm called HyperLogLog++, which Google describes as estimating distinct counts "for most frequently used metrics such as Active users and Sessions."

The practical effect shows up when you compare GA4 reports with raw data. BigQuery calculates the precise number, so BigQuery exports can show slightly different session counts. Google's example: 1,463 sessions in the reports and 1,501 in BigQuery last week, then 1,828 and 1,876 this week. The counts differ, but both show the same 25% rise. Google's advice is to use BigQuery when you need precise results from raw data, and the reports when you want efficient results and trends over time.

Session IDs are attached to events automatically by gtag.js and the Firebase SDK, but "not included automatically in events from Measurement Protocol or Data Import." If you send server-side events through the Measurement Protocol, add the session ID yourself if you want those events tied to a session.

Why GA4 and Universal Analytics disagree

If you still have old UA figures to compare against, expect them to differ. Google's comparison article says "user and session related discrepancies of up 20% can be expected and are not a cause for concern." The main reasons it gives:

  • Different user metric. UA reports showed total users. GA4 reports show active users. The label is the same, the calculation is not.
  • No restart at midnight. UA started a new session when a visit crossed midnight in the view's time zone. GA4 sessions "aren't restarted at midnight". Sites with visitors across many time zones see more of this difference.
  • No restart on new campaign parameters. UA started a new session when a visitor picked up new campaign parameters mid-visit. GA4 does not. Google adds that if you put UTM tags on links within your own site, "you may notice a much higher count of sessions in UA than in Google Analytics." Our UTM guide explains why those tags belong on external links only.
  • Filters. UA view filters could exclude data. GA4 properties do not support those filters.
  • Estimation. GA4 estimates sessions from unique session IDs. UA did not estimate them.
  • Identity method. Google's differences in user counts page adds that the GA4 property might use User-ID while the UA property used Client ID, and that GA4 reports include all data streams by default.

Reporting identity and user counts

GA4 decides who counts as the same user through its reporting identity. Google lists three identity spaces: User-ID (your own IDs for signed-in users), device ID (the client ID on websites, the app-instance ID on apps) and modeling, which fills in for users who decline analytics cookies using the behaviour of similar users who accept them.

The property can use Blended (User-ID, then device ID, then modeling), Observed (User-ID, then device ID) or Device based (device ID only). This matters for user counts because the same person on a phone and a laptop is two users by device ID, but can be one user when User-ID links them. Google says the identity spaces "allow you to de-duplicate users", and that the option you choose "does not affect data collection or processing", so you can switch and compare. Sessions are still separate visits: Google's example of someone browsing on a tablet, a work computer and a phone describes "a separate session" for each.

The trade-off: Blended and Observed need enough signed-in activity, so reports become subject to data thresholds, where GA4 withholds rows that could identify people. How to send User-ID and set the identity option is in our GA4 User-ID guide.

Which number to use

The metrics answer different questions:

  • Active users for "how many people actually used the site?" It is the default in reports and leaves out returning visitors who left without engaging.
  • Total users for "how many people triggered anything at all?" It is closest to UA's old Users figure.
  • New users and returning users for reach versus loyalty: how much of the traffic is first-time visitors.
  • Sessions for visits, and for anything that is a rate per visit, such as engagement rate (engaged sessions divided by sessions). Session-level acquisition is what the Traffic acquisition report shows.

Whatever you pick, compare like with like: the same metric, the same date range length and the same reporting identity.

How we read users and sessions

This is our own practice, not Google guidance:

  • We report sessions for traffic trends and active users for audience size, and we label which one a chart shows. "Users" on its own leads to arguments.
  • We look at sessions per active user over time. A rising figure usually means more repeat visits, which is often a good sign for a service business.
  • We leave the 30-minute session timeout alone unless a site has a clear reason, and annotate any change the same day.
  • When GA4 and another tool disagree by a few percent, we check the trend first. If both move the same way, the gap is usually the counting method, not lost data.

Frequently asked questions

Why are sessions higher than users in GA4?

One user can start several sessions in a date range, for example by coming back the next day or after 30 minutes of inactivity. Each visit is a session, but the person is counted once as a user.

Why is total users higher than active users?

Active users only counts people who engaged. A returning visitor who stays less than 10 seconds without any engagement counts in total users but not in active users.

Which user metric does the Users column show?

Active users. Google says GA4 focuses on active users, also shown as Users. Use an exploration to see total users.

Does a GA4 session restart at midnight?

No. GA4 sessions are not restarted at midnight or when new campaign parameters are encountered. A session ends after the inactivity timeout, 30 minutes by default.

Why do GA4 and BigQuery show different session counts?

GA4 reports estimate sessions with the HyperLogLog++ algorithm, while BigQuery calculates the precise number from raw data. The counts differ slightly, but trends over time match.

For more on measurement, see our guides to GA4 basics, engagement rate, User-ID and monthly website reporting.