📞 Zadzwoń teraz

GA4 BigQuery dla SEO: Analiza danych niespróbkowanych i łączenie z GSC (SQL)

Limity interfejsu GA4 (cardinality, próbkowanie) sprawiają, że analiza dużych serwisów e-commerce staje się zgadywaniem. Jedynym źródłem prawdy jest BigQuery. W tym wpisie pomijamy konfigurację – przechodzimy od razu do SQL. Pokażę, jak wyciągnąć niespróbkowany ruch organiczny i połączyć go z danymi z Search Console, by znaleźć "Revenue per Landing Page" z precyzją, której nie daje UI.

Dlaczego UI kłamie (i dlaczego musisz użyć SQL)

W standardowych raportach GA4, gdy przekroczysz limity kardynalności (np. miliony URLi), Google grupuje dane w wierszu "(other)". W BigQuery masz dostęp do surowych zdarzeń (events_*).

Druga kwestia: atrybucja. W BQ masz dostęp do traffic_source na poziomie zdarzenia i sesji, co pozwala budować własne modele atrybucji, zamiast polegać na czarnej skrzynce "Data-driven".

Krok 1. Surowy ruch organiczny (Gotowy Query)

Zapomnij o session_start. Liczymy sesje zaangażowane z wejść organicznych.

SELECT
  event_date,
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') as landing_page,
  COUNT(DISTINCT user_pseudo_id) as users,
  COUNT(DISTINCT CONCAT(user_pseudo_id, (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id'))) as sessions
FROM
  `twoj-projekt.analytics_123456789.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20260101' AND '20260131'
  AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') = 'google'
  AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') = 'organic'
GROUP BY 1, 2
ORDER BY 4 DESC
LIMIT 100

Krok 2. Łączenie GSC z przychodami (The Holy Grail)

Eksport GSC do BigQuery (Bulk Data Export) to game changer. Możemy połączyć dane o kliknięciach (GSC) z przychodami (GA4) kluczem Landing Page.

Uwaga: URL w GSC jest kanoniczny, w GA4 może zawierać parametry. Wymagana normalizacja.

WITH gsc_data AS (
  SELECT
    url,
    SUM(clicks) as total_clicks,
    SUM(impressions) as total_impressions
  FROM `twoj-projekt.searchconsole.searchdata_url_impression`
  WHERE data_date BETWEEN '2026-01-01' AND '2026-01-31'
  GROUP BY 1
),
ga4_revenue AS (
  SELECT
    REGEXP_REPLACE((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'), r'\?.*', '') as clean_url, -- Uproszczona normalizacja
    SUM((SELECT value.double_value FROM UNNEST(event_params) WHERE key = 'value')) as revenue
  FROM `twoj-projekt.analytics_123456789.events_*`
  WHERE
    event_name = 'purchase'
    AND _TABLE_SUFFIX BETWEEN '20260101' AND '20260131'
  GROUP BY 1
)

SELECT
  g.url,
  g.total_clicks,
  g.total_impressions,
  COALESCE(r.revenue, 0) as ga4_revenue,
  SAFE_DIVIDE(COALESCE(r.revenue, 0), g.total_clicks) as revenue_per_click
FROM gsc_data g
LEFT JOIN ga4_revenue r ON g.url = r.clean_url
WHERE g.total_clicks > 100
ORDER BY 4 DESC

Pułapki, na które stracisz godziny

  • Unnesting: GA4 w BQ to struktura zagnieżdżona. Nie zrobisz prostego SELECT page_location. Musisz używać UNNEST(event_params).
  • Date vs Timestamp: GSC używa data_date (DATE), GA4 w tabelach dziennych używa event_date (STRING) lub event_timestamp (INT64). Konwersja jest niezbędna przy JOINach.
  • Koszt zapytań: SELECT * na tabeli events_ z roku to finansowe samobójstwo. Zawsze używaj _TABLE_SUFFIX do filtrowania dat partycji.

Wnioski

SQL to nowy Excel dla SEOwca. Przejście na BigQuery pozwala analizować wpływ SEO na ROI bez próbkowania, co przy dzisiejszych budżetach jest argumentem nie do podważenia. Jeśli jeszcze nie masz ustawionego eksportu – zrób to dziś, bo dane historyczne nie naliczają się wstecz.

Potrzebujesz precyzyjnej kampanii SEM dla swojego biznesu? Skonsultuj strategię z ekspertami SEOwl już dziś!

📞 Zadzwoń: +48 602 131 233
🚀 Load Time: ... 📄 DOM Elements: ... ⚡ Requests: ...