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żywaevent_date(STRING) lubevent_timestamp(INT64). Konwersja jest niezbędna przy JOINach. - Koszt zapytań:
SELECT *na tabelievents_z roku to finansowe samobójstwo. Zawsze używaj_TABLE_SUFFIXdo 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