Definitions
Daily Cohorts and Complete Cohorts
Learn how daily cohorts group dunning recovery campaigns by start date, and why no recovery rate is published until every campaign in the cohort has resolved.
Cohort logic applies to dunning recovery, the campaign that starts when a subscription payment fails. Cancel flows resolve in session and don’t use it; see Cancel Flows.
Complete cohorts. Every outcome counted.
A recovery campaign runs for days or weeks, so at any moment some campaigns have finished and others haven’t. Two rules keep that from distorting the rate: group every campaign by the day it started, and publish no rate for a day until every campaign in it has finished.
Daily cohorts
A daily cohort is every campaign that started on a given calendar date. Cohorts are assigned at start and never change. A campaign that started on March 12 belongs to the March 12 cohort even if it doesn’t resolve until April 15. We don’t reassign a campaign to the day it resolved or pull one out retroactively.
Complete cohorts
A cohort is complete when the last in-progress campaign in it reaches a final state. Until then, no recovery rate is published for that date. Final states are the four outcomes plus voided.
If a date has any active campaigns, the entire date is set aside until everything resolves. No partial calculations, and no preliminary numbers that change later. An active campaign’s outcome is unknown, so it counts as neither recovered nor lost.
Cohort exclusion, not campaign exclusion. Removing the active campaigns from a row and publishing a rate on the rest shrinks the denominator by the campaigns whose outcome you don’t know yet.
Worked example: 25 campaigns
A date has 25 campaigns started. When you run the report, 20 have resolved (17 recovered, 3 lost) and 5 are still active.
The whole cohort waits for the last 5. Once they resolve, all 25 campaigns sit in the denominator, including any that ended as Cancellations.
A report that shows the day as 17 / 20 = 85%, built by dropping the 5 active campaigns from the denominator, is wrong. Their outcome is unknown until they resolve.
The same 25 campaigns carry the cancellation math on Recovery Rate: the Formula.
The daily cohort table
One row per cohort day, one column per outcome. This format lets you set aside incomplete days, see natural variance, and roll days up into any period you want to report on.
| Row | A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|---|
| 1 | Date | Failed Payments |
In Progress |
Card Updates |
Successful Retries |
Cancellations | Passive Churn |
| 2 | Aug 18 | 897 | 170 | 346 | 301 | 80 | 0 |
| 3 | Aug 17 | 805 | 0 | 305 | 290 | 85 | 125 |
| 4 | Aug 16 | 788 | 0 | 304 | 219 | 117 | 148 |
| 5 | Aug 15 | 746 | 0 | 322 | 217 | 92 | 115 |
Column B is the number of campaigns that started that day. Columns C through G should always add up to Column B: they are the outcomes those campaigns reached during the recovery window, plus the ones still running.
Column D isn’t the number of card updates that happened on that date. It’s the number of customers who had a failed payment on that date and went on to be recovered via Card Update, whenever that happened. Every outcome column works the same way.
Aug 18 has 170 campaigns In Progress, so the cohort is incomplete and the row waits.
You can build this table from any export that lists campaigns with a start date and a final state.
Voided campaigns leave the row
A voided campaign, where the customer or merchant cancelled the underlying order (skip, pause, or delay) without ending the subscription, comes out of Column B before you check that Columns C through G add up to it. The charge that triggered the campaign no longer exists, so there is nothing to recover and nothing to lose.
A voided campaign is the only state that legitimately leaves a cohort. If the next renewal fails, a fresh campaign starts in a fresh cohort.
Formulas
Recovery rate for a single day
=(D5+E5)/B5
(Card Updates + Successful Retries) ÷ Failed Payments, Aug 15
(322 + 217) ÷ 746 = 72.25%
This formula never runs on a row with In Progress > 0 (Column C).
Recovery rate for a date range
=SUM(D3:E5)/SUM(B3:B5)
(Card Updates + Successful Retries) ÷ Failed Payments, Aug 15 to Aug 17
(305 + 304 + 322 + 290 + 219 + 217) ÷ (805 + 788 + 746) = 70.84%
The range never includes a row with In Progress > 0. Extend it only as far as the last complete cohort day.
Cancellation rate for a date range
=SUM(F3:F5)/SUM(B3:B5)
Cancellations ÷ Failed Payments, Aug 15 to Aug 17
(85 + 117 + 92) ÷ (805 + 788 + 746) = 12.57%
No row with In Progress > 0 here either. Swap the numerator column and the same table gives you the card update rate, the retry rate, or the passive churn rate.
Count-based and dollar-weighted
The table above is count-based: every cell is a number of campaigns. You can build the same table in dollars, with dollars at risk in Column B and dollars recovered in Columns D and E.
Count-based is the analytical primary because it removes price point as a variable, so a shift in your price mix doesn’t look like a shift in dunning performance. Dollar-weighted is the one we present as a headline because it carries business meaning at a glance. Both reflect the same outcomes and follow the same cohort rules; they weight the outcomes differently.
How long to wait
Campaign length varies by business model; the most common length is around 30 days. For a campaign length of N days, counting the failure date as day 1, expect your first complete cohort day on day N+1. A cohort closes when its slowest campaign reaches a final state, and a campaign that runs all the way to Passive Churn takes the full N days.
Plan on 30+ days of completed cohorts before drawing a conclusion about your performance, and 60+ before comparing a before and an after.
Don’t measure it this way
- Dropping the in-progress campaigns from a row while keeping the resolved ones. Set the whole day aside.
- Publishing a rate for a day that still has active campaigns. Wait for the cohort.
- Reassigning a campaign to the day it resolved. It belongs to the day it started, permanently.
- Treating a voided campaign as a loss. The charge is gone, so the campaign leaves the cohort.
The short version: set incomplete days aside, keep cancellations in the denominator, keep campaign start dates fixed, and remove only voided campaigns.
Prerequisite: The Four Outcomes, which defines the final states a cohort waits for. Next: Recovery Rate, where complete cohort days become the denominator.