User Journey Analytics con GA4 e BigQuery SQL

In questo articolo
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.
Prossimi passi
Una volta che il raw data è dominato, lo step naturale è andare predittivi: usare gli stessi dati per costruire modelli che anticipano comportamenti utente. Sul tema ho scritto un tutorial pratico in BigQuery ML su GA4: prevedere la churn dai dati grezzi.
Per visualizzare i risultati di queste analisi in una vista condivisa con il team (e non dover sempre scrivere SQL dal vivo), il livello sopra è la Dashboard Looker Studio. E se vuoi una validazione del setup BigQuery + GA4 attuale (export configurato bene, eventi puliti, attribuzione corretta), il punto di ingresso è l'Audit Tracking GA4.
Correlati

Iubenda + GTM: integrare il consent banner senza buchi
Integrare Iubenda Cookie Solution con GTM e Consent Mode v2 senza buchi: mappatura categorie, gestione race condition, segnali ad_user_data e ad_personalization.

Tag governance: ordine in un container GTM con 200 tag
Come fare ordine in un container GTM con 200+ tag naming convention, folder, version control e processo di review per team marketing e dev.

Attribution data-driven GA4: come confrontare i modelli senza farsi ingannare
Confronto onesto tra modelli di attribution su GA4 data-driven, paid + organic, ultima interazione. Come leggere il rapporto Path Exploration senza innamorarsi del numero.