User Journey Analytics con GA4 e BigQuery SQL

I report standard di GA4 ("Esplorazioni Percorso") soffrono di campionamento aggressivo e mancanza di granularità. Se vuoi capire davvero come gli utenti navigano nel tuo sito—ad esempio, per vedere esattamente quali pagine visitano prima di convertire e quanto tempo passano su ciascuna—devi scendere nel livello dei dati grezzi (Raw Data) su BigQuery.
Lavorare con l'export di GA4 richiede un cambio di mentalità: i dati non sono tabelle piatte, ma strutture annidate (RECORD type) ottimizzate per la scalabilità, non per la leggibilità immediata.
La Struttura event_params e UNNEST
Ogni riga in BigQuery è un evento. Ma i dettagli (URL pagina, ID sessione, Click Text) sono nascosti dentro il campo ripetuto event_params. Per estrarli, usiamo la funzione UNNEST.
Ecco lo scheletro di base per "appiattire" i dati e renderli leggibili:
SELECT
user_pseudo_id,
event_name,
event_timestamp,
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') as session_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') as page_url
FROM
`tuo_progetto.analytics_123456.events_202512*`
WHERE
event_name = 'page_view'
Ricostruire la Sequenza (Pathing)
Per analizzare il journey, dobbiamo ordinare gli eventi cronologicamente per ogni utente e sessione. Usiamo le Window Functions di SQL (ROW_NUMBER, LEAD, LAG).
Vogliamo rispondere alla domanda: "Qual è la pagina successiva più comune dopo aver letto un post del blog?"
WITH user_path AS (
SELECT
user_pseudo_id,
session_id,
page_url as current_page,
event_timestamp,
-- Trova la pagina successiva nella stessa sessione
LEAD(page_url) OVER (PARTITION BY user_pseudo_id, session_id ORDER BY event_timestamp) as next_page,
-- Calcola il tempo speso sulla pagina corrente (in secondi)
(LEAD(event_timestamp) OVER (PARTITION BY user_pseudo_id, session_id ORDER BY event_timestamp) - event_timestamp) / 1000000 as time_on_page_sec
FROM
( -- Subquery di appiattimento vista sopra -- )
)
SELECT
current_page,
next_page,
COUNT(*) as transitions,
AVG(time_on_page_sec) as avg_time
FROM
user_path
WHERE
current_page LIKE '%/blog/%' -- Filtra solo partenze dal blog
GROUP BY
1, 2
ORDER BY
transitions DESC
Analisi Avanzata: Pattern di Attribuzione
Con SQL, puoi andare oltre il pathing sequenziale. Puoi creare segmenti complessi retroattivi: "Mostrami tutti gli utenti che hanno visitato la pagina 'Prezzi' almeno 3 volte in 7 giorni ma non hanno convertito."
Questi segmenti possono essere reimmessi in Google Ads (tramite Data Activation) per campagne di remarketing iper-specifiche, o usati per personalizzare l'esperienza on-site se usi un motore di personalizzazione server-side. Il raw data è complesso, ma è l'unica fonte di verità non filtrata che possiedi.
Correlati

Consent Mode v2: Template GTM Personalizzato
Non rischiare sanzioni e perdita dati. Guida alla creazione di un Custom Template GTM per gestire i segnali 'ad_user_data' e 'ad_personalization'.

Server-Side Tagging su Cloud Run: Analisi Costi 2026
GTM Server-Side non deve costare una fortuna. Guida all'ottimizzazione dei costi su Google Cloud Run: istanze, concurrency e gestione log.

Form Tracking su WordPress: Oltre il 'Click' Trigger
I trigger basati sui click sono inaffidabili. Ecco come intercettare correttamente CF7, Forminator e WPForms iniettando JS nel DataLayer.