- Google Play
- Android
- Monetization
Google Play Billing Library 8: deadline and migration guide
Google Play Billing Library 8 is now required for app updates. Check your version, request the November 1 extension, fix removed APIs and update your plugin.
AppRanker team10 min read

On this page
Google Play Billing Library 8 is now the minimum for every new app and app update that sells something through Google Play. The first deadline, August 31, 2026, has passed. The only thing left is the extension, and it ends on November 1, 2026. If your release pipeline still bundles Billing Library 7 or older, Play Console will reject your next update, which means no bug fixes, no price changes and no target API bump until you upgrade.
This guide covers the exact dates, how to check which version your build really ships, how to request the extension while you still can, the API changes that break the build, and which versions of the common Flutter, React Native, Unity and RevenueCat plugins already include version 8. Requirements are quoted from Google's deprecation FAQ, migration guide and release notes.
Key takeaways
- Since August 31, 2026, new apps and updates must use Billing Library 8.0.0 or later. The extension, if you requested one, runs to November 1, 2026.
- It is a publishing gate: apps already installed keep working, but updates built with version 7 are rejected.
- Version 8 removes
queryPurchaseHistoryAsync(),querySkuDetailsAsync(), the no-argumentenablePendingPurchases()and the string version ofqueryPurchasesAsync(), so most upgrades need code changes.- Cross-platform apps usually just need a plugin update: Flutter
in_app_purchase_android0.5.0,react-native-iap14.0.0, Unity IAP 4.15.1 or 5.0, RevenueCat SDK 9.0.0 or later.
The Google Play Billing Library 8 deadline
Google retires each major version of the library two years after release. The deprecation FAQ publishes the schedule:
| Library version | New apps and updates blocked after | Extension available until |
|---|---|---|
| 5 | August 31, 2024 | November 1, 2024 |
| 6 | August 31, 2025 | November 1, 2025 |
| 7 | August 31, 2026 | November 1, 2026 |
| 8 | August 31, 2027 | November 1, 2027 |
| 9 | August 31, 2028 | November 1, 2028 |
Google's own summary at the top of the FAQ puts it plainly: "By Aug 31, 2026, all new apps and updates to existing apps must use Billing Library version 8 or later. If you need more time to update your app, you can request an extension until Nov 1, 2026."
What actually stops working
Nothing changes for people who already have your app. The FAQ says "existing apps still work, but new apps and updates must use supported versions." Purchases, renewals and restores keep running on version 7 builds that are already live.
What stops is your ability to ship. When the version 7 requirement was announced in 2025, the Play Console warning told developers to "update to a newer version by this date to prevent your updates from being rejected," as one developer quoted on the Solar2D forums. This year's warning follows the same pattern with version 8.0.0. Being blocked from updates is worse than it sounds: you also cannot ship the target API level update that Google requires every year, crash fixes, or a new store build for a seasonal campaign. On Google Play, an app that goes over the Android vitals bad behavior thresholds can lose visibility, and a crash you cannot patch is the fastest way to get there before the holidays.
Does it apply if my app has no in-app purchases?
Only apps that include the library are affected. Google notes that these dependencies "only appear in APKs that require the com.android.vending.BILLING permission." A free app with no billing code is not in scope. But check anyway: a payments SDK or plugin can pull the library in without you adding it directly.

