Restore Purchases not working
- [x] I have updated Purchases SDK to the latest version
- [x] I have read the Contribution Guidelines
- [x] I have searched the Community
- [x] I have read docs.revenuecat.com
- [x] I have searched for existing Github issues
Environment
- [x] Output of
flutter doctor
[✓] Flutter (Channel stable, 3.32.7, on macOS 15.4.1 24E263 darwin-arm64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.1)
[✓] Xcode - develop for iOS and macOS (Xcode 16.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2024.1)
[✓] VS Code (version 1.102.1)
[✓] Connected device (4 available)
[✓] Network resources
• No issues found!
- [x] Version of
purchases-flutter
purchases_flutter: 9.1.0
purchases_ui_flutter: 9.1.0
- [x] Testing device version e.g.: iOS 15.5, Android API 30, etc. Android API 35
- [x] How often the issue occurs- every one of your customers is impacted? Only in dev? Production level
- [x] Debug logs that reproduce the issue
D/[Purchases] - DEBUG(18771): ℹ️ Restoring purchases
D/[Purchases] - DEBUG(18771): ℹ️ Querying purchases
V/Configuration(18771): Updating configuration, locales updated from [ja_JP,en_US] to [ja_JP]
D/[Purchases] - DEBUG(18771): Retrieving customer info with policy: CACHED_OR_FETCHED
D/[Purchases] - DEBUG(18771): ℹ️ Vending CustomerInfo from cache.
D/[Purchases] - DEBUG(18771): ℹ️ Checking if cache is stale AppInBackground false
I/[Purchases](18771): Restore purchases successful: <CustomerInfo
I/[Purchases](18771): latestExpirationDate: null
I/[Purchases](18771): activeSubscriptions: {},
I/[Purchases](18771): activeEntitlements: [],
I/[Purchases](18771): entitlements: [],
I/[Purchases](18771): nonSubscriptionTransactions: [],
I/[Purchases](18771): requestDate: Sat Jul 26 16:36:39 GMT+09:00 2025
I/[Purchases](18771): >
V/Configuration(18771): Updating configuration, locales updated from [ja_JP,en_US] to [ja_JP]
D/[Purchases] - DEBUG(18771): API request started: GET /product_entitlement_mapping
D/[Purchases] - DEBUG(18771): API request completed with status: GET /product_entitlement_mapping 200
D/[Purchases] - DEBUG(18771): Successfully updated product entitlement mappings.
- [x] Steps to reproduce, with a description of expected vs. actual behavior In version 9.1.0, pressing restore purchases does not restore purchases.
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(S.of(context).proPurchase),
),
body: SafeArea(
child: Center(
child: OriginalTemplatePaywallFooterView(
onPurchaseCompleted:
(CustomerInfo customerInfo, StoreTransaction storeTransaction) {
if (customerInfo.entitlements.active
.containsKey(entitlementKey)) {
settingsBox.put('isPurchased', true);
Navigator.of(context).pop();
}
},
onRestoreCompleted: (CustomerInfo customerInfo) {
if (customerInfo.entitlements.active
.containsKey(entitlementKey)) {
settingsBox.put('isPurchased', true);
Navigator.of(context).pop();
}
},
contentCreator: (double bottomPadding) {
return Center(
child: SingleChildScrollView(
padding: EdgeInsets.only(bottom: bottomPadding),
child: Container(
padding: const EdgeInsets.all(20),
constraints: const BoxConstraints(maxWidth: 600),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text(S.of(context).byPurchase),
),
const SizedBox(height: 10),
_proFeatures(),
const SizedBox(height: 10),
ListTile(
title: Text(S.of(context).pressRestore),
),
_agree(),
_transaction(),
],
),
),
),
);
},
),
),
),
);
}
Other information (e.g. stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, etc.)
Describe the bug
Hello,
I have received reports from multiple customers that they are unable to restore their purchases.
I have confirmed the issue on our end. When a user taps the "Restore Purchases" button, the loading indicator appears for a moment and then disappears, but the purchases are not restored.
With version 9.1.0, the debug log 😻💰 Purchase history retrieved does not appear, and the returned CustomerInfo object is empty. However, when I use version 8.10.6, I can see this log message, and the entitlements in CustomerInfo are correctly populated.
As a temporary workaround, we have downgraded purchases_flutter and purchases_ui_flutter to version 8.10.6 and confirmed the restore functionality works as expected. I have released our app with this older version for now.
Could you please look into this issue?
Thank you.
Additional context
- I'm using Legacy Paywalls (Template: Template 1 - Jaguar).
- The Product Type was originally set to Consumable. We have since changed it to Non-consumable as it is a lifetime purchase.
👀 We've just linked this issue to our internal tracker and notified the team. Thank you for reporting, we're checking this out!
There is a limitation in Billing Library 8 which the version v9 of our plugin integrates:
Play Billing Library 8 removed functionality to query expired subscriptions or consumed one-time products. This means that, for users migrating from a non-RevenueCat implementation of the Play Billing Library, the SDK will not be able to send purchase information from these purchases. We can still ingest historical data from these purchases through a backend historical import. See docs. This doesn't affect developers that have all transactions in RevenueCat, which is true for the vast majority.
Is this is your case?
Thank you for the information.
No, we have always used RevenueCat. We are not migrating from another system.
The key issue seems to be our Product Type configuration. When we set up this item back in 2022, we didn't realize Non-consumable was an option. While investigating this current issue, we realized this was the correct type and have now changed it.
What is the best way to support these users now?
Restore purchases not working on 9.1.0
+1.
When there is a subscription all is good.
When there is not a subscription, on Android PaywallView.onRestoreCompleted fires where we can check on CustomerInfo to check if there is an active subscription or not. All good here.
on iOS, it should do the same however it does not fire the PaywallView.onRestoreCompleted.
Repro steps:
User with no subscriptions. Click Restore Purchases on PaywallV2 through PaywallView.
Expected results: PaywallView.onRestoreCompleted fires with CustomerInfo having no subscriptions (similar to Android)
Actual results: PaywallView.onRestoreCompleted does not fire.
Hi, There’s an issue in the latest release of our Android and hybrid SDKs due to the migration to Google’s Billing Client v8, which removed the ability to query for expired subscriptions and consumed one-time purchases. As a result, we are no longer able to restore entitlements for previously consumed purchases.
This affects apps that don’t use a login system and rely on anonymous users and haven't configured their products that are meant to be bought only once as non-consumables in the RevenueCat dashboard. In these cases, if a user uninstalls the app or switches devices, they won’t be able to recover access to purchases like lifetime consumables.
To work around this, we recommend downgrading to the previous SDK version while we work on a more permanent fix. We also suggest reviewing your Google Play product catalog and marking any products that are meant to provide lasting access as non-consumables to prevent this issue going forward.
We also recently run a script to update all Google lifetime products to non-consumable ones. For those who have updated their products to non-consumable now, it should already be working for their customers moving forward but for those whose purchases have already been consumed will still face the issue.
Not working in 9.2.0
I am trying to restore a non-consumable purchase and its not working.. Also, I am getting the following error in the logs when the app starts
I/[Purchases] - INFO(29329): ℹ️ Missing productDetails: UnfetchedProduct{productId='app_premium_lifetime', productType='subs', statusCode=3} I/[Purchases] - INFO(29329): ℹ️ Product not found: app_premium_lifetime - Product Type: subs, Reason: PRODUCT_NOT_FOUND, Serialized doc ID:
Product set as non-consumable in the RevenueCat dashboard
Not Working on v9.2.0 Working on v8.10.6
I have same problem as @vinz-mehra . With 9.2.1. Works with 8.2.1. Also have
I/[Purchases] - INFO( 7419): ℹ️ Product not found: premium_sale - Product Type: subs, Reason: PRODUCT_NOT_FOUND, Serialized doc ID: I/[Purchases] - INFO( 7419): ℹ️ Product not found: premium_standard - Product Type: subs, Reason: PRODUCT_NOT_FOUND, Serialized doc ID:
However then i can see product list was retrieved.
I have two Non-consumable one time purchases.
When i call
final purchaserInfo = await Purchases.restorePurchases();
i get
D/[Purchases] - DEBUG( 7419): ℹ️ Restoring purchases D/[Purchases] - DEBUG( 7419): ℹ️ Querying purchases D/[Purchases] - DEBUG( 7419): Retrieving customer info with policy: CACHED_OR_FETCHED D/[Purchases] - DEBUG( 7419): ℹ️ Vending CustomerInfo from cache. D/[Purchases] - DEBUG( 7419): ℹ️ Checking if cache is stale AppInBackground false I/flutter ( 7419): CustomerInfo(EntitlementInfos({}, {}, VerificationResult.notRequested), {}, [], [], [], 2025-08-15T20:49:49.000Z, $RCAnonymousID:cdb1e9f4b80648ef9a365e576527f7bf, {}, 2025-08-15T21:26:47.802Z, null, null, null, null)
I made new purchase today, can see test purchase on Google Play and sandbox transaction on revenueCat overview
Those logs are informational and not related to the core issue, which is that restorePurchases stopped working on the latest version for already consumed purchases due to some changes in the Google Billing Client that we use.
The logs are a bit confusing indeed. This is implementation details, but what they mean is that when we try loading a product by product id only, with an unknown product type, we first asume it's a subscription, and then we try loading it as a non subscription. Since your products are non-subscriptions, they will fail when trying to load as subscriptions, but then succeed when we try to load them as a non-subscription. The billing client doesn't allow getting product details by id only.
There's room for improvement in those logs, so I will raise that with the rest of the team.
@nyeu
We also recently run a script to update all Google lifetime products to non-consumable ones.
I'm confused - RevenueCat did something like this on behalf of developers? If yes, does it mean I actually can't check which type I had selected so far?
Why was this closed?
Reopening issue. It was closed due to a failing automation. Sorry about that.
But seriously, there is this issue that's not allowing me to update the package.. Non-consumables purchasers from v8 are not able to restore their purchases on v9. The following is logged in the dashboard.
I/[Purchases] - INFO(29329): ℹ️ Missing productDetails: UnfetchedProduct{productId='app_premium_lifetime', productType='subs', statusCode=3} I/[Purchases] - INFO(29329): ℹ️ Product not found: app_premium_lifetime - Product Type: subs, Reason: PRODUCT_NOT_FOUND, Serialized doc ID:
What should I do?
I created a new Google account and added it to Google Play licence testing, made a purchase in my current app release with old revenueCat version and was able to restore it in the latest revenueCat version. So I presume something went wrong with my main account where I did multiple purchases and cancellations. I will test again later and presume it is the case and real users won't have troubles.
Any updates?
I am also experiencing this issue on my testing device.
For reference I also started this: https://community.revenuecat.com/general-questions-7/restoring-purchases-with-purchases-flutter-9-0-0-google-play-billing-library-8-0-0-6823?postid=23401 but it's now closed for comments 🤔