2 - Conversion & Revenue · Subscription revenue row
Current vs proposed, rendered with the real prod numbers as of Aug 2 (monitoring accounts excluded): one paying subscriber (Málaga, Jul 18) and one 7-day trial with cancellation already scheduled (País Vasco, started Aug 1, cancels Aug 8).
Current
One bucket. Trials, dead trials and paying subscribers are all "active".
Subscription revenue
Active subscriptions
2
1 of these is a trial that already cancelled
MRR (approx)
€6
€3 of this was never charged
Annual run-rate (approx)
€72
doubles the real run-rate
What this hides during the hard-paywall test
Proposed
Three explicit states. Paying (charged at least once), trial live (may convert), trial with cancellation scheduled (will churn at trial end). Same data sources, SQL-only change.
Subscription revenue
Paying subscriptions
1
survived the 7-day trial, charged
status='active' AND started_at <= now() - 7d
MRR (approx)
€3
paying subscriptions only
count(paying) * 3
Annual run-rate (approx)
€36
paying subscriptions only
count(paying) * 36
In trial · live
0
may convert at trial end
started_at > now() - 7d AND NOT cancel_scheduled
In trial · cancellation scheduled
1
riding out the trial, churns at trial end
started_at > now() - 7d AND cancel_scheduled
Trial → paid conversion
no decided trials yet · first decision Aug 8
still-active / all trials with started_at <= now() - 7d
Trials in flight
every subscription inside its 7-day trial window
GazetteStartedTrial endsState
pais-vasco Aug 1 Aug 8 cancellation scheduled
latest customer.subscription.updated per stripe_subscription_id → cancel_at_period_end (billing.stripe_events payload)
Trial funnel per day
trial starts vs conversions vs cancellations scheduled
0 1 2 Jul 27 Jul 28 Jul 29 Jul 30 Jul 31 Aug 1 Aug 2 1 1
Trial starts Conversions to paid Cancellations scheduled
What the operator can now read at a glance

Also changes: "List to subscription rate" (Reader funnel row) numerator switches to paying subscriptions, same filter as MRR.

Definitions. Paying = active for more than 7 days (activation happens at checkout completion, which is trial start, and the trial length is the backend constant TRIAL_PERIOD_DAYS = 7 in StripeCheckoutAdapter). Cancel-scheduled = latest customer.subscription.updated event for the subscription in billing.stripe_events has cancel_at_period_end = true (verified against prod: the Aug 1 cancellation is fully recoverable from the ledger, including its exact trial_end).

Caveats. The 7-day cutoff is coupled to the backend constant: lengthening the trial or reverting the test undercounts new payers for their first week (conservative direction). A card that declines at trial end counts as paying for the few days until customer.subscription.deleted arrives. Pre-trial-era subscribers pass the age filter correctly. All panels keep the existing monitoring-account and gazette filters.