Skip to main content
Question

Can't data export to match "LTV Per paying Customers"

  • September 17, 2025
  • 3 replies
  • 66 views

Forum|alt.badge.img

I’m trying to replicate the “LTV per paying customers (unbounded)” metric in our data export.
However, my results are consistently wrong in reporting LTV by more than 8% (standard deviation) compared to the “LTV per paying customers” chart in the dashboard.

Could there be an error in my approach, or is it possible to extract the underlying account IDs from the dashboard’s “LTV per paying customers” chart for validation?

cohort Mismatch in %
2025-01-31 5.10%
2025-02-28 4.16%
2025-03-31 2.65%
2025-04-30 -4.40%
2025-05-31 6.42%
2025-06-30 1.61%
2025-07-31 7.87%
2025-08-31 11.92%
2025-09-30 -5.34%
   
WITH subscriptions AS (
SELECT
MIN(start_date) as subscription_start_time,
rc_original_app_user_id,
MAX(CASE WHEN subscription_status = 'trial' THEN 1 ELSE 0 END) as had_a_trial,
SUM(price_in_usd) as realized_ltv,
store,
subscription_status
FROM {{ ref('int_store_transaction_id__renewal_number___w_account_label_filtered') }}
WHERE subscription_status != 'trial'
AND store != 'promotional'
-- AND is_sandbox != true
--AND ownership_type != 'FAMILY_SHARED'
GROUP BY rc_original_app_user_id, store, subscription_status
)
SELECT
DATE_TRUNC('month', subscription_start_time) as subscription_start_month,
store,
subscription_status,
COUNT(*) as subscriptions,
SUM(realized_ltv) as realized_ltv,
SUM(realized_ltv) / COUNT(*) as realized_ltv_per_subscription
FROM subscriptions
where subscription_status = 'P1M'
GROUP BY 1,2,3
ORDER BY 1,2,3

https://www.revenuecat.com/docs/integrations/scheduled-data-exports#sample-queries-for-revenuecat-measures

This post has been closed for comments

3 replies

Forum|alt.badge.img
  • Author
  • New Member
  • September 17, 2025

This is at the raw layer

 

WITH filtered_transactions AS (
SELECT *
FROM raw_airflow.revenuecat
WHERE is_trial_period = 'false'
AND ownership_type != 'FAMILY_SHARED'
AND store != 'promotional'
AND is_sandbox != 'true'
AND refunded_at IS NULL
AND price_in_usd > 0
AND product_duration = 'P1M'
),
first_purchase_dates AS (
SELECT
rc_original_app_user_id,
MIN(start_time) AS first_purchase_date,
product_duration,
store
FROM filtered_transactions
GROUP BY rc_original_app_user_id, product_duration, store
)
SELECT
DATE_TRUNC('month', fpd.first_purchase_date) AS cohort_month,
COUNT(DISTINCT fpd.rc_original_app_user_id) AS paying_customers,
(SUM(ft.price_in_usd)::DECIMAL(18,2)
/ COUNT(DISTINCT fpd.rc_original_app_user_id))::DECIMAL(18,2) AS avg_ltv_unbounded,
ft.product_duration,
ft.store
FROM filtered_transactions ft
JOIN first_purchase_dates fpd
ON fpd.rc_original_app_user_id = ft.rc_original_app_user_id
GROUP BY cohort_month,4, ft.store
ORDER BY 1;

 


chris_perriam
RevenueCat Staff
Forum|alt.badge.img+6
  • RevenueCat Staff
  • September 19, 2025

Hi, thanks for reaching out! I’ve responded to the support ticket you also raised about this issue. Let’s confirm the resolution on the ticket, then share back with the community here.


chris_perriam
RevenueCat Staff
Forum|alt.badge.img+6
  • RevenueCat Staff
  • September 26, 2025

Reporting back on this - these were the likely causes of the inconsistency:

  • Filtering users based on their first purchase date, rather than their first seen date
  • Filtering purchases to only include those with a 1 month duration, rather than any duration