使用 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 配方 以獲取範例結果和視覺化。定義啟用後使用 每週佇列保留率,然後比較 升級前的功能採用。