Análisis de cohortes de usuarios orgánicos por semana de adquisición
Agrupa usuarios orgánicos por la semana en que llegaron al sitio por primera vez y analiza su retención en semanas posteriores. Permite evaluar si el tráfico SEO genera usuarios que regresan.
-- Análisis de cohortes semanales de usuarios orgánicos
-- Semana de adquisición vs semana de actividad
WITH primera_visita AS (
SELECT
user_pseudo_id,
DATE_TRUNC(
MIN(PARSE_DATE('%Y%m%d', event_date)), WEEK
) AS semana_adquisicion
FROM
`your-project.analytics_XXXXXXXXX.events_*`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
AND traffic_source.medium = 'organic'
AND event_name = 'first_visit'
GROUP BY
user_pseudo_id
),
actividad AS (
SELECT
user_pseudo_id,
DATE_TRUNC(
PARSE_DATE('%Y%m%d', event_date), WEEK
) AS semana_actividad
FROM
`your-project.analytics_XXXXXXXXX.events_*`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
AND traffic_source.medium = 'organic'
GROUP BY
user_pseudo_id, semana_actividad
)
SELECT
pv.semana_adquisicion,
DATE_DIFF(a.semana_actividad, pv.semana_adquisicion, WEEK) AS semana_n,
COUNT(DISTINCT a.user_pseudo_id) AS usuarios_activos,
ROUND(
COUNT(DISTINCT a.user_pseudo_id) * 100.0 /
MAX(COUNT(DISTINCT a.user_pseudo_id)) OVER(PARTITION BY pv.semana_adquisicion),
2) AS tasa_retencion
FROM
primera_visita pv
JOIN actividad a ON pv.user_pseudo_id = a.user_pseudo_id
WHERE
a.semana_actividad >= pv.semana_adquisicion
GROUP BY
pv.semana_adquisicion, semana_n
ORDER BY
pv.semana_adquisicion, semana_n
Explicación paso a paso
- 3 El CTE primera_visita identifica la semana en que cada usuario orgánico llegó al sitio por primera vez.
- 12 Usa un rango de 90 días para tener suficientes semanas de datos para el análisis de cohortes.
- 19 El CTE actividad registra cada semana en que cada usuario tuvo actividad.
- 36 DATE_DIFF calcula cuántas semanas pasaron desde la adquisición hasta cada semana de actividad (semana 0, 1, 2...).
- 39 La tasa de retención se calcula dividiendo los usuarios activos de la semana N entre los usuarios de la semana 0 (máximo) de esa cohorte.
- 44 El JOIN conecta cada usuario con todas sus semanas de actividad para construir la tabla de retención.
Ejemplo de resultado esperado
| semana_adquisicion | semana_n | usuarios_activos | tasa_retencion |
|---|---|---|---|
| 2026-02-16 | 0 | 1245 | 100.00 |
| 2026-02-16 | 1 | 312 | 25.06 |
| 2026-02-16 | 2 | 187 | 15.02 |
| 2026-02-16 | 3 | 134 | 10.76 |
Variaciones y adaptaciones
Para cohortes mensuales en lugar de semanales, cambiar DATE_TRUNC a MONTH y DATE_DIFF a MONTH. Para filtrar una cohorte específica, añadir WHERE pv.semana_adquisicion = '2026-03-01'. Para incluir todos los canales y comparar retención orgánica vs otros, eliminar el filtro de medio y añadir traffic_source.medium al GROUP BY.
Queries relacionadas
Páginas más vistas por usuarios orgánicos en una sola sesión
GA4 en BigQuery
Intermedio
Usuarios nuevos vs recurrentes desde orgánico
GA4 en BigQuery
Intermedio
Páginas de salida más frecuentes en sesiones orgánicas
GA4 en BigQuery
Intermedio
Tiempo medio en página por URL orgánica
GA4 en BigQuery
Intermedio