Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

WITH

filtered_subscriptipon_transactions AS (
filtered_subscription_transactions AS (
SELECT
*
FROM [revenuecat_data_table]
Expand All @@ -11,7 +11,7 @@ filtered_subscriptipon_transactions AS (
OR effective_end_time BETWEEN [targeted_start_date] and [targeted_end_date])
/* Exclude trials, which do not contribute to MRR */
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND end_time > start_time
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'),
Expand All @@ -35,22 +35,22 @@ actives AS (
END
) AS num_renewals

FROM filtered_subscriptipon_transactions
FROM filtered_subscription_transactions
GROUP BY 1),

expirations AS (
SELECT
DATE(effective_end_time) AS date,
COUNT(*) AS num_expirations
FROM filtered_subscriptipon_transactions
FROM filtered_subscription_transactions
GROUP BY 1)

SELECT
COALESCE(a.date, e.date) AS date,
COALESCE(a.num_new_actives, 0) AS new_actives,
COALESCE(a.num_renewals, 0) AS num_renewals,
COALESCE(e.num_expirations, 0) AS num_expirations,
num_expirations - num_renewals AS churned_actives,
num_expirations - num_renewals AS churned_actives
FROM actives a
FULL JOIN expirations e ON a.date = e.date
WHERE a.date BETWEEN [targeted_start_date] AND [targeted_end_date]
Expand Down
1 change: 0 additions & 1 deletion code_blocks/integrations/scheduled-data-exports_1.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ FROM
WHERE date(effective_end_time) > [targeted_date]
AND date(start_time) <= [targeted_date]
AND is_trial_period = 'true'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
Expand Down
2 changes: 1 addition & 1 deletion code_blocks/integrations/scheduled-data-exports_10.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ filtered_subscription_transactions AS (
OR effective_end_time BETWEEN [targeted_start_date] and [targeted_end_date])
/* Exclude trials, which do not contribute to MRR */
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND end_time > start_time
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'),
Expand Down
68 changes: 34 additions & 34 deletions code_blocks/integrations/scheduled-data-exports_11.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,40 @@ filtered_subscription_transactions AS (
/* Handle cases where product_duration cannot be used for the transaction first */
WHEN (is_in_intro_offer_period = 'true' OR product_duration IS NULL) THEN
CASE
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 0 AND 1
THEN (30 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) = 3
THEN (10 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 6 AND 8
THEN (4 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 12 AND 16
THEN (2 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 27 AND 33
THEN (1 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 58 AND 62
THEN (0.5 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 88 AND 95
THEN (0.333333 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 179 AND 185
THEN (0.1666666 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 363 AND 375
THEN (0.08333 * price)::DECIMAL(18,2)
ELSE ((28 / (DATE_DIFF('s', start_time, end_time)::float / (24 * 3600))) * price)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 0 AND 1
THEN (30 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) = 3
THEN (10 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 6 AND 8
THEN (4 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 12 AND 16
THEN (2 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 27 AND 33
THEN (1 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 58 AND 62
THEN (0.5 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 88 AND 95
THEN (0.333333 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 179 AND 185
THEN (0.1666666 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 363 AND 375
THEN (0.08333 * price_in_usd)::DECIMAL(18,2)
ELSE ((28 / (EXTRACT(EPOCH FROM (end_time - start_time))::float / (24 * 3600))) * price_in_usd)::DECIMAL(18,2)
END
/* Then handle cases where product_duration can be used */
WHEN product_duration = 'P1D' THEN (30 * price)::DECIMAL(18,2)
WHEN product_duration = 'P3D' THEN (10 * price)::DECIMAL(18,2)
WHEN product_duration = 'P7D' THEN (4 * price)::DECIMAL(18,2)
WHEN product_duration = 'P1W' THEN (4 * price)::DECIMAL(18,2)
WHEN product_duration = 'P2W' THEN (2 * price)::DECIMAL(18,2)
WHEN product_duration = 'P4W' THEN (1 * price)::DECIMAL(18,2)
WHEN product_duration = 'P1M' THEN (1 * price)::DECIMAL(18,2)
WHEN product_duration = 'P2M' THEN (0.5 * price)::DECIMAL(18,2)
WHEN product_duration = 'P3M' THEN (0.333333 * price)::DECIMAL(18,2)
WHEN product_duration = 'P6M' THEN (0.1666666 * price)::DECIMAL(18,2)
WHEN product_duration = 'P12M' THEN (0.08333 * price)::DECIMAL(18,2)
WHEN product_duration = 'P1Y' THEN (0.08333 * price)::DECIMAL(18,2)
ELSE ((28 / (DATE_DIFF('s', start_time, end_time)::float / (24 * 3600))) * price)::DECIMAL(18,2)
WHEN product_duration = 'P1D' THEN (30 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P3D' THEN (10 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P7D' THEN (4 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P1W' THEN (4 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P2W' THEN (2 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P4W' THEN (1 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P1M' THEN (1 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P2M' THEN (0.5 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P3M' THEN (0.333333 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P6M' THEN (0.1666666 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P12M' THEN (0.08333 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P1Y' THEN (0.08333 * price_in_usd)::DECIMAL(18,2)
ELSE ((28 / (EXTRACT(EPOCH FROM (end_time - start_time))::float / (24 * 3600))) * price_in_usd)::DECIMAL(18,2)
END
END AS transaction_mrr
FROM [revenuecat_data_table]
Expand All @@ -52,7 +52,7 @@ filtered_subscription_transactions AS (
OR effective_end_time BETWEEN [targeted_start_date] and [targeted_end_date])
/* Exclude trials, which do not contribute to MRR */
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND EXTRACT(EPOCH FROM (end_time - start_time))::float > 0
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'),
Expand Down Expand Up @@ -97,4 +97,4 @@ SELECT
FROM actives a
FULL JOIN expirations e ON a.date = e.date
WHERE a.date BETWEEN [targeted_start_date] AND [targeted_end_date]
AND e.date BETWEEN [targeted_start_date] AND [targeted_end_date]
AND e.date BETWEEN [targeted_start_date] AND [targeted_end_date]
72 changes: 36 additions & 36 deletions code_blocks/integrations/scheduled-data-exports_12.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -7,63 +7,63 @@ SELECT
/* Handle cases where product_duration cannot be used for the transaction first */
WHEN (is_in_intro_offer_period = 'true' OR product_duration IS NULL) THEN
CASE
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 0 AND 1
THEN (30 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) = 3
THEN (10 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 6 AND 8
THEN (4 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 12 AND 16
THEN (2 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 27 AND 33
THEN (1 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 58 AND 62
THEN (0.5 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 88 AND 95
THEN (0.333333 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 179 AND 185
THEN (0.1666666 * price)::DECIMAL(18,2)
WHEN DATE_DIFF(day, start_time, end_time) BETWEEN 363 AND 375
THEN (0.08333 * price)::DECIMAL(18,2)
ELSE ((28 / (DATE_DIFF('s', start_time, end_time)::float / (24 * 3600))) * price)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 0 AND 1
THEN (30 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) = 3
THEN (10 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 6 AND 8
THEN (4 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 12 AND 16
THEN (2 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 27 AND 33
THEN (1 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 58 AND 62
THEN (0.5 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 88 AND 95
THEN (0.333333 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 179 AND 185
THEN (0.1666666 * price_in_usd)::DECIMAL(18,2)
WHEN FLOOR(EXTRACT(EPOCH FROM (end_time - start_time)) / (24 * 3600)) BETWEEN 363 AND 375
THEN (0.08333 * price_in_usd)::DECIMAL(18,2)
ELSE ((28 / (EXTRACT(EPOCH FROM (end_time - start_time))::float / (24 * 3600))) * price_in_usd)::DECIMAL(18,2)
END
/* Then handle cases where product_duration can be used */
WHEN product_duration = 'P1D'
THEN (30 * price)::DECIMAL(18,2)
THEN (30 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P3D'
THEN (10 * price)::DECIMAL(18,2)
THEN (10 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P7D'
THEN (4 * price)::DECIMAL(18,2)
THEN (4 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P1W'
THEN (4 * price)::DECIMAL(18,2)
THEN (4 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P2W'
THEN (2 * price)::DECIMAL(18,2)
THEN (2 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P4W'
THEN (1 * price)::DECIMAL(18,2)
THEN (1 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P1M'
THEN (1 * price)::DECIMAL(18,2)
THEN (1 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P2M'
THEN (0.5 * price)::DECIMAL(18,2)
THEN (0.5 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P3M'
THEN (0.333333 * price)::DECIMAL(18,2)
THEN (0.333333 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P6M'
THEN (0.1666666 * price)::DECIMAL(18,2)
THEN (0.1666666 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P12M'
THEN (0.08333 * price)::DECIMAL(18,2)
THEN (0.08333 * price_in_usd)::DECIMAL(18,2)
WHEN product_duration = 'P1Y'
THEN (0.08333 * price)::DECIMAL(18,2)
ELSE ((28 / (DATE_DIFF('s', start_time, end_time)::float / (24 * 3600))) * price)::DECIMAL(18,2)
THEN (0.08333 * price_in_usd)::DECIMAL(18,2)
ELSE ((28 / (EXTRACT(EPOCH FROM (end_time - start_time))::float / (24 * 3600))) * price_in_usd)::DECIMAL(18,2)
END
END
) AS active_mrr
FROM [revenuecat_data_table]

/* Filter down to the date range that you want to measure MRR for */
WHERE date(effective_end_time) > '2024-02-06'
AND date(start_time) <= '2024-02-06'
WHERE date(effective_end_time) > [targeted_date]
AND date(start_time) <= [targeted_date]
/* Exclude trials, which do not contribute to MRR */
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND EXTRACT(EPOCH FROM (end_time - start_time))::float > 0
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
AND is_sandbox != 'true'
1 change: 0 additions & 1 deletion code_blocks/integrations/scheduled-data-exports_2.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ FROM
WHERE date(effective_end_time) > [targeted_date]
AND date(start_time) <= [targeted_date]
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
Expand Down
1 change: 0 additions & 1 deletion code_blocks/integrations/scheduled-data-exports_4.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ FROM
WHERE date(effective_end_time) > [targeted_date]
AND date(start_time) <= [targeted_date]
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
Expand Down
1 change: 0 additions & 1 deletion code_blocks/integrations/scheduled-data-exports_7.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ FROM
WHERE date(effective_end_time) > [targeted_date]
AND date(start_time) <= [targeted_date]
AND is_trial_period = 'true'
AND DATE_DIFF('s', start_time, effective_end_time)::float > 0
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
Expand Down
1 change: 0 additions & 1 deletion code_blocks/integrations/scheduled-data-exports_9.pgsql
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ FROM
WHERE date(effective_end_time) > [targeted_date]
AND date(start_time) <= [targeted_date]
AND is_trial_period = 'false'
AND DATE_DIFF('s', start_time, end_time)::float > 0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, but for the few queries where this filter is just removed, what's the line of reasoning?

Copy link
Contributor Author

@mshmoustafa mshmoustafa Nov 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I was debating this, but I was thinking that if effective_end_time > date and start_time <= date, then it's start_time <= date < effective_end_time, so end_time - start_time is always > 0 and the condition is redundant. But I know that start_time > end_time does happen, if we want to keep this condition in symbolically, I'm totally ok with that

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah the symbolic part I'm not concerned about at all, in fact this is one of those weird filters that I think is nonsensical to customers and is only in there because Charts does it that way. I'd maybe run a few test queries to verify that the same set of transactions that this filter excludes are also excluded when it's removed, but your logic for why it should makes sense to me.

AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
Expand Down