14.7.7 - ExternalPurchaseCustomLink API (iOS 18.1+)
react-native-iap 14.7.7 adds support for Apple's ExternalPurchaseCustomLink API (iOS 18.1+) for apps using custom external purchase links.
react-native-iap 14.7.7 adds support for Apple's ExternalPurchaseCustomLink API (iOS 18.1+) for apps using custom external purchase links.
This release simplifies field naming in Android input types (RequestPurchaseAndroidProps and RequestSubscriptionAndroidProps). Since these types are already Android-specific, their fields no longer need the Android suffix.
Fields inside platform-specific input types no longer require the platform suffix. The parent type name already indicates the platform context.
Why this change?
When you write google: { offerToken: "..." }, the google key already tells you this is Android-specific. Adding Android suffix to fields inside is redundant:
// Redundant - we know it's Android from the parent
google: { offerTokenAndroid: "..." }
// Cleaner - parent context is sufficient
google: { offerToken: "..." }
| Old Name (v14.7.3) | New Name (v14.7.4) |
|---|---|
obfuscatedAccountIdAndroid | obfuscatedAccountId |
obfuscatedProfileIdAndroid | obfuscatedProfileId |
purchaseTokenAndroid | purchaseToken |
replacementModeAndroid | replacementMode |
Before (v14.7.3):
await requestPurchase({
request: {
google: {
skus: ['subscription_id'],
subscriptionOffers: [{sku: 'subscription_id', offerToken: 'token'}],
purchaseTokenAndroid: currentPurchaseToken,
replacementModeAndroid: 1,
obfuscatedAccountIdAndroid: 'user_123',
},
},
type: 'subs',
});
After (v14.7.4):
await requestPurchase({
request: {
google: {
skus: ['subscription_id'],
subscriptionOffers: [{sku: 'subscription_id', offerToken: 'token'}],
purchaseToken: currentPurchaseToken,
replacementMode: 1,
obfuscatedAccountId: 'user_123',
},
},
type: 'subs',
});
The suffix removal only applies to input types (request parameters). Response types still use suffixes because they're cross-platform:
// Response fields KEEP the Android suffix
const purchase = purchases[0] as PurchaseAndroid;
// These response fields still have Android suffix
console.log(purchase.purchaseTokenAndroid); // Keep suffix
console.log(purchase.obfuscatedAccountIdAndroid); // Keep suffix
// But input fields don't need it anymore
await requestPurchase({
request: {
google: {
skus: [product.id],
obfuscatedAccountId: 'user_123', // Input: no suffix
},
},
type: 'in-app',
});
This release adds support for discount offers on one-time (in-app) purchases:
import {fetchProducts, requestPurchase} from 'react-native-iap';
import type {ProductAndroid} from 'react-native-iap';
// 1. Fetch products with discount offers
const products = await fetchProducts({
skus: ['premium_upgrade'],
type: 'in-app',
});
const product = products[0] as ProductAndroid;
// 2. Get the discount offer
const discountOffer = product.discountOffers?.[0];
// 3. Purchase with the discount
if (discountOffer?.offerTokenAndroid) {
await requestPurchase({
request: {
google: {
skus: [product.id],
offerToken: discountOffer.offerTokenAndroid, // Use simplified input field
},
},
type: 'in-app',
});
}
| Field Location | Suffix Required? | Example |
|---|---|---|
Inside RequestPurchaseAndroidProps | NO | offerToken |
Inside RequestSubscriptionAndroidProps | NO | purchaseToken |
| Cross-platform response type | YES | PurchaseAndroid.purchaseTokenAndroid |
| Package | Version |
|---|---|
| openiap-gql | 1.3.15 |
| openiap-google | 1.3.26 |
| openiap-apple | 1.3.13 |
For detailed changes, see the OpenIAP Release Notes.
14.7.3 syncs with OpenIAP v1.3.14 bringing Google Play Billing Library 8.0+ features and iOS WWDC 2025 enhancements.
14.7.0 reflects OpenIAP v1.3.11 updates with breaking changes that simplify the API surface.
14.6.4 adds support for the External Payments program introduced in Google Play Billing Library 8.3.0. This new feature enables developers to offer a side-by-side choice between Google Play Billing and their external payment option directly in the purchase flow.
14.6.3 brings advancedCommerceData support for iOS attribution tracking using StoreKit 2's Product.PurchaseOption.custom, along with updated platform field naming conventions and improved type safety for Billing Programs API.
React Native IAP 14.6.0 brings the new Billing Programs API from Google Play Billing Library 8.2.0+, allowing developers to use External Content Links and External Offers. This release also includes full support for one-time product discounts from Billing Library 7.0+ and new purchase status fields from Billing Library 8.1.0+.

React Native IAP 14.5.0 brings built-in purchase verification (aka receipt validation) powered by IAPKit. Now you can verify purchases with enterprise-grade backend validation using a single API call—no server setup required.

React Native IAP 14.4.33 introduces Horizon OS support for Meta Quest devices, enabling developers to implement in-app purchases in VR applications using the same familiar API.
This release integrates Meta's Platform SDK for in-app purchases on Horizon OS, while maintaining the unified OpenIAP interface across iOS, Android, and now Horizon OS.

React Native IAP 14.4.12 introduces comprehensive alternative billing support for both iOS and Android platforms, empowering developers to use external payment systems alongside or instead of platform billing—unlocking reduced fees and greater monetization flexibility.