User Journey Analytics con GA4 e BigQuery SQL
2 min lettura

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.

Potrebbe interessarti anche