DEV Community

Swipe Again
Swipe Again

Posted on

When Apple Owns the Renewal, Your Dunning Playbook Stops Working

A subscription sold through your own checkout fails in ways you can see and fix. The decline code arrives, your retry schedule runs, your email goes out, and the subscriber lands on a card-update page you control. Sell the same subscription through an app store and almost every one of those levers disappears — not because the failure is different, but because the storefront, not you, owns the billing relationship.

Start with visibility. On your own checkout, a failed renewal produces a decline reason you can triage: insufficient funds behaves differently from a replaced card, and both behave differently from a hard decline that should never be retried. Through in-app purchase billing, the failure surfaces as a state — billing retry, grace period, on-hold — with far less diagnostic detail about why the card failed. You are running a recovery operation with the instrument panel mostly covered. Teams that port their web dunning assumptions to store billing usually discover this the hard way, after a month of watching renewals lapse that their web playbook would have saved.

The retry itself is also not yours. The store runs its own retry cadence on its own schedule, and you cannot weave your attempts around it, because you cannot see the attempts. What you control is the edges: the in-app message shown while an account sits in a billing-retry state, the moment you choose to surface the subscription-management deep link, and how honestly your app explains what happened. A subscriber in a store grace period who opens your app to a generic error is a subscriber who assumes the product broke. The same subscriber who sees a plain explanation — your payment did not go through, here is where to fix it, your access continues until this date — is a subscriber who fixes it.

That messaging layer is where the real work sits, and it is narrower than most teams expect. You cannot email a store subscriber a card-update link that works the way a web link works; the fix lives inside the store's subscription settings, several taps deep, in an interface you did not design. Your job is to shorten the path: detect the billing state at launch, say exactly which setting needs attention, and deep-link as close to it as the platform allows. Every extra step between "my renewal failed" and the card form costs you subscribers who intended to stay.

There is one more asymmetry worth planning around: winback. A web subscriber who churns involuntarily can be recovered weeks later with a working card form and a clear conscience. A store subscriber who lapses past the grace period is, from the store's perspective, simply unsubscribed — and resubscribing runs through the store's flow, at the store's price presentation, sometimes without the plan or introductory terms they originally had. The economics of letting a store renewal die are worse than the economics of a web renewal dying, which is exactly backwards from where most teams spend their recovery effort.

None of this argues against selling through the stores; the distribution is real and so is the conversion lift of a stored payment method. It argues for treating store billing as its own discipline with its own metrics: grace-period rescue rate, billing-retry conversion, and time-to-surface of your in-app billing message. If you want the full map of where your control ends and the store's begins, how in-app purchase billing changes who owns the failed payment walks the states one by one. The discipline behind the web side of that map — conducted retries, honest messaging, one owner per failure — is what Swipe Again was built to run, and the store side rewards the same clarity about the few levers that remain yours.

Top comments (0)