Tiempo medio en página por URL orgánica

Calcula el tiempo medio de engagement por página para sesiones orgánicas. Ayuda a identificar contenido que retiene al usuario y contenido que no genera interés.

tiempo-medio-pagina-organica.sql
-- Tiempo medio de engagement por página en sesiones orgánicas
-- Usa engagement_time_msec acumulado por cada evento de la página
SELECT
  (SELECT value.string_value FROM UNNEST(event_params)
    WHERE key = 'page_location') AS pagina,
  COUNT(*) AS page_views,
  ROUND(
    AVG(
      (SELECT value.int_value FROM UNNEST(event_params)
        WHERE key = 'engagement_time_msec')
    ) / 1000, 2
  ) AS tiempo_medio_seg,
  ROUND(
    SUM(
      (SELECT value.int_value FROM UNNEST(event_params)
        WHERE key = 'engagement_time_msec')
    ) / 1000 / 60, 2
  ) AS tiempo_total_min
FROM
  `your-project.analytics_XXXXXXXXX.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
  AND traffic_source.medium = 'organic'
  AND event_name = 'user_engagement'
GROUP BY
  pagina
HAVING
  page_views >= 10
ORDER BY
  tiempo_medio_seg DESC
LIMIT 50

Explicación paso a paso

  • 4 Extrae la URL de la página desde event_params.
  • 7 Calcula el promedio de engagement_time_msec y lo convierte de milisegundos a segundos.
  • 13 Calcula el tiempo total acumulado en minutos para contextualizar la relevancia de cada página.
  • 25 Filtra por evento user_engagement, que es el que acumula tiempo de engagement en GA4.
  • 28 Excluye páginas con menos de 10 vistas para evitar promedios engañosos.
  • 30 Ordena de mayor a menor tiempo medio para ver primero el contenido más atractivo.

Ejemplo de resultado esperado

paginapage_viewstiempo_medio_segtiempo_total_min
https://ejemplo.com/guia-completa-seo1243187.343881.29
https://ejemplo.com/tutorial-bigquery876142.182076.23
https://ejemplo.com/blog/herramientas65498.451073.10

Variaciones y adaptaciones

Para ver solo páginas con bajo engagement (candidatas a mejorar), cambiar ORDER BY a tiempo_medio_seg ASC. Para agrupar por directorio, usar REGEXP_EXTRACT(page_location, r'https?://[^/]+(/[^/]+)') AS directorio. Para ver la mediana en lugar del promedio, usar APPROX_QUANTILES(engagement_time_msec, 100)[OFFSET(50)].