AppReviewX Log in

Test failed payments and grace periods

How your app behaves when a renewal fails. Verify store behavior in current docs.

In this guide

A renewal can fail: expired card, empty balance, a payment method removed. What your app does next decides whether the user fixes it or leaves angry. Part of Testing monetization.

Store rules can change, so confirm them on the current pages and build your test matrix from them.

  • Apple: "If you enabled the billing grace period for your apps, there won't be any interruption to days of paid service or to your revenue, if Apple is able to recover the subscription within the billing grace period (either 6 or 16 days, depending on the subscription duration)."
  • Google Play: "This recovery period can consist of a grace period followed by an account hold period. During a grace period, the user should still have access to their subscription entitlement." and "When a subscription enters account hold, you should block access to the subscription entitlement." Grace period length can be adjusted in the Play Console; the account hold length is by default "60 days minus any grace period duration."

Sources: Apple App Store Connect Help (Offer auto-renewable subscriptions); Android Developers (Subscriptions; Subscription lifecycle); all retrieved 2026-10-22.

Build the matrix first

From the docs, list every subscription state the store can report (for example active, in retry, on hold, expired). For each state write: what access the user should have, what the app should say, and what the user can do. Then test each row.

Checks

  1. Each state has a defined access rule. No state falls into "undefined, so locked" by accident.
  2. The user is told, in the app, that payment failed. Plain words, one action ("Update payment method"), no blame.
  3. The action leads to the right place. The link opens the store's payment management, not a dead end. How to check: tap it on a real device.
  4. The message goes away after the fix. Pay again in the sandbox; the banner disappears without reinstalling.
  5. No nagging. A banner or a single dialog, not a blocking screen on every launch while access is still valid.
  6. Access is not cut too early or kept too long. Compare what the app allows with the state you recorded.
  7. Final expiry. When the subscription ends, the user lands on a calm paywall that explains what happened. See free trial flow.
  8. Resubscribe after expiry. The purchase works and access returns. See restore purchases.
  9. Failed payment during a plan change. See upgrade and downgrade.
  10. Server and app agree. If you track state on a server, check it handles the same states and out-of-order events (server-side checks).
  11. Timing in the sandbox. Sandbox renewals run on shortened schedules; compare with the real periods above before you draw conclusions about wording such as "in 6 days".

Wording

Do not promise dates you cannot read from the store. "We could not renew your subscription" is true; "you have 7 days left" is only true if you verified it.

Related: purchase interruption, price display across regions.

Ask a tester which message they would expect and whether they would know what to do. Start free.