Dos usuarios, una sesión: contar las sesiones de GA4 en BigQuery solo con ga_session_id
ga_session_id solo identifica una sesión dentro de un usuario, así que COUNT(DISTINCT ga_session_id) junta sesiones de usuarios distintos. Cómo las cuenta Google.
- Dos usuarios distintos abren una sesión el mismo día. Cada uno tiene su user_pseudo_id.
- Pero los dos eventos llevan el mismo ga_session_id: el ID solo distingue sesiones de un mismo usuario.
- COUNT(DISTINCT ga_session_id) ve un solo valor y cuenta una sesión donde hay dos.
- La causa: ga_session_id solo es único dentro de cada usuario, no en toda la propiedad.
- La solución: contar el par user_pseudo_id + ga_session_id. Vuelven a ser dos sesiones.
- Compruébalo: el recuento sube y se acerca a las sesiones del informe de GA4.
El export de GA4 no tiene una tabla de sesiones ni una columna session_id. Lo que lleva cada evento es un parámetro, ga_session_id, dentro de event_params. La forma evidente de contar sesiones es contar sus valores distintos. El problema es que ese ID no significa lo que su nombre sugiere.
Cómo es un recuento de sesiones a la baja
Una consulta con COUNT(DISTINCT ga_session_id) para un día o un mes:
- Da menos sesiones de las que debería. Dos eventos de usuarios distintos con el mismo
ga_session_idcuentan como una sola sesión. - La diferencia crece con el tráfico: cuantos más usuarios, más probable que dos compartan un valor.
- Las métricas construidas sobre ese recuento (tasa de conversión por sesión, páginas por sesión, ingresos por sesión) también fallan, en sentido contrario.
Por qué ga_session_id no basta
ga_session_id identifica una sesión dentro de un usuario, no en toda la propiedad. Dos usuarios distintos pueden llevar el mismo valor. El método de Google, explicado en el blog para desarrolladores de Google Analytics, es contar las combinaciones únicas de user_pseudo_id (o user_id) y ga_session_id.
Conviene conocer dos errores relacionados:
- Sumar sesiones por día. Una sesión que cruza la medianoche tiene eventos en dos días. Si cuentas las sesiones día a día y luego sumas los días, cuenta dos veces. Cuenta las combinaciones sobre todo el rango en una sola consulta.
- Esperar la cifra exacta de GA4. La interfaz de GA4 estima las sesiones con el algoritmo HyperLogLog++ (Google da una precisión de alrededor de ±1,63 % con un 95 % de confianza), y sus informes pueden incluir datos modelados y umbrales que el export no tiene. BigQuery da el recuento exacto de lo exportado, así que una pequeña diferencia es normal incluso con la consulta correcta.
Cómo encontrar un recuento de sesiones mal hecho
- Busca en tus consultas, vistas y dashboards
COUNT(DISTINCT ga_session_id)o unga_session_idusado solo como clave de sesión, también en joins. - En la misma consulta, compara el recuento por
ga_session_idsolo con el recuento por el paruser_pseudo_id+ga_session_id. Si el segundo es mayor, el primero está juntando sesiones. - Busca totales mensuales construidos sumando recuentos diarios de sesiones.
Cómo contar las sesiones
Cuenta el par único de usuario e ID de sesión, sobre todo el rango a la vez:
SELECT
COUNT(DISTINCT CONCAT(user_pseudo_id, '.', CAST(
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'ga_session_id')
AS STRING))) AS sessions
FROM `analytics_123.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261028'
CONCATnecesita texto, así que el ID de sesión (un entero enint_value) se convierte conCAST. El separador evita que dos pares distintos formen la misma cadena.- Si usas
user_idpara los usuarios con sesión iniciada, aplica la misma regla: usuario y sesión juntos. - Para un desglose diario, cuenta por día sabiendo que las sesiones que cruzan la medianoche aparecen en los dos días; para el total del periodo, no sumes los días.
Documentación: Bridge the gap between the GA UI and BigQuery export (en inglés) y esquema del export a BigQuery.
Cómo comprobar que las sesiones se cuentan bien
- El recuento por
user_pseudo_id+ga_session_ides igual o mayor que el recuento porga_session_idsolo, y es el que usan tus informes. - En un periodo cerrado, el resultado se acerca a las sesiones de GA4 en la interfaz, a pocos puntos porcentuales.
- El total del periodo sale de un único recuento, no de sumar días.
Los IDs de usuario y de sesión del ejemplo son ilustrativos.