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żytkownik
  • ga_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
    = data user_first_touch_timestamp
  • Returning User
    jeśli data pierwszego zdarzenia użytkownika danego dnia data user_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

  1. Dla każdego użytkownika i dnia:
    • wybierasz pierwsze zdarzenie dnia
  2. Porównujesz:
    • event_date
    • first_interaction_date (z user_first_touch_timestamp)
  3. Klasyfikujesz użytkownika:
    • nowy lub powracający
  4. 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_number to przeszłość
  • Tożsamość użytkownika jest kluczem
  • user_first_touch_timestamp daje najczystszy sygnał
  • Logika > gotowy SQL
  • BigQuery pozwala liczyć użytkowników tak, jak naprawdę powinni być liczeni

Podobne wpisy