When a subscription renewal payment fails — most commonly because the user's card expired, the bank declined the transaction, or the account had insufficient funds — Apple and Google don't immediately cancel the subscription. Instead, both platforms enter a billing retry / grace period window during which the platform automatically re-attempts the charge at increasing intervals.
Apple's default behaviour: when a renewal fails, the user enters a billing retry state. Apple retries the charge across a 60-day window with decreasing frequency. If the developer has enabled the optional billing grace period in App Store Connect (typically 6 or 16 days), the user retains full subscription entitlement during that window — the app should treat them as active. After the grace period or 60-day retry window expires without a successful charge, the subscription is treated as cancelled.
Google Play's behaviour is similar — automatic retries with a grace period up to 30 days. Configured per-subscription in the Play Console. During the grace period the user keeps entitlement; after it expires the subscription enters "account hold" (read-only access for an additional period) before final cancellation.
What your app needs to do: (1) treat users in billing retry / grace period as actively subscribed (don't lock them out — that triggers voluntary cancellation), (2) surface a non-blocking prompt to update their payment method (in-app banner, push notification, email) — this is the single highest-ROI dunning intervention, (3) handle the eventual subscription-expired state cleanly with a winback flow.
Most subscription platforms (RevenueCat, Adapty, Stripe Billing for cross-platform apps) abstract this state management — they expose a single "is the user entitled?" boolean that incorporates billing-retry status correctly. Building this state machine in-house is doable but error-prone; the standard recommendation is to use a platform.