runtime
58 / 88

lesson 58 Advanced product analysis · advanced

Experiment conversion denominators

Choose the correct population for experiment conversion rates.

the idea

An experiment’s conversion rate divides converters by everyone assigned to the variant, not by users who happened to be active afterwards. A conversion counts only if it happens at or after the user’s assignment and before the measurement window ends.

Dataset: Product / SaaS Analytics

The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.

events8 columns · 135,428 rows
delivery_idnumber · unique idevent_idtextuser_idnumber · links to usersaccount_idnumber · links to accountssession_idnumber · links to sessionsevent_nametextoccurred_atdate & timereceived_atdate & time
1evt_0000001111user_signed_up2024-01-14 18:52:142024-01-14 18:52:33
2evt_0000002111onboarding_started2024-01-14 18:52:512024-01-14 18:53:06
3evt_00000846232user_signed_up2024-01-15 13:21:522024-01-15 13:22:00
4evt_00000856232onboarding_started2024-01-15 13:22:052024-01-15 13:22:16
5evt_00000866232onboarding_completed2024-01-15 13:23:522024-01-15 13:24:12
6evt_0000019119search_performed2024-01-17 20:56:552024-01-17 20:56:59
delivery_idnumber · unique id
1
event_idtext
evt_0000001
user_idnumber · links to users
1
account_idnumber · links to accounts
1
session_idnumber · links to sessions
1
event_nametext
user_signed_up
occurred_atdate & time
2024-01-14 18:52:14
received_atdate & time
2024-01-14 18:52:33
delivery_idnumber · unique id
2
event_idtext
evt_0000002
user_idnumber · links to users
1
account_idnumber · links to accounts
1
session_idnumber · links to sessions
1
event_nametext
onboarding_started
occurred_atdate & time
2024-01-14 18:52:51
received_atdate & time
2024-01-14 18:53:06
delivery_idnumber · unique id
3
event_idtext
evt_0000084
user_idnumber · links to users
6
account_idnumber · links to accounts
2
session_idnumber · links to sessions
32
event_nametext
user_signed_up
occurred_atdate & time
2024-01-15 13:21:52
received_atdate & time
2024-01-15 13:22:00
delivery_idnumber · unique id
4
event_idtext
evt_0000085
user_idnumber · links to users
6
account_idnumber · links to accounts
2
session_idnumber · links to sessions
32
event_nametext
onboarding_started
occurred_atdate & time
2024-01-15 13:22:05
received_atdate & time
2024-01-15 13:22:16
delivery_idnumber · unique id
5
event_idtext
evt_0000086
user_idnumber · links to users
6
account_idnumber · links to accounts
2
session_idnumber · links to sessions
32
event_nametext
onboarding_completed
occurred_atdate & time
2024-01-15 13:23:52
received_atdate & time
2024-01-15 13:24:12
delivery_idnumber · unique id
6
event_idtext
evt_0000019
user_idnumber · links to users
1
account_idnumber · links to accounts
1
session_idnumber · links to sessions
9
event_nametext
search_performed
occurred_atdate & time
2024-01-17 20:56:55
received_atdate & time
2024-01-17 20:56:59

first 6 of 135,428 rows · your queries use all of them

experiment_assignments4 columns · 14,939 rows
experiment_idnumber · links to experimentsuser_idnumber · links to usersvarianttextassigned_atdate & time
11control2024-02-23 16:30:17
12treatment2024-02-06 23:25:21
13treatment2024-02-12 18:16:57
15treatment2024-02-12 02:53:31
111treatment2024-02-17 02:35:18
113control2024-02-11 14:48:37
experiment_idnumber · links to experiments
1
user_idnumber · links to users
1
varianttext
control
assigned_atdate & time
2024-02-23 16:30:17
experiment_idnumber · links to experiments
1
user_idnumber · links to users
2
varianttext
treatment
assigned_atdate & time
2024-02-06 23:25:21
experiment_idnumber · links to experiments
1
user_idnumber · links to users
3
varianttext
treatment
assigned_atdate & time
2024-02-12 18:16:57
experiment_idnumber · links to experiments
1
user_idnumber · links to users
5
varianttext
treatment
assigned_atdate & time
2024-02-12 02:53:31
experiment_idnumber · links to experiments
1
user_idnumber · links to users
11
varianttext
treatment
assigned_atdate & time
2024-02-17 02:35:18
experiment_idnumber · links to experiments
1
user_idnumber · links to users
13
varianttext
control
assigned_atdate & time
2024-02-11 14:48:37

first 6 of 14,939 rows · your queries use all of them

worked example

Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.

  1. Count users per variant. Run this. assigned is everyone split into A or B for experiment 6—the denominator for conversion rate.the pattern

    example.sql
    SELECT x.experiment_key, a.variant, COUNT(*) AS assigned
    FROM experiment_assignments a
    JOIN experiments x USING (experiment_id)
    WHERE x.experiment_id = 6
    GROUP BY x.experiment_key, a.variant;
  2. See a biased denominator. Run this. Inner-joining conversions drops users who never created a report, so both variants look almost 100% converted.

    step-2.sql
    SELECT a.variant, COUNT(DISTINCT a.user_id) AS users_seen
    FROM experiment_assignments a
    JOIN events e
      ON e.user_id = a.user_id
      AND e.event_name = 'report_created'
      AND e.occurred_at >= a.assigned_at
    WHERE a.experiment_id = 6
    GROUP BY a.variant;

common mistake

Inner-joining assignments to conversion events drops assigned users who never converted, so both variants look close to 100%.

challenge 1

For experiment 6 (report_builder_v2), return variant, assigned, converted and conversion_pct (0–100, 2 decimals).

A user converts with any report_created event at or after assigned_at and before 2024-09-02.

what to return

Columns
variantassignedconvertedconversion_pct in this order
Rows
any order
challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.
Experiment conversion denominators — Advanced product analysis · Runtime