Overview

A unified recovered total, then one card per flow: Unpaid, Leaving, Win-back.

The recovered total, and one card per flow

Overview is the first item in the menu. A unified total shows what churnhook has recovered over the selected period, across every flow, with the breakdown right next to it. Below it, one card per flow — Unpaid, Leaving, Win-back — never mixed. Each card opens its list: Unpaid opens To handle → Unpaid, Leaving opens To handle → Leaving, Win-back opens To handle → Canceled.

The recovered total

The period selector (30 days / 90 days / all time) changes this total and all three cards — except the outcome block on the Win-back card, which always stays all time (see why below).

Unpaid

Subscriptions currently past due, unpaid, or incomplete.

At risk is the billing-cycle amount at stake — a monthly €100 and a yearly €1,200 in the same currency add up to €1,300, not two separate lines. For a yearly subscription, that amount is due now. Coverage is the share of those subscriptions that already have a running dunning sequence.

Leaving

Every still-live subscription Stripe has marked to end at period close.

At risk is the full list of scheduled cancels, not just the next few days. For a yearly plan, that amount is the next cycle if they stay — not cash due today. Coverage is the share that already has a running save.

Win-back

Canceled subscriptions still in a win-back window: a win-back is running, or they're still enrollable on the live sequence.

At risk is this same list (To handle → Canceled), not every subscription ever canceled. Coverage is the share that already has a running win-back. The outcome block on this card stays all time, even if you change the period elsewhere on the page: the default sequence waits 30 days before its first email, so a short window would almost always read as a 0% win rate.

Reading a card's numbers

Every card has two blocks: current exposure, then what happened over the period.

BlockWhat it shows
At riskA right-now snapshot, never affected by the period selector.
In progressRuns executing right now, with the cycle amount they're defending.
CoverageThe share of "at risk" subscriptions that already have a running sequence of the same flow, capped at 100%.
Outcome for the periodWhat entered the flow within the selected window — not what's still open. A won case is no longer "at risk", but it still counts here.

Inside the period's outcome:

  • No follow-up groups everything that didn't land — never covered, a cancelled sequence, one that finished without success, or a technical failure — deliberately merged into one neutral bucket instead of four.
  • Won means recovered: invoice paid, an offer accepted, a pause confirmed, a cancel undone, or a win-back Checkout paid.
  • Win rate is Won ÷ (Won + No follow-up). Cases still in progress never enter this ratio.

Amounts are always the Stripe cycle price, never MRR — a yearly plan is not divided by 12. Different currencies stay separate (€1,300.00 · $500.00).

A case never touched before you connected Stripe only shows up under "No follow-up" on the "All time" period — a 30d or 90d window has no arrival date to give it, so it stays invisible until the window is wide enough.

Failed runs

When a run fails on our side (a Stripe or email error, never a customer decision), a red line appears under the cards linking to Activity → Runs filtered on failures. It disappears once there are none.

Recent activity

The last five runs, live: status, customer, trigger type, sequence name, start time. Click a row to open it. Toasts also pop in real time — mute them in Settings → General → Notifications; lists keep refreshing even with toasts off.

Overview — churnhook