Checkout is a hand-off: your app asks, the store's sheet takes over, and the result comes back later. Every step can be interrupted. The risky outcomes are a charge without access, access without a charge, and a screen stuck forever. Part of Testing monetization.
Use sandbox or license-tester accounts, not real cards (Android steps).
Checks
- User cancels the store sheet. Expected: back on the paywall, no error, no "purchase failed" scare. Cancelling is a choice, not a fault.
- Cancel, then buy again. Works the second time without restarting.
- App goes to background during the sheet and comes back. Expected: the result is picked up; the paywall does not reset to a spinner.
- App killed during the purchase. Reopen. Expected: if the purchase completed, access arrives; if not, the paywall is normal. How to check: force-quit right after confirming.
- Network lost before confirming. Expected: a clear message and a retry, no charge assumed.
- Network lost after confirming. The hard one. Expected: the app retries delivery on next launch or when online, and the user is not asked to pay twice. See restore purchases.
- Pending or slow approval. Some purchases do not complete immediately. Expected: a "pending" message, access not granted yet, and no second purchase button that invites a duplicate. Which flows can be pending is a store matter; this page makes no claim, so check the current official docs.
- Double tap on the buy button. One purchase request only. Disable the button while waiting.
- Phone call or notification during the sheet. Result still arrives.
- Low battery, airplane mode toggled on and off. Same expectations as 5 and 6.
- Rotating the device or changing text size mid-flow does not drop state.
- Error messages are human. No raw codes. Say what happened and what to do next.
- Nothing is lost in your backend. If you verify purchases on a server, check that a purchase made during an interruption is still recorded (server-side checks).
How to read results
For each case write three lines: what the store did, what the app did, what the user saw. A mismatch in any of them is a bug, even if the entitlement ends up correct.
Related: price display across regions, paywall comprehension test.
Ask testers to cancel on purpose and tell you how they felt about the screen they landed on. Start free.