Most Billing Library 8 upgrades are a dependency bump plus a handful of call sites. Photo: Nemuel Sereti / Pexels
Check which billing version your app really ships
Do not trust the version you think you use. Plugins, transitive dependencies and manifest merging can all change what ends up in the release build. Check the build itself.
1. Ask Gradle. Run this from your Android project (for Flutter and React Native, that is the android/ folder):
./gradlew :app:dependencies --configuration releaseRuntimeClasspath | grep billingclient
You want to see com.android.billingclient:billing:8.x.x (or billing-ktx). If the output shows 7.1.1 -> 8.0.0, Gradle has resolved the newer version, which is fine.
2. Check the built bundle. Google's FAQ says the library writes a com.google.android.play.billingclient.version entry into your manifest, and that Play reads it. Inspect the release artifact you are about to upload:
# Android App Bundle
bundletool dump manifest --bundle app-release.aab | grep billingclient
# APK
apkanalyzer manifest print app-release.apk | grep billingclient
If the entry is missing even though you upgraded, the FAQ points at manifest merging: a tools:node="remove" rule or a custom merge can strip it, and then Play cannot see the version you upgraded to.
3. Read Play Console. Open Policy and programs > Policy status for the app. An outdated library shows up there as a warning with its own details page.
How to request the extension before November 1
If you cannot finish the migration this week, the extension buys you until November 1, 2026 and no further. Google's FAQ describes the only route: "If your app uses an unsupported Google Play Billing Library version, you'll receive a warning in the Google Play Console. On the warning's details page on the Policy status page, open the extension form."
- In Play Console, select the app.
- Go to Policy and programs > Policy status.
- Open the Billing Library warning and its details page.
- Open the extension form, submit it, and keep the confirmation.
Two things to keep in mind. The extension is per app, so check every app in the account, including old ones you still update occasionally. And it is not a reason to wait: there is no further extension after November 1.
The API changes that break the build
Version 8.0.0 shipped on June 30, 2025, and removed several APIs that had been deprecated for a while. The release notes and migration guide list them:
| Removed in version 8 | Use instead |
|---|---|
queryPurchaseHistoryAsync() |
queryPurchasesAsync() for active purchases; your own backend for history |
querySkuDetailsAsync() |
queryProductDetailsAsync() |
enablePendingPurchases() with no arguments |
enablePendingPurchases(PendingPurchasesParams) |
queryPurchasesAsync(String skuType, listener) |
queryPurchasesAsync(QueryPurchasesParams, listener) |
If you are coming from version 6, the subscription upgrade methods changed too: setOldSkuPurchaseToken becomes setOldPurchaseToken, and setReplaceProrationMode and setReplaceSkusProrationMode become setSubscriptionReplacementMode.
Step 1: Bump the dependency
// app/build.gradle.kts
dependencies {
implementation("com.android.billingclient:billing-ktx:8.0.0")
}
Any 8.x version meets the requirement. Pick deliberately: 8.0.0 still supports minSdkVersion 21, while 8.1.0 and later raise it to 23. Version 9 (May 2026) is also an option and is supported until August 2028.
Step 2: Update the client builder
The no-argument enablePendingPurchases() is gone. Google says it was equivalent to enabling pending purchases for one-time products, so that is the direct replacement. Version 8 also adds automatic reconnection, which removes a lot of fragile retry code:
val billingClient = BillingClient.newBuilder(context)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases(
PendingPurchasesParams.newBuilder()
.enableOneTimeProducts()
.build()
)
.enableAutoServiceReconnection() // new in 8.0.0
.build()
Step 3: Handle the new product details result
The ProductDetailsResponseListener signature changed. It now receives a QueryProductDetailsResult, which also tells you which products could not be fetched instead of silently dropping them:
billingClient.queryProductDetailsAsync(params) { billingResult, result ->
if (billingResult.responseCode == BillingResponseCode.OK) {
result.productDetailsList.forEach { showProduct(it) }
result.unfetchedProductList.forEach { logMissingProduct(it) }
}
}
The unfetched list is worth logging. A product ID that is inactive, misspelled or not available in the user's country now shows up there, which makes "my paywall is empty" bugs much easier to trace.
Step 4: Query purchases with params
val params = QueryPurchasesParams.newBuilder()
.setProductType(BillingClient.ProductType.SUBS)
.build()
billingClient.queryPurchasesAsync(params) { billingResult, purchases ->
purchases.forEach { handlePurchase(it) }
}
Step 5: Replace purchase history
This is the change that needs product decisions, not just code. Version 8 can no longer return expired subscriptions or consumed one-time products on the device. Google's purchase history page gives three replacements: use queryPurchasesAsync() to process current purchases, use the Voided Purchases API on your server for refunds and cancellations, and keep a user's purchase history on your own backend if you need it.
If you used history to restore a "lifetime unlock" that was a consumable, or to decide who gets a returning-user discount, move that logic to your server before you ship version 8.

