On this page · 10 sections
- What Google has published, and the dates that matter
- Step one: find out which PBL version you actually ship
- What breaks between PBL 8 and PBL 9
- Extra work if you are still on PBL 7
- New in 9.x that is worth adopting
- Testing with licence testers and Play Billing Lab
- A dated rollout plan
- India notes: UPI, user choice billing and what the docs do not say
- How eCorpIT can help
- References
Summary. Google's version deprecation FAQ, last updated on 23 October 2026, sets 31 August 2027 as the deadline by which new apps and app updates must move off Play Billing Library (PBL) 8, with an extension to 1 November 2027 available in Play Console. Each version gets two years, so PBL 9 stays accepted until 31 August 2028. The previous round has closed: the PBL 7 extension ended on 1 November 2026, so an app still on 7 cannot ship an update today. PBL 9.0.0 shipped on 19 May 2026 and 9.1.0, still the latest release on 7 November 2026, on 18 June 2026. For an app already on 8, the move is mostly deleting SKU-era classes such as SkuDetails, BillingClient.SkuType and QueryPurchaseHistoryParams, plus two behaviour changes: a Play Store blocked by the system now returns BILLING_UNAVAILABLE (code 3) instead of ERROR (code 6), and getLinkUri() for external payments can return null. Teams coming from 7 also take on PBL 8's new product details callback and its minSdk 23 floor. Licence testers see monthly subscriptions renew every 5 minutes, up to six times, so renewal testing takes hours, not months. Our recommendation: ship PBL 9 to production by May 2027.
About this article. For Android teams whose apps sell one-time products or subscriptions through Google Play. We checked every date, API name and test figure on 7 November 2026 against Google's Android Developers pages (the deprecation FAQ, release notes, PBL 9 migration guide, error-handling and testing guides, each last updated 23 October 2026), Google's Maven repository and Play Console Help pages. This is not legal or financial advice, and Google can publish new releases or change programme terms, so re-check the deprecation FAQ before you plan a final release; no vendor paid for inclusion. Researched with AI assistance and reviewed by our editorial team.
What Google has published, and the dates that matter
Google keeps the schedule on one page, the version deprecation FAQ. Every library version has a two-year deprecation cycle, which Google announced at Google I/O 2019 and repeated in its 11 June 2020 blog post introducing version 3. The table below follows Google's, as it stood on 7 November 2026. Our guide to the 2026 PBL 8 deadline covers the round that has just closed.
| PBL version | New app and update deadline | Extension deadline | Position on 7 November 2026 |
|---|---|---|---|
| 5 | 31 August 2024 | 1 November 2024 | Not accepted for uploads |
| 6 | 31 August 2025 | 1 November 2025 | Not accepted for uploads |
| 7 | 31 August 2026 | 1 November 2026 | Not accepted; extension ended 1 November 2026 |
| 8 | 31 August 2027 | 1 November 2027 | Accepted until the deadline |
| 9 | 31 August 2028 | 1 November 2028 | Current line; latest release 9.1.0 |
Four rules sit underneath the table.
- The rule bites on upload, not on live installs. Google says unmaintained APKs need no update and existing apps keep working; only new apps and updates must use a supported version. A live app on PBL 8 keeps selling after 31 August 2027. The trouble starts when you need to ship any update, including an urgent security fix.
- Only billing apps are in scope. The dependency appears only in APKs that require the
com.android.vending.BILLINGpermission.
- The extension is a form, not a setting. An app on an unsupported version gets a warning in Play Console, and the extension form sits on that warning's details page under Policy status. It buys distribution time to 1 November; it does not change the requirement.
- False warnings have a known cause. If you upgraded and still see a warning, Google says to check that your manifest contains
com.google.android.play.billingclient.version, because manifest merging can strip it.
The same month will probably bring a second forced change. Play's target API deadline fell on 31 August in both 2025 and 2026, and the Play Console Help page had no 2027 row on 7 November 2026. Google did say in a February 2026 blog post that Play will require API level 37 for new apps and updates in August 2027. Our target API 37 checklist tracks that round. Two mandatory changes in one release window is the real risk, which is why the plan below ships billing first.
Step one: find out which PBL version you actually ship
Google's first instruction is to check build.gradle. In practice the version can sit in three places.
- A direct dependency on
com.android.billingclient:billingorbilling-ktx.
- A transitive dependency from a cross-platform plugin or a subscription SDK. If a wrapper pins PBL 8, your upgrade waits on its release, so check its changelog now rather than in July.
- The merged manifest, which carries the version metadata Play reads. Inspect it in Android Studio's merged manifest view before every release candidate.
A dependency report finds transitive copies (swap in your own module and variant names):
./gradlew :app:dependencies --configuration releaseRuntimeClasspath | grep billingclient
Google's migration guide pins the target at 9.1.0, and the KTX module adds Kotlin extensions and coroutines support:
dependencies {
val billingVersion = "9.1.0"
implementation("com.android.billingclient:billing:$billingVersion")
// Kotlin extensions and coroutines:
implementation("com.android.billingclient:billing-ktx:$billingVersion")
}
Google also publishes an Android skill for agent-assisted upgrades. Running android skills add play-billing-library-version-upgrade in the Android CLI installs it, and Google says it detects outdated method calls and recommends replacements. Review every change it proposes: in billing code, a silent behaviour change costs revenue.
What breaks between PBL 8 and PBL 9
PBL 8 removed the old SKU query methods but kept several SKU-era classes as deprecated leftovers; PBL 9 removes them. The table follows Google's 8-to-9 list.
| Removed in PBL 9 (upgrading from 8) | Use instead |
|---|---|
| BillingClient.SkuType | BillingClient.ProductType; Google says INAPP and SUBS work much like the old constants |
| SkuDetails | ProductDetails, the data model that supports one-time products |
| SkuDetailsParams | QueryProductDetailsParams with queryProductDetailsAsync() |
| SkuDetailsResponseListener | ProductDetailsResponseListener with queryProductDetailsAsync() |
| QueryPurchaseHistoryParams | queryPurchasesAsync() for active or pending purchases; your backend for consumed purchases; the server-side Voided Purchases API for cancelled or voided ones |
| getSkuDetailsList() and setSkuDetailsList() | BillingFlowParams.Builder.setProductDetailsParamsList() |
One documentation quirk: Google's 8-to-9 table names queryProductDetailsAsync() as the replacement for active or pending purchases, while its 7-to-9 table and its purchase history page name queryPurchasesAsync(). The second is the method that returns purchases, so use it. If you used purchase history to decide free-trial eligibility, Google now points you to ProductDetails.getSubscriptionOfferDetails(), which returns only the offers the user is eligible for.
Release 9.0.0, dated 19 May 2026, adds four behaviour changes.
- Blocked Play Store errors move. When the system blocks the Play Store app, for example in an OEM-customised kids mode, the response changes from
ERRORtoBILLING_UNAVAILABLE, with a debug message saying the store is blocked. This needs AndroidX Core 1.9 or later. Google's error guide treatsERRORas worth retrying with exponential backoff, but says automatic retries are unlikely to help withBILLING_UNAVAILABLE. A retry loop keyed toERRORwill stop firing for these users, so show a clear message and a manual retry instead.
- External payment links can be null. If you run an external payments integration,
DeveloperProvidedBillingDetails.getLinkUri()is now@Nullable. Handle both null and an empty string before you build a browser intent.
- The library itself now targets SDK 35. This does not set your app's target.
- In-app messaging covers opt-in price increases. Users can confirm an opt-in price increase inside your app. Google shows the message from the first day the user can accept it, at most once every 7 days.
Google's PBL 9 guide also lists the launchBillingFlow() sub-response codes as a migration step, although the release notes date them to 8.0.0, so an app already on 8 may have them wired up.
None of this changes acknowledgement. Since PBL 2.0, a purchase must be acknowledged within three days, or the user is refunded and Google revokes it. Prepaid plans shorter than a week must be acknowledged within half the plan duration.
Extra work if you are still on PBL 7
If your app missed the 2026 round, it cannot ship any update until it moves to a supported version. Google's guide covers 7-to-9 in one step, and that path also carries every PBL 8 change. These are the ones that cause build failures or behaviour shifts, taken from the release notes.
| Release | Change you must handle |
|---|---|
| 8.0.0 (30 June 2025) | onProductDetailsResponse() now receives a QueryProductDetailsResult, and unfetched products come back with a product-level status code instead of disappearing |
| 8.0.0 | queryPurchaseHistory(), querySkuDetailsAsync(), the no-argument enablePendingPurchases() and the queryPurchasesAsync(String skuType, ...) overload removed |
| 8.0.0 | launchBillingFlow() results gain sub-response codes: PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS, USER_INELIGIBLE and NO_APPLICABLE_SUB_RESPONSE_CODE |
| 8.1.0 (6 November 2025) | minSdkVersion raised to 23, so an app that still supports Android 5.x must raise its own floor |
| 8.1.0 | A new queryPurchasesAsync() parameter can include suspended subscriptions, flagged by isSuspended(); do not grant access, send the user to the subscriptions centre |
| 8.1.0 | SubscriptionProductReplacementParams adds product-level replacement with a new KEEP_EXISTING mode; setSubscriptionReplacementMode() is due to be deprecated |
| 8.2.0 (9 December 2025) | The original external offers APIs, such as enableExternalOffer(), are deprecated; enableBillingProgram() sets up the newer programmes |
| 8.3.0 (23 December 2025) | External payments APIs added; a user who abandons an external payment now produces USER_CANCELED instead of ERROR |
Two of these need product attention, not just code review: a message for payments declined for insufficient funds, and a screen that sends suspended subscribers to Play's subscriptions centre. Google also recommends enableAutoServiceReconnection(), added in 8.0.0, which reconnects to the billing service when a call arrives while it is disconnected.
New in 9.x that is worth adopting
Release 9.1.0 on 18 June 2026 added Billing Choice APIs: getBillingChoiceInfoAsync() returns the billing choices available to a user, including image URLs and loyalty information, and showBillingProgramInformationDialog() shows a programme's information dialog. These matter only if you enrol in one of Google's billing choice programmes.
Google's guide lists two optional changes for teams already moving.
- Pending purchases for prepaid plans. These need PBL 7.0 or later and must be enabled explicitly. The subscription starts in
SUBSCRIPTION_STATE_PENDING, and you grant access only once the transaction completes.
- Instalment subscriptions. Google lists these in Brazil, France, Italy and Spain only, so most Indian apps can skip them.
Testing with licence testers and Play Billing Lab
Testing takes most of the calendar time, and Google's testing guide offers ways to compress it. Licence testers get test payment methods that never charge real money: cards that always approve or always decline, slow cards that approve or decline after a few minutes to simulate pending transactions, and a card that approves and then charges back.
Subscriptions bought by licence testers run on an accelerated clock, according to the same guide.
| Production period or state | Test duration |
|---|---|
| 1 week | 5 minutes |
| 1 month | 5 minutes |
| 3 months | 10 minutes |
| 6 months | 15 minutes |
| 1 year | 30 minutes |
| Free trial | 3 minutes |
| Grace period | 5 minutes |
| Account hold | 10 minutes |
Test subscriptions renew at most six times, not counting free trials and introductory periods. Google warns the times are approximate, so call the API after each expiry instead of trusting a timer. The guide's text says unacknowledged licence-tester purchases are refunded after 3 minutes, while its table of shortened periods lists 5 minutes for acknowledgement. Either way, acknowledgement bugs show up in the first test session rather than three days into production.
Google's Play Billing Lab app adds controls the console lacks. It can accelerate subscription state changes, move a test subscription into grace period or account hold in one step, and test out-of-app purchases against your backend. Testing with real payment methods is also possible, but only after Google enables it through your Play business development contact. Its Response Simulator forces specific BillingResult codes. It needs PBL 7.1.1 or later and a billing-overrides flag in your manifest, which Google suggests pairing with a non-production tag so the flag never reaches a production build.
Three practical limits apply. Draft apps and internal test track releases have spend limits on daily transactions, per-order value and daily total spend, reset every 24 hours. Promo codes are capped at 500 per quarter across all managed products in an app. Google also recommends occasional tests from non-licence accounts, so your app does not depend on test-only behaviour such as renewal timing.
A minimum PBL 9 test matrix covers the following.
- A new purchase of each one-time product and each subscription base plan, acknowledged inside the test window.
- A declined card, so the sub-response codes reach the right message.
- A slow card that approves and one that declines, to exercise pending states.
- Six accelerated renewals, then a cancellation, a grace period and an account hold through Play Billing Lab.
- An upgrade, a downgrade and, if you use it, the
KEEP_EXISTINGreplacement mode.
- A restore on a fresh install using
queryPurchasesAsync(), now that the purchase history APIs are gone.
- A device or profile where the Play Store is blocked, to confirm the
BILLING_UNAVAILABLEpath.
- A chargeback through the test card, checked against your entitlement revocation.
A dated rollout plan
Working back from 31 August 2027, this schedule leaves room for a late wrapper release and a target API change in the same summer.
| When | Milestone | Exit check |
|---|---|---|
| November to December 2026 | Inventory every app with the billing permission; record direct and transitive PBL versions | Spreadsheet of apps, current PBL version and wrapper owner |
| January 2027 | Code changes on a branch: removed classes, error handling, nullability | Clean build on 9.1.0 or later with no deprecated billing calls |
| February 2027 | Internal test track with licence testers; run the eight-case matrix | All cases pass; Play Billing Lab state changes verified |
| March 2027 | Closed testing with real users on non-licence accounts | No rise in failed purchases or support tickets |
| April 2027 | Staged production rollout, starting small | Purchase success and refund rates match the PBL 8 baseline |
| May 2027 | Full rollout | Policy status page shows no billing warning |
| June to July 2027 | Buffer, and room for target API work | Next release ships without billing changes |
| 31 August 2027 | PBL 8 no longer accepted for new apps and updates | Nothing left to do |
| 1 November 2027 | Last date covered by an extension | Use only if a dependency blocked you |
Before widening the rollout, compare purchase success, pending-to-purchased conversion and refund rates between the old and new versions. Real-time developer notifications and the Voided Purchases API should already drive entitlements, because the client no longer has a purchase history call to fall back on.
Billing is not the only Google clock running into 2027. Developer verification protections began in select regions on 30 September 2026, and Google plans to expand verification globally in 2027. If you also distribute APKs outside Play, our guide to Android developer verification in 2027 covers that separate timeline.
India notes: UPI, user choice billing and what the docs do not say
Google Play's help page on accepted payment methods in India, checked on 7 November 2026, lists Visa and Mastercard cards, RuPay cards for one-off purchases only, Play balance and UPI. Play accepts UPI from all providers, including for subscriptions, with recurring payments through UPI AutoPay mandates. Netbanking has been discontinued on Play since October 2025. None of this changes between PBL 8 and 9, because payment methods live in Play's purchase screen, not your code. If many Indian subscribers pay through UPI AutoPay, test renewals, grace periods and account holds thoroughly, since mandate problems surface there.
Google's billing developer documentation does not describe UPI-specific behaviour in PBL 9, and we found no Google page saying UPI purchases arrive as pending transactions. Build for pending purchases anyway, using the slow test cards, because your entitlement logic should not assume every purchase completes instantly.
User choice billing in India. Google lets developers offer an alternative billing system alongside Google Play's for mobile and tablet users in India, and cuts its service fee by 4% when a user pays through the alternative system. For what the wider 2026 fee changes mean for margins, see our breakdown of what your app pays on Google Play in 2026. The programme's main conditions are these.
- Integrate the alternative billing APIs, which need PBL 5.2 or later for the user choice flow, so a PBL 9 app qualifies.
- Certify PCI DSS compliance and give users a way to report fraudulent transactions.
- Report every authorised transaction from Indian users to Google within 24 hours through the APIs.
- Prices may differ between the two billing systems.
- Web-based payments in an embedded WebView are allowed, subject to the same requirements and service fee.
Google lists India's alternative billing APIs as available since 14 November 2023, with no date yet set for ending manual reporting; manual reporters file monthly, by the fifth business day. If you run user choice billing, add the choice screen and transaction reporting to the PBL 9 test matrix, because the APIs that show that screen ship in the library you are replacing.
How eCorpIT can help
eCorpIT is a Gurugram-based technology organisation, founded in 2021, assessed at CMMI Level 5 and MSME certified, with senior-led engineering teams working across AWS, Microsoft and Google platforms. Our app subscription billing and monetisation service runs Play Billing Library upgrades from the dependency and wrapper audit through the PBL 9 code changes and licence-tester test plan to a staged rollout measured against your purchase and refund baseline. Talk to us at /contact-us/.
Last updated: 7 November 2026.