There's no reason to limit your dunning to a single followup e-mail and 3 days to fix. If that goes out on a Friday, it's almost as bad as just cancelling the customer on the first billing failure.<p>With Improvely, I follow up and re-try the charge after 1 day, then 3 days after that, then 7 (with an e-mail each time about when the next attempt will be), which gives them almost two weeks. Enough people fix the problem after a few days that this retains a lot of subscriptions that nobody meant to cancel. Often it's just a matter of giving someone time to call their bank to tell them not to decline the charge -- with international customers especially, it's often the bank doing the blocking for fraud-prevention reasons.<p>Which brings up another thing -- if you can build an "inactive" flag into your app, that's 100% better for retention and recapturing past customers than deleting accounts. If someone accidentally lets their payment lapse and tries to log in to find their account no longer exists, and all the work they've put into setting up or configuring your service has to be redone, they're very likely to stay cancelled. If they log in show them a "welcome back, your account's still here, enter your payment info to reactivate immediately" screen.<p>As far as Patrick's advice for handling plan upgrades, I'd add one more tip: Build in some logic to never upgrade someone within X days of their billing date. Combined with the automatic warning at 80%/90% usage so they know they're getting close to needing to upgrade, making sure you never surprise them with a higher bill 2 days before their renewal goes a long way to keeping everyone happy. I've only ever had one customer reply to a mail about nearing the limits of his plan that he didn't want to upgrade and pay more, and he was completely happy after I offered a discount off the published cost.