Jak poprawnie liczyć Nowych i Powracających użytkowników w GA4 BigQuery
Liczenie nowych i powracających użytkowników w GA4 BigQuery to jeden z najczęściej źle realizowanych tematów w analityce. Wiele osób bezrefleksyjnie opiera się na ga_session_number, co prowadzi do błędnych wniosków i niespójnych danych.
W tym artykule pokazuję:
- dlaczego dotychczasowe podejście jest błędne,
- jak działa poprawna logika identyfikacji nowych i powracających użytkowników,
- jakie są kompromisy wydajnościowe,
- oraz jak wdrożyć to podejście w BigQuery.
Dlaczego ga_session_number to zły pomysł
Przez długi czas nowi i powracający użytkownicy byli identyfikowani na podstawie wartości parametru ga_session_number:
ga_session_number = 1→ nowy użytkownikga_session_number > 1→ powracający użytkownik
Problem polega na tym, że:
- sesje mogą być resetowane (cookies, consent, przeglądarki),
- użytkownik może być „nowy” wielokrotnie,
- dane nie są stabilne w czasie.
Efekt?
Zawyżona liczba nowych użytkowników i zaniżona liczba powracających.
Nowe podejście: identyfikacja użytkownika, nie sesji
Znacznie lepszą metodą jest opieranie się na tożsamości użytkownika, a nie numerze sesji.
W GA4 mamy do dyspozycji:
user_pseudo_id(domyślny identyfikator),user_id(jeśli jest wdrożony).
Logika jest prosta:
- jeśli dany identyfikator pojawia się po raz pierwszy → New User
- jeśli pojawia się ponownie → Returning User
To podejście jest koncepcyjnie poprawne, ale ma jedną dużą wadę.
Problem skalowalności danych historycznych
Aby ustalić, czy użytkownik pojawia się po raz pierwszy:
- musisz sprawdzić całą historię danych.
Dla dużych serwisów oznacza to:
- skanowanie setek milionów wierszy,
- wysokie koszty zapytań,
- długi czas wykonania.
ozwiązanie kompromisowe: rolling window (30–60 dni)
Aby ograniczyć koszty:
- możesz użyć okna kroczącego (np. 30 lub 60 dni).
Założenie:
- większość powracających użytkowników wraca w ciągu 30–60 dni.
Wady:
- użytkownik wracający po 90 dniach zostanie błędnie uznany za „nowego”.
To podejście jest:
- szybsze,
- tańsze,
- mniej dokładne.
Najlepsza logika: user_first_touch_timestamp
Najbardziej precyzyjna metoda opiera się na polu:
user_first_touch_timestamp
To pole:
- przechowuje moment pierwszej interakcji użytkownika z serwisem,
- jest stałe dla całego cyklu życia użytkownika.
Logika klasyfikacji
- New User
jeśli data pierwszego zdarzenia użytkownika danego dnia
= datauser_first_touch_timestamp - Returning User
jeśli data pierwszego zdarzenia użytkownika danego dnia datauser_first_touch_timestamp
Dzięki temu:
- klasyfikujesz użytkowników dziennie,
- zachowujesz pełną spójność logiczną,
- unikasz błędów sesyjnych.
Logika zapytania – krok po kroku
- Dla każdego użytkownika i dnia:
- wybierasz pierwsze zdarzenie dnia
- Porównujesz:
event_datefirst_interaction_date(zuser_first_touch_timestamp)
- Klasyfikujesz użytkownika:
- nowy lub powracający
- Zliczasz unikalnych użytkowników w obu kategoriach
Przykładowe zapytanie SQL (BigQuery)
Pamiętaj, aby podstawić własny identyfikator tabeli.

Dalsza część query:

-- Obliczanie New Users i Returning Users na podstawie user_first_touch_timestamp
WITH prep AS (
SELECT
user_pseudo_id,
DATE(TIMESTAMP_MICROS(user_first_touch_timestamp)) AS first_interaction_date,
DATE(TIMESTAMP_MICROS(event_timestamp)) AS event_date,
ROW_NUMBER() OVER (
PARTITION BY user_pseudo_id, DATE(TIMESTAMP_MICROS(event_timestamp))
ORDER BY event_timestamp
) AS rn
FROM
`<Your table ID>`
WHERE
_TABLE_SUFFIX BETWEEN '20251001' AND '20251031'
),
first_events AS (
SELECT
user_pseudo_id,
first_interaction_date,
event_date
FROM
prep
WHERE
rn = 1
)
SELECT
COUNT(DISTINCT CASE
WHEN event_date = first_interaction_date THEN user_pseudo_id
END) AS new_users,
COUNT(DISTINCT CASE
WHEN event_date > first_interaction_date THEN user_pseudo_id
END) AS returning_users
FROM
first_events;
Dlaczego ta metoda jest najlepsza
- nie zależy od sesji,
- nie jest podatna na reset cookies,
- działa spójnie w czasie,
- jest zgodna z logiką GA4,
- daje pełną kontrolę w BigQuery.

Podsumowanie
ga_session_numberto przeszłość- Tożsamość użytkownika jest kluczem
user_first_touch_timestampdaje najczystszy sygnał- Logika > gotowy SQL
- BigQuery pozwala liczyć użytkowników tak, jak naprawdę powinni być liczeni