14.7.3 - Google Play Billing Library 8.0+ Features
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 fundsuser-ineligible- User not eligible for the offerno-applicable-sub-response-code- No additional context available
Type Updates
SubscriptionOfferTypeIOSnow includes'win-back'variantRequestPurchaseIosProps.withOfferclarified: only applies to subscriptionsBillingResultAndroidnow includes optionalsubResponseCode
OpenIAP Versions
| Package | Version |
|---|---|
| openiap-gql | 1.3.14 |
| openiap-google | 1.3.25 |
| openiap-apple | 1.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.
