
First things first.
Both ‘New’ and ‘Returning’ GA4 users need to be manually calculated in BigQuery.
They are not available as default fields in the GA4 BigQuery export schema.
Most users calculate new and returning GA4 users all wrong in BigQuery.
In fact, GA4 UI is also calculating and reporting it all wrong.
Any GA4 event can potentially start a new session if no active session exists, which means both ‘New’ and ‘Returning’ users metrics need to be manually calculated.
Whenever GA4 encounters an event without a previous session, it can consider it as a part of a new session.
That means if GA4 detects an event and no existing session is active (based on ‘ga_session_id’ or user session logic), it can create a new session regardless of the event type.

For example:
1) If the first event of a user’s visit is a custom event (like a click or custom engagement event) or an ecommerce event (like ‘purchase’), and neither ‘session_start’ nor ‘user_engagement’ has fired, GA4 can infer the start of a session from this first event. This behaviour is common with server-side tracking or Measurement Protocol implementations.
2) A session can start with a ‘page_view’ event due to a delayed or missing ‘session_start’ event. In this case, GA4 assumes the session started with the ‘page_view’.
3) A session can start without the ‘session_start’ event or the ‘user_engagement’ event if server-side events are sent via Measurement Protocol.
Since we have now established that any event in GA4 can start a new session, the ‘ga_session_number’ is no longer a reliable indicator of user status.
If any event is fired before ‘session_start’, it may not have the necessary context (like ‘ga_session_number’) when processed.
‘ga_session_number > 1’ doesn’t always mean “Returning User” because a user can have multiple sessions for the same visit.
For example:
User is inactive for 30+ min, new session starts (Session timeout) → Does ‘ga_session_number’ increase? Yes (Session 1 → 2) → Is it a “Returning User”? No, same user, same visit.
Slow website delays ‘session_start’ event (Tag-firing delay) → Does ‘ga_session_number’ increase? Yes (Session 1 → 2) → Is it a “Returning User”? No, same user, same visit.
User gives consent, new session starts (Consent Mode) → Does ‘ga_session_number’ increase? Yes (Session 1 → 2) → Is it a “Returning User”? No, same user, same visit.
As a result, the following definitions of new and returning users are not valid:
If the value of ‘ga_session_number’ event parameter is 1, classify the user as a ‘New User’.
If the value of ‘ga_session_number’ event parameter is greater than 1, classify the user as a ‘Returning User’.