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
Eventos clave (conversiones) atribuidos a orgánico
GA4 en BigQuery
Intermedio
Funnel de conversión desde landing orgánica hasta evento clave
GA4 en BigQuery
Avanzado
Tráfico orgánico segmentado por tipo de contenido
GA4 en BigQuery
Avanzado
Eventos personalizados disparados en sesiones orgánicas
GA4 en BigQuery
Intermedio