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 strony
  • event_name = 'page_view' – zdarzenia odsłon
  • entrances = 1 – tylko strony wejścia

Logika raportu krok po kroku

Krok 1: Wyznaczenie stron wejścia

  • pobieramy page_location z 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_view dla 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.

Podobne wpisy