使用 SQL 测量转化率
总体转化率会告诉您结果。里程碑事件通过显示用户离开渠道的位置以及哪个部分发生了变化来解释这一点。
相邻步骤的转化率使最大的下降立即可见。
本指南在一个事件表和一个 SQL 查询中构建用户级注册渠道。在每个阶段对不同的用户进行计数可以避免当一个人重复某项操作时夸大转化。
1. 添加事件之前定义渠道
使用代表已完成结果的里程碑,而不是可能失败的按钮点击:
signup_completedworkspace_createdfirst_event_receiveddashboard_created
选择一个稳定的受试者标识符,例如 user_id 或 team_id。分母和后面的每个阶段必须使用相同的主语。
2. 记录一致的事件形状
npm install telemetry-sh
import telemetry from "telemetry-sh";
telemetry.init(process.env.TELEMETRY_API_KEY);
await telemetry.log("product_events", {
event_name: "signup_completed",
user_id: user.id,
team_id: team.id,
acquisition_channel: "docs",
plan: "free",
});
使用相同的标识符和分段字段将后续里程碑记录到相同的 product_events 表中:
await telemetry.log("product_events", {
event_name: "first_event_received",
user_id: user.id,
team_id: team.id,
acquisition_channel: user.acquisitionChannel,
plan: team.plan,
});
Telemetry 自动添加 timestamp_utc。当稳定的内部标识符就足够时,避免记录电子邮件、姓名、cookie 或原始请求内容。
3. 在一次查询中计算漏斗
下面的查询为每个用户分配一行,记录每个阶段是否发生,然后计算原始注册队列的计数和转化。
WITH user_funnel AS (
SELECT
user_id,
MIN(CASE WHEN event_name = 'signup_completed' THEN timestamp_utc END)
AS signed_up_at,
MIN(CASE WHEN event_name = 'workspace_created' THEN timestamp_utc END)
AS workspace_created_at,
MIN(CASE WHEN event_name = 'first_event_received' THEN timestamp_utc END)
AS first_event_at,
MIN(CASE WHEN event_name = 'dashboard_created' THEN timestamp_utc END)
AS dashboard_created_at
FROM product_events
WHERE timestamp_utc >= now() - INTERVAL '30 days'
AND event_name IN (
'signup_completed',
'workspace_created',
'first_event_received',
'dashboard_created'
)
GROUP BY user_id
),
stage_counts AS (
SELECT 1 AS step, 'Signed up' AS stage, COUNT(*) AS users
FROM user_funnel
WHERE signed_up_at IS NOT NULL
UNION ALL
SELECT 2, 'Created workspace', COUNT(*)
FROM user_funnel
WHERE workspace_created_at >= signed_up_at
UNION ALL
SELECT 3, 'Sent first event', COUNT(*)
FROM user_funnel
WHERE first_event_at >= workspace_created_at
UNION ALL
SELECT 4, 'Created dashboard', COUNT(*)
FROM user_funnel
WHERE dashboard_created_at >= first_event_at
)
SELECT
step,
stage,
users,
ROUND(
100.0 * users /
NULLIF(MAX(CASE WHEN step = 1 THEN users END) OVER (), 0),
2
) AS conversion_from_signup_pct,
ROUND(
100.0 * users /
NULLIF(LAG(users) OVER (ORDER BY step), 0),
2
) AS conversion_from_previous_pct
FROM stage_counts
ORDER BY step;
第一阶段没有前阶段速率,因此该行的 conversion_from_previous_pct 为空。后面的每一行都会显示注册的总转化率和相邻步骤的转化率。
4. 不改变定义的分段
要比较获取渠道或计划,请保留注册事件上的字段,将其添加到 user_funnel,然后按该字段对阶段计数进行分组。不要默默地将分母从用户切换到事件。
有用的段检查包括:
- 获取渠道;
- 初步计划或报价;
- 设备或应用程序表面;
- 注册周;
- 在结果之前记录实验分配。
避免使用高基数维度,直到未分割的漏斗值得信赖。
5. 可视化并验证结果
对按 step 排序的 users 使用水平条形图,并在结果表中显示两个比率列。在共享图表之前,请检查:
- 用户在较早的时间戳之前完成较晚的阶段;
- 丢失或重复使用的标识符;
- 内部、测试和机器人帐户;
- 迟到的事件;
- 在所选窗口之前注册的用户;
- 最新的群体是否有足够的时间进行转变。
漏斗是一种队列测量,而不仅仅是两个独立事件的计数。对于更长的转化窗口,按注册日期对用户进行分组,并允许固定的观察期。
后续步骤
打开完整的 注册激活漏斗 SQL 配方 以获取示例结果和可视化。定义激活后使用 每周队列保留率,然后比较 升级前的功能采用。