-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathecommerce_funnel_analysis.sql
More file actions
119 lines (96 loc) · 4.15 KB
/
ecommerce_funnel_analysis.sql
File metadata and controls
119 lines (96 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
E-commerce Conversion & Revenue Lifecycle Analysis
Skills used: CTEs, Conditional Aggregation, Time-Series Analysis (TIMESTAMPDIFF),
Financial Safeguards (COALESCE, NULLIF), Unit Economics (AOV, RPV)
*/
-- Initial data check
SELECT * FROM user_events;
-- DEFINE SALES FUNNEL AND DIFFRERENT STAGES
WITH funnel_stages AS (
SELECT
COUNT(DISTINCT CASE WHEN event_type ='page_view' THEN user_id END) AS stage_1_views,
COUNT(DISTINCT CASE WHEN event_type ='add_to_cart' THEN user_id END) AS stage_2_cart,
COUNT(DISTINCT CASE WHEN event_type ='checkout_start' THEN user_id END) AS stage_3_checkout,
COUNT(DISTINCT CASE WHEN event_type ='payment_info' THEN user_id END) AS stage_4_payment,
COUNT(DISTINCT CASE WHEN event_type ='purchase' THEN user_id END) AS stage_5_purchase
FROM user_events
WHERE event_date >= TIMESTAMP(DATE_SUB(CURRENT_DATE(),INTERVAL 30 DAY))
)
SELECT * FROM funnel_stages;
-- CONVERSION RATE THROUGH THE FUNNEL
WITH funnel_stages AS (
SELECT
COUNT(DISTINCT CASE WHEN event_type ='page_view' THEN user_id END) AS stage_1_views,
COUNT(DISTINCT CASE WHEN event_type ='add_to_cart' THEN user_id END) AS stage_2_cart,
COUNT(DISTINCT CASE WHEN event_type ='checkout_start' THEN user_id END) AS stage_3_checkout,
COUNT(DISTINCT CASE WHEN event_type ='payment_info' THEN user_id END) AS stage_4_payment,
COUNT(DISTINCT CASE WHEN event_type ='purchase' THEN user_id END) AS stage_5_purchase
FROM user_events
WHERE event_date >= TIMESTAMP(DATE_SUB(CURRENT_DATE(),INTERVAL 30 DAY))
)
SELECT
stage_1_views,
stage_2_cart,
ROUND(stage_2_cart *100/stage_1_views) As view_to_cart_rate,
stage_3_checkout,
ROUND(stage_3_checkout *100/stage_2_cart) As cart_to_checkout_rate,
stage_4_payment,
ROUND(stage_4_payment *100/stage_3_checkout) As checkout_to_payment_rate,
stage_5_purchase,
ROUND(stage_5_purchase *100/stage_4_payment) As payment_to_purchase_rate,
ROUND(stage_5_purchase *100/stage_1_views) As overall_conversion_rate
FROM funnel_stages;
-- funnel by source
WITH source_funnel AS (
SELECT traffic_source,
COUNT(DISTINCT CASE WHEN event_type ='page_view' THEN user_id END) AS views,
COUNT(DISTINCT CASE WHEN event_type ='add_to_cart' THEN user_id END) AS cart,
COUNT(DISTINCT CASE WHEN event_type ='purchase' THEN user_id END) AS purchase
FROM user_events
WHERE event_date >= TIMESTAMP(DATE_SUB(CURRENT_DATE(),INTERVAL 30 DAY))
GROUP BY traffic_source
)
SELECT traffic_source,
views,
purchase,
ROUND(cart *100/views) As cart_conversion_rate,
ROUND(purchase *100/views) As cart_conversion_rate,
ROUND(purchase *100/cart) As cart_to_purchase_conversion_rate
FROM source_funnel
ORDER BY purchase DESC;
-- Time to conversion analysis
WITH user_journey AS (
SELECT user_id,
MIN(CASE WHEN event_type ='page_view' THEN event_date END) AS view_time,
MIN( CASE WHEN event_type ='add_to_cart' THEN event_date END) AS cart_time,
MIN( CASE WHEN event_type ='purchase' THEN event_date END) AS purchase_time
FROM user_events
WHERE event_date >= TIMESTAMP(DATE_SUB(CURRENT_DATE(),INTERVAL 30 DAY))
GROUP BY user_id
HAVING purchase_time IS NOT NULL
)
SELECT
COUNT(*) AS converted_users,
ROUND(AVG(TIMESTAMPDIFF(MINUTE,view_time,cart_time)),2) AS avg_view_to_cart_minutes,
ROUND(AVG(TIMESTAMPDIFF(MINUTE,cart_time,purchase_time)),2) AS avg_cart_to_purchase_minutes,
ROUND(AVG(TIMESTAMPDIFF(MINUTE,view_time,purchase_time)),2) AS avg_total_journey_minutes
FROM user_journey;
-- revenue funnel analysis
WITH funnel_revenue AS (
SELECT
COUNT(DISTINCT CASE WHEN event_type ='page_view' THEN user_id END) AS total_visitors,
COUNT(DISTINCT CASE WHEN event_type ='purchase' THEN user_id END) AS total_buyers,
COALESCE(SUM(CASE WHEN event_type ='purchase' THEN amount END),0) AS total_revenue,
COUNT(CASE WHEN event_type ='purchase' THEN 1 END) AS total_orders
FROM user_events
WHERE event_date >= TIMESTAMP(DATE_SUB(CURRENT_DATE(),INTERVAL 30 DAY))
)
SELECT
total_visitors,
total_buyers,
total_orders,
total_revenue,
total_revenue/NULLIF(total_orders,0) AS avg_order_value,
total_revenue/NULLIF(total_buyers,0) AS revenue_per_buyer,
total_revenue/NULLIF(total_visitors,0) AS revenue_per_visitor
FROM funnel_revenue