Churn figures
Churn shows recorded subscription losses as a percentage of active subscriptions, using the latest saved count in the same period.
Churn shows recorded subscription losses as a percentage of active subscriptions, using the latest saved count in the same period.
Stay in the loop 🚀
The calculation does not use the opening subscriber base or count unique lost people.
Gross losses = deactivations + expirations + stops. Net losses subtract reactivations; new sales and routine renewals do not offset losses.
These fields come from daily subscription-history summaries. Deactivation includes ACTIVE changing to PAUSED or INACTIVE; expiration requires an active subscription. A stopped event can follow a paused status. One subscription can therefore contribute more than one loss event. Source: loss aggregation.
The denominator selects the latest subscription_summary.createdAt for each group and period, then sums quantities at that timestamp. The writer counts ACTIVE subscriptions. It groups stored rows by plan, package, provider, introductory-period flag and automatic renewal. Sources: active-count writer, snapshot selection.
The calculation matches loss and denominator rows by year, period and group ID. Fetching 13 denominator periods does not mean the previous period supplies the base.
Rate = max(losses / active count × 100, 0), calculated only when the base is positive. There is no upper clamp. additionalData retains the raw loss count, including negative net losses. Source: rate calculation.
The same subscriptionType filter applies to numerator and denominator. Paid means positive base-plan price; Free means zero. It does not test whether a payment succeeded.
Base-plan price sums plan-product prices only for published, nonoptional products. The loss table has no price, so it joins the latest plan-price snapshot in the same period.
A missing price resolves through COALESCE(price, 1), classifying that loss as paid. This can retain a loss after the plan has no remaining active subscriptions. .
Losses are grouped by summary createdAt. instead groups by dateOfRecord. A summary written after a month boundary can place the same events in different report months.
The page sends subscriptionType, type, groupBy and noOfLine; it exposes no period or range control. The API defaults to monthly and the formatter returns the latest 12 buckets, including the unfinished current month. , .
Details selects the highest-rate groups in the latest period containing rates. All means at most 100 groups; ignoreOthers=true prevents an Others series. Older groups outside that selection can disappear.
Total is calculated separately from all queried groups: summed losses divided by summed active counts. It is not the mean of visible rates, and hiding detail lines does not change it.
For example, 10/100 and 10/1,000 give group rates of 10% and 1%. Total is 20/1,100 = 1.82%, not 5.5%. .
null. No point is plotted.additionalData. Zero becomes an empty tooltip string; nonzero values supply the loss count.The chart supplies a separately calculated Total tooltip override. .
historical-churn-rates requires Dashboard read permission; menu access also depends on Analytics access and Insights. .
Source checked 28 September 2026 at 6cd1850569be3b1702ca736a19320c7626efb7bc. Prior UI evidence confirms the selectors and Net churn selection. No fresh UI, numeric reconciliation, tooltip-edge or ordinary-role test was performed.
For graph interpretation and controls, see .