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
Atribución multicanal con orgánico como primer touch
GA4 en BigQuery
Avanzado
Tráfico orgánico por dispositivo y sistema operativo
GA4 en BigQuery
Principiante
Eventos personalizados disparados en sesiones orgánicas
GA4 en BigQuery
Intermedio
Tráfico orgánico por país y ciudad
GA4 en BigQuery
Principiante