In-app purchase facts: Apple, Google, SDKs, other stores¶
The source file behind monetization-in-app-purchase-setup. Checked 2026-10-01. "Unconfirmed" means no official page confirmed it. When you re-check something, update the line and the date.
1. Apple: StoreKit¶
StoreKit 2 vs original StoreKit
- The original In-App Purchase API is deprecated. StoreKit 2 needs iOS 15, macOS 12, tvOS 15, watchOS 8 or
visionOS 1. Apple says to use the original API only if your app still supports iOS 14 / macOS 11 or earlier
(choosing an API).
- SKPaymentQueue is marked deprecated in iOS 18 / macOS 15 (docs).
- App Store receipts and verifyReceipt are deprecated. Use the App Store Server API or signed Transaction /
AppTransaction data instead (docs).
No shutdown date has been published. It was announced at WWDC23.
- Only StoreKit 2 has StoreKit views, the refund request sheet, renewal status, intro-offer eligibility, the Manage
Subscriptions sheet and JWS transactions.
Key APIs
- Product.products(for:): IDs that
don't exist are silently dropped, so you get an empty list rather than an error.
- Transaction.updates: start listening at launch.
- Transaction.currentEntitlements:
covers non-consumables, active or grace-period subscriptions and non-renewing subscriptions. It never includes
consumables or refunded purchases.
- finish() ·
AppStore.sync() (restore) ·
VerificationResult (the JWS is verified on
the device; jwsRepresentation can also be verified on your server) ·
AppTransaction.
- Since iOS 18.2 a purchase needs a UI context. In SwiftUI, use the purchase environment action
(WWDC25 · 241).
- SwiftUI views StoreView, SubscriptionStoreView
and ProductView need iOS 17 / macOS 14.
SubscriptionOfferView needs iOS 26.
Recent changes
- WWDC25: SubscriptionOfferView, appTransactionID, offer codes for all product types, JWS-signed promotional
offers, and the Advanced Commerce API for very
large catalogs.
- Offer codes work for all IAP types. Promo codes for IAPs can't be created from 26 Mar 2026
(news).
- WWDC26: monthly subscriptions with a 12-month commitment (not available in the US or Singapore;
news), and Bundles and Suites in iOS 27
(news, session 210).
Product types (docs) - Consumable. - Non-consumable (can be Family Shared). - Auto-renewable subscription (can be Family Shared). Up to 100 per subscription group; a user has one active subscription per group. - Non-renewing subscription. Your app has to sync and restore it.
Offers
- Introductory:
one per subscription group per user.
- Promotional:
must be signed with a key.
- Win-back.
- Family Sharing:
up to 5 members. Once you turn it on for a product, you can't turn it off. Handle REVOKE.
Server
- App Store Server API: transaction info and history,
all subscription statuses, refund history, consumption info, notification history, test notification, extend
renewal date, look up order ID.
- Server Notifications V1 is deprecated.
New apps can't choose V1 (TN3180).
- App Store Server Library
in Swift, Java, Python and Node: an API client, verifyAndDecodeTransaction and verifyAndDecodeRenewalInfo,
receipt migration, and offer signing.
- The In-App Purchase key
lives in App Store Connect → Users and Access → Integrations. You can download it only once. Never put it in
the app or in a repo.
- Apple doesn't require a server. On-device VerificationResult + currentEntitlements works without one.
Apple recommends a server for subscriptions
(receipt validation).
Testing
- StoreKit Testing in Xcode:
uses a local .storekit file, needs no App Store Connect setup, and runs in the Simulator or on a device
(Developer Mode on iOS 16+).
- Sandbox: needs the
Paid Apps Agreement. Product changes can take up to 1 hour to show up.
Renewal rate:
1 month = 5 min by default (adjustable), up to 12 renewals.
- TestFlight:
renews once a day, up to 6 times.
App Store Connect and App Review - Sign the Paid Apps Agreement first, then tax forms, then banking. - The first IAP of each type goes out with a new app version. - Each IAP needs a review screenshot. - Guidelines: - 2.1: IAPs must be complete and visible to the reviewer. - 3.1.1: use IAP for digital unlocks, and provide a restore mechanism. - 3.1.2: subscriptions last at least 7 days and work on all the user's devices. - 3.1.2(c): describe clearly what the user gets for the price. - The exact wording about Terms and Privacy links is unconfirmed. Include both links anyway. - US storefront external purchase links have been allowed since 1 May 2025 (news). - Mac: IAP works in the Mac App Store and isn't available with Developer ID distribution.
2. Google Play Billing¶
Play Billing Library (release notes)
- 9.1.0 (18 Jun 2026): Billing Choice APIs.
- 9.0.0 (19 May 2026): targetSdk 35; BILLING_UNAVAILABLE when the Play Store is blocked.
- 8.3.0 (Dec 2025): external payments APIs.
- 8.1.0 (Nov 2025): suspended subscriptions, KEEP_EXISTING, minSdk 23.
- 8.0.0 (30 Jun 2025): multiple purchase options and offers for one-time products, enableAutoServiceReconnection(),
and "in-app items" renamed to "one-time products".
Deprecation (FAQ): each version is supported for 2 years. New apps and updates must be on at least:
| Version | Required from | Extension until |
|---|---|---|
| PBL 8 | 31 Aug 2026 | 1 Nov 2026 |
| PBL 9 | 31 Aug 2027 | 1 Nov 2027 |
| PBL 10 | 31 Aug 2028 | 1 Nov 2028 |
Integration (guide)
- Artifacts: billing / billing-ktx.
- Client setup: enablePendingPurchases(PendingPurchasesParams…enableOneTimeProducts()) and
enableAutoServiceReconnection().
- Calls: queryProductDetailsAsync, launchBillingFlow, queryPurchasesAsync. querySkuDetailsAsync doesn't work
with multiple offers.
- Acknowledge non-consumables and subscriptions within 3 days, or they're refunded automatically. Consume
consumables. Grant access only in the PURCHASED state.
Products - One-time products: consumable or non-consumable. PBL 8+ adds purchase options and offers: Buy / Rent, Discount, Pre-order. - Subscriptions: a base plan (auto-renewing, prepaid, or installment in BR/FR/IT/ES) plus offers (free trial, intro price), with replacement modes for upgrades.
Server
- Security: verify the purchaseToken on your server
before granting access.
- Endpoints: purchases.products.get and
purchases.subscriptionsv2.get.
Access is through a service account with "View financial data"
(setup).
- RTDN setup:
1. Create a Pub/Sub topic.
2. Grant google-play-developer-notifications@system.gserviceaccount.com the Publisher role on it.
3. Enter the topic in Play Console → Monetize → Monetization setup, then send a test message.
4. Notifications only tell you something changed. Call the API for the details.
- Voided Purchases API: covers the last 30 days only.
Testing (test guide) - License testers aren't charged. Test cards cover approve, decline, slow approve/decline, and chargeback. - A build with PBL must be on a track (internal is fine) before you can create products. - Test renewal times: a 1-week or 1-month period renews every 5 min, a 1-year period every 30 min. At most 6 renewals. - Play Billing Lab app: change country, reset trials, test price changes.
Policy
- Payments policy: digital goods go through
Play Billing. Physical goods don't.
- US changes after Epic v. Google:
alternative billing and external content links programs since Dec 2025. The fee rates are unconfirmed.
API docs: alternative,
external links.
EEA and other regions: user choice / external offers.
- Subscriptions policy: state the price,
billing frequency and auto-renewal clearly, make cancellation easy, and link to
https://play.google.com/store/account/subscriptions?sku=…&package=….
- Service fees:
- Most markets: 15% on the first $1M if you're enrolled; subscriptions 15%.
- EEA, UK and US (from 30 Jun 2026) and AU and JP (from 30 Sep 2026): a new structure, for example 10% + 5%
billing fee for new installs on the first $1M. Read that page before you calculate.
3. Subscription SDKs¶
| SDK | Free tier → paid | Notes | Source |
|---|---|---|---|
| RevenueCat | ≤ $2,500/mo tracked revenue, then 1% | Entitlements, webhooks, paywalls, experiments, Web Billing (Stripe), Paddle integration. SDKs: iOS, Android, RN, Expo, Flutter, KMP, Cordova, Capacitor, Unity, Web | pricing, install |
| Adapty | < $5K/mo, then 1% | Paywall builder, A/B tests, web payments via Stripe/Paddle. iOS, Android, RN, Flutter, Unity, KMP, Capacitor | pricing, docs |
| Qonversion | ≤ $7K/mo, then 0.8% of total | Paywall builder, experiments, Web SDK + Stripe. iOS, Android, Flutter, RN, Unity, Cordova, Capacitor | pricing |
| Superwall | Backend free at any scale; paywalls free up to $10K/mo paywall revenue, then 1% of that | Own StoreKit 2 / Play Billing purchase APIs, entitlements from ASSN V2 + RTDN, web checkout with Stripe | pricing, docs |
| Apphud | Pricing page text contradicts itself; check it live | Webhooks only on higher plans | pricing |
| Purchasely · Nami ML | Sales / enterprise only | — | Purchasely, Nami |
| Glassfy | Shut down end of 2024 | Repo archived | GitHub |
4. Free libraries by framework (versions checked 2026-10-01)¶
| Stack | Library | Version | Notes |
|---|---|---|---|
| Flutter | in_app_purchase (official) | 3.3.1 | StoreKit 2 by default. No backend, so validation is up to you |
| Flutter | flutter_inapp_purchase | 10.7.2 | StoreKit 2 + PBL 9.1, iOS 15+ |
| Flutter | purchases_flutter (RevenueCat) | 10.13.2 | |
| React Native | react-native-iap | 16.7.2 | Nitro modules, OpenIAP |
| Expo | expo-iap | 5.8.2 | Needs a dev build. Expo Go isn't supported |
| RN / Expo | react-native-purchases (RevenueCat) | 10.10.2 | UI in react-native-purchases-ui |
| Capacitor / Cordova | cordova-plugin-purchase | 13.18.0 | StoreKit 2 through the cordova-plugin-purchase-storekit2 add-on |
| Capacitor | @revenuecat/purchases-capacitor | 13.6.1 | |
| Capacitor | @capgo/native-purchases | 8.8.1 | StoreKit 2 + PBL 7.x. Check PBL 8 support before you ship |
| Unity | Unity IAP | 5.4.3 | StoreKit 2; PBL 9.0.0 |
| KMP | purchases-kmp (RevenueCat) | 3.10.1 | Adapty and Superwall also have KMP SDKs |
5. Other stores¶
| Store | Commission | API | Source |
|---|---|---|---|
| Microsoft Store | 12% games, 15% apps. Non-game apps may use their own commerce and keep 100% | Store APIs (Windows.Services.Store, not confirmed on the fetched page) |
MS Learn |
| Steam | 30% / 25% / 20% tiers. Thresholds for microtransactions unconfirmed | Steamworks Microtransactions, ISteamMicroTxn |
docs, announcement |
| Meta Quest | Set in the revenue-share agreement (unconfirmed publicly) | Platform SDK IAP, S2S Add-on APIs | docs |