Test a real purchase, a renewal and a restore on a license tester account before you ship. Photo: Mikhail Nilov / Pexels
Flutter, React Native, Unity and RevenueCat versions
If you do not call the billing library yourself, the fix is usually a plugin update. These versions ship Billing Library 8 or later, checked against each project's own changelog, upgrade guide or package files:
| Plugin | Version to use | Notes |
|---|---|---|
Flutter in_app_purchase_android |
0.5.0 or later | 0.5.0 is the first with Billing Library 8 and removes queryPurchaseHistory. Version 0.5.5 (October 2026) moves to Billing Library 9.1.0 and needs minSdkVersion 23. See the changelog. |
react-native-iap |
14.0.0 or later (September 2025) | Every 12.x and 13.x release defaults to Billing Library 7.0.0. |
| Unity IAP | 4.15.1 (8.3.0) or 5.0 (8.0.0) | IAP 5.4 uses Billing Library 9.0.0. See Unity's upgrade guide. |
| RevenueCat (Android, Flutter, React Native) | 9.0.0 or later | 9.0.0 is the first with Billing Library 8 and needs Kotlin 1.8.0 or later. See RevenueCat's announcement. |
Two warnings from experience. First, updating the Dart or JavaScript package is not always enough: run the Gradle check above, because an old lockfile or a pinned Android dependency can keep version 7 in the build. Second, major plugin versions change their own APIs. react-native-iap 14 and Unity IAP 5 both have migration guides of their own, so budget time for them.
If you use a no-code builder, check its SDK version page. Kodular users, for example, asked in July whether its billing component would move off 7.1.1 in time, and the answer depended on the platform's release, not on anything the developer could change.
Test before you upload
A billing upgrade that compiles is not a billing upgrade that works. Before the release goes out:
- Add your Google account as a license tester in Play Console so test purchases are not charged.
- Upload the build to the internal testing track and install it from Play, not from Android Studio.
- Buy each product type you sell: a subscription, a consumable and a non-consumable.
- Cancel and restore a purchase, and reinstall the app to check that entitlements come back.
- Watch your server logs for purchase tokens being acknowledged within three days, or Google refunds them automatically.
- Roll out to production in stages and keep an eye on Android vitals for new crashes.
If the update needs Google review, plan for that too. Our post on how long Google Play review takes covers typical times and what to do when a build sits in review.
Your Google Play Billing Library 8 checklist
- Run the Gradle and
bundletoolchecks on your release build. - Check Policy status in Play Console for every app in the account.
- Request the extension before November 1, 2026 if you need it.
- Update the dependency or your billing plugin to a version with Billing Library 8.
- Replace removed APIs, starting with
queryPurchaseHistoryAsync(). - Move purchase history logic to your backend.
- Log the unfetched product list from
queryProductDetailsAsync(). - Test purchases, restores and acknowledgements on the internal track.
- Put the Target API 36 work in the same release if it is still pending; our Android 16 migration guide covers what breaks.
Ship the update, then tell people about it
A forced migration is still a release, and releases are a chance to be seen. Pair the billing upgrade with a visible improvement, refresh your listing copy while you are in Play Console (our guide to the Google Play short description shows how to make those 80 characters count), and give the app some reach outside the store. You can list your Android app on the AppRanker leaderboard, where position is a plain sort on what each listing has paid and every row links straight to your Google Play page. If you also ship on iOS, the same week is a good time to check the App Store creative assets that went live in October.
FAQ
What is the deadline for Google Play Billing Library 8?
New apps and updates had to use version 8 or later by August 31, 2026. If you requested an extension in Play Console, you have until November 1, 2026. Version 8 itself is supported for new releases until August 31, 2027.
Will my app stop working if I miss the deadline?
No. Google says existing apps still work, and purchases on installed versions keep processing. What you lose is the ability to publish updates until the app uses a supported version.
How do I request an extension for the Billing Library deadline?
Open Policy and programs > Policy status in Play Console, select the Billing Library warning, and open the extension form from its details page. The extension cannot run past November 1, 2026.
Should I upgrade to Billing Library 8 or 9?
Either meets the requirement. Version 9 is supported a year longer (until August 31, 2028) but needs minSdkVersion 23 and targets SDK 35. If you still support Android 5.x, version 8.0.0 is the only release that keeps minSdkVersion 21.
What replaces queryPurchaseHistoryAsync?
Use queryPurchasesAsync() with QueryPurchasesParams for active purchases, the Voided Purchases API for refunds and cancellations, and your own backend to keep a full purchase history.
Why does Play Console still show the warning after I upgraded?
Check the release bundle, not the source. If com.google.android.play.billingclient.version is missing from the merged manifest, or an old plugin still pulls in version 7, Play sees the old version. Upload a new build after fixing it; the warning applies to builds you submit, not to code in your repository.
Image credits
- Cover, paying on a phone with a bank card: photo by Mikhail Nilov on Pexels, Pexels License. Cropped to 1200x630.
- Code on a monitor: photo by Nemuel Sereti on Pexels, Pexels License. Cropped.
- Smartphone and bank card: photo by Mikhail Nilov on Pexels, Pexels License. Cropped.


