Business Flow Monitoring: Subscription Billing and Dunning
Dunning is a sequence that can stall at any step, and a stall means a customer who was never told their card failed.
Renewal looks like a single event and is actually a chain: an invoice is raised, a payment is attempted, entitlement is updated, a receipt goes out. When the payment fails, a second and longer chain begins, and each link can break independently.
The happy path
| # | Event key | Max gap from previous | What a stall here means |
|---|---|---|---|
| 1 | invoice.created | n/a (opens the flow) | Nothing yet |
| 2 | payment.attempted | 1 hour | Billing run did not execute |
| 3 | payment.succeeded | 10 minutes | Gateway slow, or failed silently |
| 4 | entitlement.updated | 2 minutes | Paying customer locked out |
| 5 | receipt.sent | 30 minutes | Support queries, disputes later |
Step 4 produces the fastest complaints in any subscription business. A customer whose payment succeeded and whose access was not restored contacts you within minutes, usually irritated.
Step 5 seems cosmetic and is not. Customers who never received a receipt are measurably more likely to dispute a charge they do not recognise on a statement, and a dispute costs far more than the email.
The dunning path, which is where it gets expensive
When step 3 fails, a different sequence starts and it runs over days rather than minutes. It is also the sequence nobody tests, because it only exercises when payments fail.
| # | Event key | Max gap from previous | What a stall here means |
|---|---|---|---|
| 1 | payment.failed | opens the dunning flow | Nothing yet |
| 2 | dunning.email.sent | 1 hour | Customer never told |
| 3 | retry.scheduled | 2 hours | No second attempt will happen |
| 4 | retry.attempted | 4 days | Retry silently skipped |
| 5 | resolved or access.restricted | 14 days | Unpaid account with full access |
Step 2 stalling is the costly one and the hardest to see. The customer's card expired, your system knows, and the customer does not. They discover it when their access is cut, at which point the conversation is about your billing rather than their card.
Step 5 stalling is the silent revenue leak: an account that failed payment, exhausted retries, and never had access restricted. Nobody reports being given a product for free.
Instrumenting the failure path deliberately
The dunning chain rarely executes in testing, so it needs monitoring more than the happy path rather than less. Open the dunning flow instance at the moment of payment failure.
Recording the provider's message ID at step 2 matters. It converts a claim that you sent the email into evidence, which is what you need when a customer says they were never warned.
Audit entitlement independently
Flow monitoring catches a sequence that stalls. It does not catch drift that accumulated before you instrumented anything, and most established products have some.
Run a nightly comparison between billing status and granted access as a backstop. The two together cover different failures: the flow catches new breaks in minutes, the audit catches everything that broke before you were watching.
Choosing the gaps
Use your provider's actual retry schedule for the dunning steps rather than inventing one. If your processor retries on days 3, 5 and 7, a four-day limit between retries is correct and a one-day limit will alert constantly.
SensaCat tracks both chains per subscription, so a single customer stuck at the notification step is visible rather than averaged away. Start free.