Saltar al contenido
Análisis de producto receta SQL

Cree un embudo de registro para activación en SQL

Calcule la conversión de usuarios únicos mediante el registro, la incorporación, la integración y los hitos de primer valor.

Intermedioproduct_eventsRevisado 2026-07-27Probado con Apache DataFusion 45.2.0

Revisado por el equipo de producto Telemetry en . Revisamos la sintaxis SQL, los campos necesarios, los resultados de ejemplo y las limitaciones de la consulta. Quién revisa esta página

Pregunta respondida

¿Dónde se van los nuevos usuarios antes de alcanzar el primer valor?

Un embudo sólo es útil cuando cada paso tiene una definición de comportamiento. Esta consulta crea una fila por usuario, aplica el orden de los hitos y calcula la conversión desde el registro y desde el paso anterior.

Esquema del evento

Campos que espera la consulta

CampoTipoPor que existe
timestamp_utcTimestampCuándo ocurrió el evento del producto.
user_idUtf8Identificador de usuario estable.
event_nameUtf8Nombre del hito snake_case estable.
sourceUtf8Fuente de adquisición o campaña.
DataFusionSQL

Copiar la consulta

sql
WITH events AS (
  SELECT user_id, event_name, timestamp_utc
  FROM product_events
  WHERE timestamp_utc >= now() - INTERVAL '30 days'
),
signups AS (
  SELECT user_id, MIN(timestamp_utc) AS signed_up_at
  FROM events WHERE event_name = 'signup_completed'
  GROUP BY user_id
),
onboarding AS (
  SELECT s.user_id, s.signed_up_at, MIN(e.timestamp_utc) AS onboarded_at
  FROM signups AS s
  LEFT JOIN events AS e ON e.user_id = s.user_id
    AND e.event_name = 'onboarding_completed'
    AND e.timestamp_utc >= s.signed_up_at
  GROUP BY s.user_id, s.signed_up_at
),
integrations AS (
  SELECT o.user_id, o.signed_up_at, o.onboarded_at,
    MIN(e.timestamp_utc) AS integrated_at
  FROM onboarding AS o
  LEFT JOIN events AS e ON e.user_id = o.user_id
    AND e.event_name = 'integration_connected'
    AND e.timestamp_utc >= o.onboarded_at
  GROUP BY o.user_id, o.signed_up_at, o.onboarded_at
),
user_funnel AS (
  SELECT i.user_id, i.signed_up_at, i.onboarded_at, i.integrated_at,
    MIN(e.timestamp_utc) AS activated_at
  FROM integrations AS i
  LEFT JOIN events AS e ON e.user_id = i.user_id
    AND e.event_name = 'first_value_completed'
    AND e.timestamp_utc >= i.integrated_at
  GROUP BY i.user_id, i.signed_up_at, i.onboarded_at, i.integrated_at
),
stage_counts AS (
  SELECT 1 AS step_order, 'Signed up' AS step, COUNT(signed_up_at) AS users
  FROM user_funnel
  UNION ALL
  SELECT 2, 'Onboarded', COUNT(onboarded_at) FROM user_funnel
  UNION ALL
  SELECT 3, 'Integrated', COUNT(integrated_at) FROM user_funnel
  UNION ALL
  SELECT 4, 'Activated', COUNT(activated_at) FROM user_funnel
)
SELECT
  step_order,
  step,
  users,
  100.0 * users
    / NULLIF(MAX(CASE WHEN step_order = 1 THEN users END) OVER (), 0)
    AS conversion_from_signup_pct,
  100.0 * users
    / NULLIF(LAG(users) OVER (ORDER BY step_order), 0)
    AS conversion_from_previous_pct
FROM stage_counts
ORDER BY step_order;

Esta consulta de solo lectura se planifica y ejecuta en una tabla escrita vacía con Apache DataFusion 45.2.0. El resultado de la muestra determinista es sintético y se revisa por separado; valide tipos de campos, umbrales y definiciones comerciales con sus propios datos. Lea la metodología de prueba.

Resultado de la consulta

Embudo de registro para activación

La mayor pérdida absoluta se produce antes de que se complete la incorporación, mientras que la integración sigue siendo el cuello de botella posterior más fuerte.

step_orderstepusersconversion_from_signup_pctconversion_from_previous_pct
1Signed up8100—
2Onboarded67575
3Integrated45066,67
4Activated337,575

Salida de ejemplo sintético. Ejecute la consulta con su propio esquema de eventos y umbrales antes de utilizarla para decisiones operativas.

Signup-to-activation funnel: gráfico estático de valores sintéticos de users del resultado del ejemplo Build a signup-to-activation funnel in SQL
SVG indexable de la salida del ejemplo determinista. Descárguelo para ver un artículo, un runbook o una revisión de diseño con atribución.

Reproducir el ejemplo

Descarga los datos de ejemplo

El paquete JSON incluye el contrato de evento escrito, reproducible filas de entrada, SQL exacto, resultado esperado, notas de revisión y versión del motor. El CSV contiene el resultado mostrado.

Cómo funciona el SQL

  1. 1Each CTE selects the first milestone at or after the previous eligible stage, retaining one row per signed-up user.
  2. 2A missing or out-of-order milestone blocks all later steps. A later valid retry can advance the user, and duplicates count once.
  3. 3La consulta informa tanto la conversión desde el registro como la conversión desde el paso anterior, lo que hace visibles juntos el rendimiento total y la mayor pérdida de transición.
  4. 4Los nombres de los eventos deben representar hitos completados, no visitas a páginas o clics en botones que no demuestren que el usuario logró el paso.

Casos límite que debes comprobar

  • Utilice una ventana de cohorte basada en el tiempo de registro y deje suficiente tiempo para que se activen los registros recientes.
  • Los eventos que llegan tarde pueden hacer retroceder temporalmente a los usuarios en un embudo calculado recientemente.
  • Segmente por fuente de adquisición solo después de que el embudo total tenga suficiente volumen.

Panel recomendado

  • Barras de embudo: usuarios por paso
  • Gráfico de líneas: tasa de activación por semana de registro
  • Tabla: conversión por fuente, plan o persona

Guía de alerta

Utilice una alerta de baja urgencia cuando la activación de un grupo de registro maduro caiga materialmente por debajo de su línea de base reciente.

Leer configuración de alerta

Configura los eventos que necesita esta consulta

Instrumentación y guías relacionadas.

Definir los datos de origen

Esquemas de eventos para este análisis.

Continuar el análisis

Ejecútalo con tus eventos

Crea una tabla, adapta los campos y guarda el resultado.

Comience gratis, envíe eventos estructurados y utilice el resultado de la consulta como un gráfico, un widget de panel compartido o una entrada de alerta.

Obtén una clave API