← Todos los artículos

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.

Paso 1 de 6 Dos usuarios distintos abren una sesión el mismo día. Cada uno tiene su user_pseudo_id.
  1. Dos usuarios distintos abren una sesión el mismo día. Cada uno tiene su user_pseudo_id.
  2. Pero los dos eventos llevan el mismo ga_session_id: el ID solo distingue sesiones de un mismo usuario.
  3. COUNT(DISTINCT ga_session_id) ve un solo valor y cuenta una sesión donde hay dos.
  4. La causa: ga_session_id solo es único dentro de cada usuario, no en toda la propiedad.
  5. La solución: contar el par user_pseudo_id + ga_session_id. Vuelven a ser dos sesiones.
  6. 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_id cuentan 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

  1. Busca en tus consultas, vistas y dashboards COUNT(DISTINCT ga_session_id) o un ga_session_id usado solo como clave de sesión, también en joins.
  2. En la misma consulta, compara el recuento por ga_session_id solo con el recuento por el par user_pseudo_id + ga_session_id. Si el segundo es mayor, el primero está juntando sesiones.
  3. 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'
  • CONCAT necesita texto, así que el ID de sesión (un entero en int_value) se convierte con CAST. El separador evita que dos pares distintos formen la misma cadena.
  • Si usas user_id para 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_id es igual o mayor que el recuento por ga_session_id solo, 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.