Skip to main content

14.7.3 - Google Play Billing Library 8.0+ Features

· 2 min read
Hyo
React Native IAP Maintainer

14.7.3 syncs with OpenIAP v1.3.14 bringing Google Play Billing Library 8.0+ features and iOS WWDC 2025 enhancements.

New Features

Product Status (Android 8.0+)

Products now include a productStatusAndroid field indicating fetch results:

const products = await fetchProducts(['com.example.premium']);

products.forEach(product => {
switch (product.productStatusAndroid) {
case 'ok':
// Product fetched successfully
break;
case 'not-found':
// SKU doesn't exist in Play Console
break;
case 'no-offers-available':
// User not eligible for any offers
break;
}
});

Prior to Billing Library 8.0, products that couldn't be fetched were simply omitted. Now you can understand why a product wasn't available.

Suspended Subscriptions (Android 8.1+)

New includeSuspended option in getAvailablePurchases:

// Include suspended subscriptions in results
const purchases = await getAvailablePurchases({
android: {
includeSuspended: true,
},
});

purchases.forEach(purchase => {
if (purchase.isSuspendedAndroid) {
// Subscription is suspended due to payment issues
// DO NOT grant entitlements
// Direct user to subscription management
}
});

Suspended subscriptions have isSuspendedAndroid: true and should NOT be granted entitlements. Users should be directed to the subscription center to resolve payment issues.

Win-Back Offers (iOS 18+)

New support for win-back offers to re-engage churned subscribers:

import { requestSubscription } from 'react-native-iap';

await requestSubscription({
ios: {
sku: 'com.example.premium_monthly',
winBackOffer: {
offerId: 'win_back_50_percent',
},
},
});

JWS Promotional Offers (iOS 15+, WWDC 2025)

New simplified JWS format for promotional offers, back-deployed to iOS 15:

await requestSubscription({
ios: {
sku: 'com.example.premium_monthly',
promotionalOfferJWS: {
jws: 'eyJ...your-server-signed-jws...',
offerId: 'promo_summer_2025',
},
},
});

Introductory Offer Eligibility Override (iOS 15+)

Override system-determined eligibility for introductory offers:

await requestSubscription({
ios: {
sku: 'com.example.premium_monthly',
introductoryOfferEligibility: true, // Force eligibility
},
});

Sub-Response Codes (Android 8.0+)

More granular error information via SubResponseCodeAndroid:

  • payment-declined-due-to-insufficient-funds - Payment method has insufficient funds
  • user-ineligible - User not eligible for the offer
  • no-applicable-sub-response-code - No additional context available

Type Updates

  • SubscriptionOfferTypeIOS now includes 'win-back' variant
  • RequestPurchaseIosProps.withOffer clarified: only applies to subscriptions
  • BillingResultAndroid now includes optional subResponseCode

OpenIAP Versions

PackageVersion
openiap-gql1.3.14
openiap-google1.3.25
openiap-apple1.3.13

Installation

npm install react-native-iap react-native-nitro-modules

For detailed changes, see the OpenIAP Release Notes.

Questions or feedback? GitHub issues.