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.

cohortes-organicas-semanales.sql
-- 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_adquisicionsemana_nusuarios_activostasa_retencion
2026-02-1601245100.00
2026-02-16131225.06
2026-02-16218715.02
2026-02-16313410.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.