hose Demo data with a pulse

A claim about Quenchly

Churn front-loads: the first three months are twice as dangerous as the back half of the year.

Monthly hazard by tenure month. Months 1 to 3 average at least twice months 7 to 12, and the steady state settles near 3% a month including payment failures.

holds on the current window

as of moments ago

Churn hazard by tenure

WITH RECURSIVE months(n) AS (
  SELECT 1 UNION ALL SELECT n + 1 FROM months WHERE n < 12
),
activation AS (
  SELECT s.id, e.at AS t0, s.canceled_at
  FROM subscriptions s
  JOIN subscription_events e ON e.subscription_id = s.id AND e.kind = 'activate'
  WHERE s.billing = 'monthly'
),
bounds AS (SELECT datetime(MAX(at)) AS data_end FROM subscription_events),
exposure AS (
  SELECT m.n AS tenure_month,
         CASE WHEN datetime(a.t0, '+' || m.n || ' months') <= b.data_end
               AND (a.canceled_at IS NULL OR datetime(a.canceled_at) >= datetime(a.t0, '+' || (m.n - 1) || ' months'))
              THEN 1 ELSE 0 END AS at_risk,
         CASE WHEN datetime(a.canceled_at) >= datetime(a.t0, '+' || (m.n - 1) || ' months')
               AND datetime(a.canceled_at) <  datetime(a.t0, '+' || m.n || ' months')
              THEN 1 ELSE 0 END AS canceled
  FROM months m CROSS JOIN activation a CROSS JOIN bounds b
)
SELECT tenure_month,
       SUM(at_risk)  AS subscriptions_at_risk,
       SUM(canceled) AS cancels,
       ROUND(100.0 * SUM(canceled) / SUM(at_risk), 2) AS hazard_pct
FROM exposure
GROUP BY tenure_month
ORDER BY tenure_month;
112
View data table
tenure_monthsubscriptions_at_riskcancelshazard_pct
11062121.13
2102510810.54
3899798.79
4799415.13
5741222.97
6694243.46
7657162.44
8623203.21
9598233.85
10562122.14
11533173.19
12495163.23

holds on the current window

A flat churn rate is the tell of generated data. Real subscriptions leave early or settle in. Quenchly models this as a hazard that starts elevated and decays over the first quarter of a subscription, multiplied by an account trait and by the quality of the channel that brought the account in. Grouping cancels by tenure month, not calendar month, exposes the pattern.

What you should see

Twelve rows. Month 1 is low because a requested cancel takes effect at the next renewal. A customer who decides to leave in the first month shows up in month 2. Months 2 to 4 carry hazards several times the later months. By month 7 the rate has settled near three percent and stays there. Change billing = 'monthly' to 'annual' and the cancels move to month 12, the renewal month.

Run it yourself

More on Quenchly