Handling Refunds for In-App Purchases (Billing Services)
Learn how refunds are handled across Google Play and iOS for in-app purchases.
Overview
Different app stores handle refunds and entitlement revocation in different ways. Here’s a clear breakdown for both Google Play and Apple App Store platforms.
Refund Support Matrix
Consumables
✅ Refund via play store,
❌ No control on blocking the content after restore without a backend server
✅ Refund via App Store Support,
❌ No control on blocking the content after restore without a backend server
Non-Consumables
✅ Refund with Revoke Entitlement (in play console at the time of refunding from orders page)
✅ Refund auto-removes from RestorePurchases
Subscriptions
✅ Refund with Revoke Entitlement
✅ Refund auto-removes from RestorePurchases
📌 Important: Platform Refund & Entitlement Behavior
Google Play
When issuing a refund via the Google Play Console for non-consumables or subscriptions:
You must enable "Revoke entitlement" for the app to detect the refund.
If enabled:
IsProductPurchased(productId)→falseUser’s entitlement will be removed.
Apple App Store
On iOS, when a refund is processed by Apple (usually via App Store Support or user refund requests):
Automatically revoked — no manual revoke option needed.
The product will not appear in subsequent
RestorePurchasescalls.IsProductPurchased(productId)will also returnfalse.Works seamlessly for non-consumables and subscriptions.
⚠️ Consumables on both platforms: Refunds can be processed, but once consumed, they’re not restorable and entitlement status cannot be tracked post-consumption. If you really want to track these purchases, for every entitlement you provide to the user of a purchase, log the transaction id and check from your backend if the purchase is revoked or still valid. Based on that you can control refunds for consumable purchases.
Last updated