Jak obliczyć zaangażowanych użytkowników w GA4 BigQuery
W GA4 pojęcie engaged users wygląda na proste, ale w praktyce potrafi wprowadzać w błąd – szczególnie gdy zaczynasz pracować bezpośrednio na danych w BigQuery.
W tym artykule pokażę:
- jak GA4 domyślnie definiuje zaangażowanych użytkowników,
- dlaczego ta definicja nie zawsze jest wystarczająca,
- jak zbudować własną, bardziej sensowną logikę,
- i jak obliczyć engaged users w GA4 BigQuery krok po kroku.
Jak GA4 definiuje Engaged Users (domyślnie)
GA4 uznaje użytkownika za engaged, jeśli wygenerował co najmniej jedną zaangażowaną sesję.
Zaangażowana sesja (engaged session) to taka, która spełnia przynajmniej jeden z warunków:
- trwała 10 sekund lub dłużej (domyślny próg, możliwy do zmiany),
- zawierała co najmniej jedno zdarzenie konwersji,
- miała minimum 2 odsłony strony lub ekranu.
Jeśli użytkownik spełni te warunki choć raz – jest liczony jako engaged user.
Problem: ta definicja bywa zbyt uproszczona
W praktyce:
- 10 sekund to bardzo niski próg,
- jedna szybka interakcja może „przypadkiem” zakwalifikować użytkownika jako zaangażowanego,
- a definicja nie zawsze pasuje do realnych celów biznesowych.
Dlatego w BigQuery nie musisz trzymać się definicji GA4.
Możesz stworzyć własne kryteria zaangażowania, dokładnie dopasowane do Twojego modelu biznesowego.
Przykład własnej definicji Engaged User
W tym przykładzie użytkownik jest uznany za zaangażowanego, jeśli spełni co najmniej jeden z warunków:
- spędził minimum 60 sekund na stronie (60 000 ms),
- miał co najmniej 2 pageviewy / screenviewy,
- wywołał zdarzenie konwersji.
To znacznie lepiej oddaje realne zaangażowanie niż domyślne 10 sekund.
Kluczowy parametr: engagement_time_msec
W GA4 czas zaangażowania nie jest liczony „na sesję”, lecz:
- na poziomie zdarzenia (event scope).
Parametr:
engagement_time_msec
reprezentuje czas spędzony w ramach konkretnego zdarzenia, wyrażony w milisekundach.

Ważne:
- ten parametr występuje nawet wtedy, gdy sesja nie została oznaczona jako engaged.
Dlaczego nie używać session_engaged = 1?
To bardzo częsty błąd.
session_engagedma zakres sesji (session scope),engagement_time_msecma zakres zdarzenia (event scope).
Możliwa sytuacja:
- użytkownik wykonał jedną akcję,
- wygenerował np. 5 sekund zaangażowania,
- sesja nie spełnia kryteriów engaged (
session_engaged = 0), - ale czas zaangażowania nadal istnieje.

Jeśli oprzesz się wyłącznie na session_engaged, stracisz część realnych sygnałów zachowania użytkownika.
Logika obliczania Engaged Users w GA4 BigQuery
Cały proces można sprowadzić do kilku kroków:
- zebrać wszystkie zdarzenia użytkownika w wybranym okresie,
- zsumować
engagement_time_msecdla każdego użytkownika, - policzyć liczbę pageviewów,
- sprawdzić, czy użytkownik spełnia kryteria zaangażowania,
- policzyć:
- wszystkich unikalnych użytkowników,
- użytkowników zaangażowanych.
Przykładowe zapytanie SQL – Engaged Users w BigQuery
Pamiętaj, aby podstawić własny identyfikator tabeli.

Dalsza część query:

-- Obliczanie Unique Users oraz Engaged Users w GA4 BigQuery
WITH base AS (
SELECT
user_pseudo_id,
event_name,
(SELECT ep.value.int_value
FROM UNNEST(event_params) ep
WHERE ep.key = 'engagement_time_msec') AS engagement_time_msec
FROM
`<Your table ID>`
WHERE
_TABLE_SUFFIX BETWEEN '20251001' AND '20251031'
),
engagement AS (
SELECT
user_pseudo_id,
SUM(IFNULL(engagement_time_msec, 0)) AS total_engagement_msec,
COUNTIF(event_name = 'page_view') AS pageviews
FROM base
GROUP BY user_pseudo_id
),
engaged AS (
SELECT
user_pseudo_id
FROM engagement
WHERE
total_engagement_msec > 60000
OR pageviews >= 2
)
SELECT
COUNT(DISTINCT CAST(user_pseudo_id AS STRING)) AS Unique_Users,
(SELECT COUNT(DISTINCT CAST(user_pseudo_id AS STRING)) FROM engaged) AS Engaged_Users
FROM engagement;
Co robi to zapytanie?
- base – zbiera zdarzenia i czas zaangażowania,
- engagement – agreguje dane na poziomie użytkownika,
- engaged – filtruje tylko tych, którzy spełniają warunki zaangażowania,
- końcowy SELECT:
- liczy wszystkich użytkowników,
- liczy tylko engaged users.

Podsumowanie
- GA4 domyślnie liczy engaged users na podstawie engaged sessions
- Ta definicja bywa zbyt uproszczona
engagement_time_msecdaje znacznie większą kontrolęsession_engagednie wystarcza do precyzyjnych analiz- Własna logika = lepsze decyzje biznesowe