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 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
| pagina | page_views | tiempo_medio_seg | tiempo_total_min |
|---|---|---|---|
| https://ejemplo.com/guia-completa-seo | 1243 | 187.34 | 3881.29 |
| https://ejemplo.com/tutorial-bigquery | 876 | 142.18 | 2076.23 |
| https://ejemplo.com/blog/herramientas | 654 | 98.45 | 1073.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)].
Queries relacionadas
Comparativa orgánico vs otros canales (mes actual vs anterior)
GA4 en BigQuery
Avanzado
Search terms internos usados por visitantes orgánicos
GA4 en BigQuery
Intermedio
Eventos personalizados disparados en sesiones orgánicas
GA4 en BigQuery
Intermedio
Tráfico orgánico segmentado por tipo de contenido
GA4 en BigQuery
Avanzado