Jak wykryć strony z zerowym ruchem w GA4 BigQuery
Jednym z częstszych problemów w analizie treści jest fakt, że GA4 nie pokazuje stron, które w danym okresie miały zerowy ruch. Jeśli dana podstrona nie wygenerowała ani jednego odsłonięcia w wybranym zakresie dat, po prostu nie pojawi się w raportach GA4.
To oznacza, że:
- nie widzisz „martwych” stron,
- nie wiesz, które treści realnie nie pracują,
- trudniej podjąć decyzję o optymalizacji, usunięciu lub przebudowie contentu.
Eksport danych do BigQuery pozwala ten problem obejść.
Co oznacza „zero traffic” w GA4?
Ważne doprecyzowanie:
„Zero traffic” w GA4 zawsze zależy od zakresu dat, który analizujesz.
GA4:
- nie pokazuje stron, które miały 0 odsłon w całym okresie,
- pokazuje strony, które miały odsłony w niektóre dni, a w inne dni już nie.
Przykład:
- jeśli strona miała 20 odsłon w ciągu miesiąca, to znaczy, że:
- miała 0 odsłon w co najmniej jednym dniu,
- ale GA4 nadal ją pokaże w raporcie.
Dlatego w praktyce:
- strony z bardzo niską liczbą odsłon są dobrym proxy dla stron „martwych”.
Dlaczego warto identyfikować strony z zerowym lub bliskim zeru ruchem?
Strony bez ruchu:
- nie wspierają celów biznesowych,
- nie generują wejść organicznych,
- często obniżają ogólną jakość serwisu.
Po ich identyfikacji możesz:
- poprawić SEO i treść,
- zmienić ich przeznaczenie,
- połączyć je z innymi treściami,
- albo świadomie je usunąć.
Prosta heurystyka: mniej niż 30 odsłon = potencjalnie „zero traffic”
Jeśli strona miała mniej niż 30 odsłon w ciągu miesiąca, oznacza to, że:
- przez większość dni nie miała żadnego ruchu,
- jest dobrym kandydatem do analizy jako strona „martwa”.
To najprostszy i bardzo skuteczny sposób identyfikacji takich stron.
Jakie dane są potrzebne w BigQuery?
Aby zbudować raport stron z zerowym ruchem, potrzebujesz:
- wymiaru strony wejścia (Landing Page)
- metryki liczby odsłon (Views)
W GA4 BigQuery oznacza to:
page_location– adres URL stronyevent_name = 'page_view'– zdarzenia odsłonentrances = 1– tylko strony wejścia
Logika raportu krok po kroku
Krok 1: Wyznaczenie stron wejścia
- pobieramy
page_locationz parametrów zdarzenia, - bierzemy tylko zdarzenia
page_view, - filtrujemy tylko te, gdzie
entrances = 1.
Dzięki temu analizujemy strony, od których użytkownicy zaczynali sesję.
Krok 2: Liczenie odsłon dla każdej strony wejścia
- zliczamy liczbę zdarzeń
page_viewdla każdej strony, - traktujemy to jako liczbę odsłon strony w danym okresie.
Krok 3: Filtrowanie stron z bardzo niskim ruchem
- zostawiamy tylko strony, które mają mniej niż 30 odsłon,
- sortujemy je rosnąco, aby na górze były najbardziej „martwe” strony.

Przykładowe zapytanie SQL
Pamiętaj, aby podstawić własny identyfikator tabeli.
-- Wykrywanie stron z zerowym lub bliskim zeru ruchem w GA4
WITH prep AS (
SELECT
(SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_location,
(SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'entrances') AS entrances_int,
event_name
FROM
`<Your table ID>`
WHERE
_TABLE_SUFFIX BETWEEN '20251001' AND '20251031'
)
SELECT
CASE
WHEN page_location IS NULL
OR page_location = ''
THEN '(not set)'
ELSE page_location
END AS landing_pages,
COUNT(*) AS views
FROM
prep
WHERE
event_name = 'page_view'
AND entrances_int = 1
GROUP BY
landing_pages
HAVING
COUNT(*) < 30
ORDER BY
views ASC;
Czyszczenie raportu: usunięcie stron wyszukiwania wewnętrznego
Często raport „zaśmiecają” strony wyników wyszukiwania wewnętrznego, np.:
/ ?s=fraza
Takie strony:
- nie są klasycznymi landing pages,
- zaburzają analizę treści.
Jak je wykluczyć?
Wystarczy dodać warunek:
- wyklucz
page_location, które zaczyna się od określonego wzorca URL.

Rozszerzone zapytanie (bez stron wyszukiwania)

-- Wykrywanie stron z zerowym ruchem (bez wyników wyszukiwania)
WITH prep AS (
SELECT
(SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_location,
(SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'entrances') AS entrances_int,
event_name
FROM
`<Your table ID>`
WHERE
_TABLE_SUFFIX BETWEEN '20251001' AND '20251031'
)
SELECT
CASE
WHEN page_location IS NULL
OR page_location = ''
THEN '(not set)'
ELSE page_location
END AS landing_pages,
COUNT(*) AS views
FROM
prep
WHERE
event_name = 'page_view'
AND entrances_int = 1
AND (page_location IS NULL
OR NOT STARTS_WITH(page_location, 'https://twojadomena.pl/?s='))
GROUP BY
landing_pages
HAVING
COUNT(*) < 30
ORDER BY
views ASC;
„Oczyszczony” raport wyglada dużo lepiej:

Najważniejsza lekcja
Najwięcej czasu nie zajmuje pisanie SQL-a, tylko:
- zrozumienie logiki danych,
- zaprojektowanie poprawnych warunków,
- świadome określenie, co analizujesz.
SQL można wygenerować w kilka sekund.
Zła logika = złe wnioski, nawet przy idealnym kodzie.