StoreKit

RSS for tag

Support in-app purchases and interactions with the App Store using StoreKit.

StoreKit Documentation

Posts under StoreKit subtopic

Post

Replies

Boosts

Views

Activity

Refund requests failing in production
We offer an in-app way for customers to request an Apple refund for an auto-renewable subscription using StoreKit2. Everything worked during testing and verification in the Sandbox and TestFlight phases, but now consistently fails in Production. We present the refund sheet on a button press: .refundRequestSheet(for: transactionID, isPresented: $isPresenting) { result in switch result { case .success(let status): // .success / .userCancelled handled here case .failure(let error): // -> .failed for every user } } We log the outcome of all the requests, success and cancel behaves as expected. Since RefundRequestError only has .duplicateRequest .failed and the localizedDescription is generic, we don't know why it is failing. We have already checked that the transaction are for verified, not revoked, non-upgraded and active subscriptions. The issue only happens in Production. Is there any way to get more information about why a refund request fails or what other configuration needs to verified for this to work? Is there an eligibility window or other non-specified limit that might result in these errors?
1
0
609
Jul ’26
SKPaymentQueue.restoreCompletedTransactions returns 0 transactions for auto-renewable subscriptions on iOS 26.4
Is anybody else seeing this? Since iOS 26.4, calling SKPaymentQueue.restoreCompletedTransactions() no longer returns any transactions for active auto-renewable subscriptions. The success callback is invoked correctly, but the transactions array is empty. The same device and the same Apple ID return the expected transactions on iOS 26.3.1 and earlier. Environment Affected: iOS 26.4.x (confirmed on 26.4.2) Working: iOS 26.3.1 and earlier Product type: Auto-renewable subscriptions Deployment target: iOS 14.0 Steps to reproduce Have an active auto-renewable subscription on an Apple ID (sandbox or production) Run on a device with iOS 26.4 or later Call SKPaymentQueue.default().restoreCompletedTransactions() (or the equivalent via a wrapper such as RMStore) Observe the paymentQueueRestoreCompletedTransactionsFinished delegate callback Expected behaviour The delegate receives the restored transactions via paymentQueue(_:updatedTransactions:) before paymentQueueRestoreCompletedTransactionsFinished is called, as documented. Actual behaviour paymentQueueRestoreCompletedTransactionsFinished is called immediately with no prior transaction updates. The transactions array is empty.
1
1
546
Jul ’26
App Subscription "Confirm with Apple Device" UI
My tvOS app includes the purchase of subscriptions, and I am updating the code with Storekit 2.0. I have seen other apps that present the "Confirm with Apple Device" UI upon selection of a product, but for me I only ever see an alert confirming the purchase. I have tested this using Xcode storekit data and a sandbox account. I have also attempted using Storekit views and passing the UIWindowScene to the purchase(confirmIn: ) parameter, but neither made any difference. Is there some limitation that prevents that UI from showing in debug builds?
1
0
747
Jul ’26
Production StoreKit silently omits one approved auto-renewable subscription product — sandbox returns it correctly, sudden onset 2026-05-09
Hi all, Reporting an active production issue in case anyone else is seeing the same pattern, or has insight into what could cause this. Symptom As of 2026-05-09 morning, one specific auto-renewable subscription product is silently absent from Production StoreKit responses on our live App Store build. The product is still 'Approved' in App Store Connect, all metadata is intact, no error code is returned — the product simply does not appear in the products array. The other 3 products in the same subscription group continue to work normally. 100% of production users are affected. Setup App: live on App Store, version 1.0.0 (build 8) Subscription group with 4 auto-renewable products: standard_monthly_799 ✅ returns correctly standard_annual_6999 ✅ returns correctly unlimited_monthly_1299 ❌ MISSING from production response unlimited_annual_9999 ✅ returns correctly SDK: purchases_flutter (RevenueCat) → StoreKit Same physical device, same code, same RC config behaves correctly in Sandbox — all 4 products are returned and a sandbox purchase of unlimited_monthly_1299 succeeds. Timeline 2026-05-08: working correctly, purchases succeeding normally 2026-05-09 morning: product silently disappears from production StoreKit responses No app update was submitted between those dates No App Store Connect changes were made Onset was simultaneous across all production users at one timestamp What I've verified App Store Connect: Product status: Approved All territories enabled, all prices configured (no N/A in any territory) Subscription group correctly contains all 4 products No 'Submit for Review' pending changes Product attached to live app version 1.0.0 (8) Tax category: Match to parent app Family Sharing: Off (consistent with the working products) Paid Applications Agreement: Status: Active Banking and Tax forms: Active RevenueCat dashboard: All 4 products show Store Status: Approved Default offering contains all 4 packages iOS attachment for the affected product is intact No warnings or sync errors Sandbox StoreKit (today): flutter run (debug) on physical device → all 4 products returned flutter run --release on physical device → all 4 products returned Sandbox purchase of unlimited_monthly_1299 succeeds Production StoreKit (today, broken): App Store-downloaded 1.0.0 (8) on multiple users' devices Multiple Apple IDs / multiple devices / multiple regions — all reproduce Only unlimited_monthly_1299 affected; other 3 products fine Why this looks server-side Sudden simultaneous onset across all users No code or config change preceded onset Sandbox unaffected, only Production affected Single product affected, not the whole subscription group or app No error returned — silent omission only Cannot reproduce with locally signed builds, only with App Store-distributed binary This pattern is consistent with a server-side product indexing or fronting issue specific to one product in Production StoreKit. As a developer I don't have visibility into Apple's product-serving infrastructure to investigate further — looking for guidance from anyone who has seen this before. Questions for the community Has anyone else seen a single auto-renewable subscription silently drop out of Production StoreKit responses while remaining Approved in ASC, with no error code returned? Is there any internal product-state flag (beyond what's exposed in the ASC UI) that could cause Production StoreKit to silently omit a product? Anything similar to a hidden 'review hold' or 'price tier reconciliation' state? Has the asymmetry between RevenueCat package identifiers (Standard uses RC's $rc_monthly/$rc_annual default identifiers, Premium uses custom premium_monthly/premium_annual identifiers) ever been implicated in this kind of failure? RC support has been notified, but worth asking publicly. For anyone who has resolved a similar issue: what action ended up clearing it — ASC re-save, RC re-sync, Apple Support escalation, or did it self-resolve after Apple-side cache propagation? Filings in progress ASC Contact Us ticket: filed Apple DTS technical incident: filed RevenueCat support ticket: filed Feedback Assistant report: in progress Will update this thread with the resolution path once we have one. Thanks, — Kin Pong Lo (developer, Alice: AI English Tutor)
1
0
860
Jul ’26
Guideline 3.1.1 – Consumable IAPs rejected after binary approved; asked for “new binary” though 1.8 already submitted
Hi, We received App Review feedback under Guideline 3.1.1 for our in-app purchases, and we’d appreciate guidance on the expected next step. What we submitted; We created and completed metadata for the new consumable IAPs (pricing, availability, review screenshots, localizations). We uploaded and submitted app version 1.8 with a recent binary (build processed/VALID in App Store Connect). We also submitted the consumable IAPs for review. Outcome: App version 1.8 was approved (currently Pending Developer Release). The consumable IAPs were returned with Developer Action Needed. Our confusion We already uploaded/submitted a new binary (1.8) for this release, and the consumable purchase flows are implemented in that binary (Store / offers). The app binary itself was approved, but the consumable IAPs were rejected with a request for another new binary. For a first-time expansion from Non-Consumable-only to Consumables, is a separate / subsequent binary submission always required even if the approved version already contains the purchase UI?
1
0
290
Jul ’26
AppStore.ageRatingCode always returns 0 on real device — is this expected behavior?
Hello everyone I'm implementing age verification in my app to comply with upcoming age assurance laws (Utah, etc.), and I'm using AppStore.ageRatingCode from StoreKit to retrieve my app's current age rating. According to the documentation: extension AppStore { @available(iOS 26.2, macOS 26.2, tvOS 26.2, watchOS 26.2, *) public static var ageRatingCode: Int? { get async } } "Use this property to fetch the age rating for your app and compare it with the last known age rating to check if it has changed." However, calling this always returns 0 in my environment. Environment: Device: Real physical device (not simulator) iOS version: 26.4 Sandbox Apple Account: signed in via Settings → Developer → Sandbox Apple Account App Store Connect: app is registered and age rating is configured Xcode Scheme → Run → Options → StoreKit Configuration: None Code: func getAgeRatingCode() async -> Int? { guard let ageRatingCode = await AppStore.ageRatingCode else { print("Age rating code unavailable") return nil } print("ageRatingCode: \(ageRatingCode)") // always prints 0 return ageRatingCode } Questions: What integer values does ageRatingCode map to? (e.g., does 4+ = 4, 9+ = 9, 13+ = 13, etc.? Or is it a different internal code?) This mapping is not documented anywhere I can find. Is 0 a valid return value, and if so, what does it represent? Is there a known issue with this API returning 0 even when all conditions appear to be correctly configured? Any guidance from Apple engineers or developers who have successfully used this API would be greatly appreciated.
1
0
590
Jul ’26
In App Purchase UI difference for tvOS
We're seeing differences in the purchase dialog and overall presentation when testing with Sandbox accounts compared to commercially available apps. Are these UI differences are expected and are simply a characteristic of the Sandbox testing environment, or if there are any configuration requirements that affect the purchase sheet appearance? It would be helpful to know whether developers should expect the production purchase UI to match App Store apps once the app is distributed through TestFlight/App Store, or if there are additional factors involved. Sandbox UI Expected UI
0
0
537
Jul ’26
Subscription bundle & suite testing failure on XCode 27 Beta 3
I'm quite excited about the newly announced bundle and suite feature and trying to test the new Subscription Bundle type introduced in the recent Xcode Beta (using a local .storekit configuration file). I have set up: A local .storekit file. Inside it, I configured a Subscription Bundle with the ID "bundle". This bundle is linked to two internal auto-renewable subscriptions in the same file. The StoreKit configuration is active in my Scheme options. When I try to fetch a standard auto-renewable subscription ID, it works perfectly. However, when I try to fetch the "bundle" ID, the API returns successfully but with an empty array [] (no errors thrown). Is there a different way to query/fetch the new Subscription Bundle type in StoreKit 2, or is local testing for bundles not yet supported in the simulator in this beta? My sample code import StoreKit @MainActor class StoreManager: ObservableObject { @Published var products: [Product] = [] func fetchProducts() async { do { // "bundle" is defined in our local .storekit file as a SubscriptionBundle self.products = try await Product.products(for: ["bundle"]) print("Fetched products: \(self.products.map { $0.id })") } catch { print("Fetch error: \(error)") } } } struct ContentView: View { @StateObject private var store = StoreManager() var body: some View { VStack { if store.products.isEmpty { Text("Stuck Loading: Product not found.") } else { ForEach(store.products, id: \.id) { product in Text("Found: \(product.displayName) - \(product.displayPrice)") } } } .task { await store.task { await store.fetchProducts() } } } } My storekit "appPolicies" : { "eula" : "", "policies" : [ { "locale" : "en_US", "policyText" : "", "policyURL" : "" } ] }, "identifier" : "2B237494", "nonRenewingSubscriptions" : [ ], "products" : [ ], "settings" : { "_askToBuyEnabled" : false, "_billingGracePeriodEnabled" : false, "_billingIssuesEnabled" : false, "_disableDialogs" : false, "_failTransactionsEnabled" : false, "_locale" : "en_US", "_renewalBillingIssuesEnabled" : false, "_storefront" : "USA", "_storeKitErrors" : [ ], "_timeRate" : 0 }, "subscriptionBundleGroups" : [ { "id" : "EE1EB207", "localizations" : [ ], "name" : "bundle_group", "subscriptions" : [ { "displayPrice" : "0.99", "duration" : "P1M", "groupNumber" : 1, "internalID" : "84A95B47", "introductoryOffers" : [ { "billingPlanType" : "BILLED_UPFRONT", "internalID" : "DD9208A6", "numberOfPeriods" : 1, "paymentMode" : "free", "subscriptionPeriod" : "P1W" } ], "isFamilyShareable" : false, "linkedSubscriptions" : [ { "internal" : "D1A384C1" }, { "internal" : "01ABB5D2" } ], "localizations" : [ { "description" : "", "displayName" : "", "locale" : "en_US" } ], "productID" : "bundle", "referenceName" : "Awesome Bundle", "subscriptionGroupID" : "EE1EB207", "type" : "SubscriptionBundle" } ] } ], "subscriptionGroups" : [ { "id" : "84E94B59", "localizations" : [ ], "name" : "premium_group", "subscriptions" : [ { "adHocOffers" : [ ], "billingPlans" : [ { "billingPlanType" : "BILLED_UPFRONT", "commitmentDisplayPrice" : "1.99", "displayPrice" : "1.99", "internalID" : "21C9C75B", "isEnabled" : true } ], "codeOffers" : [ ], "displayPrice" : "1.99", "familyShareable" : false, "groupNumber" : 1, "internalID" : "D1A384C1", "introductoryOffer" : { "billingPlanType" : "BILLED_UPFRONT", "displayPrice" : "0.99", "internalID" : "F0651A66", "numberOfPeriods" : 1, "paymentMode" : "payUpFront", "subscriptionPeriod" : "P1M" }, "introductoryOffers" : [ { "billingPlanType" : "BILLED_UPFRONT", "displayPrice" : "0.99", "internalID" : "F0651A66", "numberOfPeriods" : 1, "paymentMode" : "payUpFront", "subscriptionPeriod" : "P1M" } ], "localizations" : [ { "description" : "", "displayName" : "", "locale" : "en_US" } ], "productID" : "premium_monthly", "recurringSubscriptionPeriod" : "P1M", "referenceName" : "premiume monthly", "subscriptionGroupID" : "84E94B59", "type" : "RecurringSubscription", "winbackOffers" : [ ] } ] }, { "id" : "39607B86", "localizations" : [ ], "name" : "basic_group", "subscriptions" : [ { "adHocOffers" : [ ], "billingPlans" : [ { "billingPlanType" : "BILLED_UPFRONT", "commitmentDisplayPrice" : "0.99", "displayPrice" : "0.99", "internalID" : "0FAC3C7D", "isEnabled" : true } ], "codeOffers" : [ ], "displayPrice" : "0.99", "familyShareable" : false, "groupNumber" : 1, "internalID" : "01ABB5D2", "introductoryOffers" : [ ], "localizations" : [ { "description" : "", "displayName" : "", "locale" : "en_US" } ], "productID" : "basic_monthly", "recurringSubscriptionPeriod" : "P1M", "referenceName" : "basic monthly", "subscriptionGroupID" : "39607B86", "type" : "RecurringSubscription", "winbackOffers" : [ ] } ] } ], "subscriptionSuiteGroups" : [ ], "version" : { "major" : 6, "minor" : 3 } }
0
0
437
Jul ’26
"Sandbox Apple Account" Developer Setting Does Not Work
I am trying to test a sandbox account for an in-app subscription. It will not work. When I try to check out in my app, I'm told... 2026-07-08 14:41:59.282977-0700 PlainSite[1364:48033] [Default] [StoreKit] Purchase did not return a transaction: Error Domain=ASDErrorDomain Code=500 "Unhandled exception" UserInfo={NSUnderlyingError=0x2835d21f0 {Error Domain=AMSErrorDomain Code=100 "Authentication Failed" UserInfo={NSMultipleUnderlyingErrorsKey=( "Error Domain=AMSErrorDomain Code=2 \"An unknown error occurred. Please try again.\" UserInfo={NSLocalizedDescription=An unknown error occurred. Please try again.}", "Error Domain=AMSServerErrorDomain Code=-5000 \"(null)\" UserInfo={failureType=-5000, m-allowed=false, pings=(\n), cancel-purchase-batch=true, customerMessage=Check the account information you entered and try again.}" ), NSLocalizedDescription=Authentication Failed, NSLocalizedFailureReason=The authentication failed.}}, NSLocalizedFailureReason=An unknown error occurred, NSLocalizedDescription=Unhandled exception} [CreateAccountView] purchaseForSignup threw: userCancelled This is false. The user (me) did not cancel. This is with me manually typing in the sandbox credentials as the Apple ID and password at the point of completing the transaction on both iOS 15 and iOS 26. So I try to make sure that my sandbox account is properly set in iOS 26's Settings -> Developer -> Sandbox Apple Account screen. It says Sign In. Then it says "Apple Account Sign in Requested". What does this actually mean? Who knows. It could mean my App Store Connect credentials are what it wants so that it can query which sandbox accounts are available to use—after all, that is where they are set up. It could also mean that you should type in the sandbox account's credentials directly because a sandbox account is basically a fake Apple ID. I try both. Neither works. No matter what I do, it just goes back to the Developer view and says "Sign In". Have I signed in? I don't know. Maybe, but probably not, given that nothing works. Is the problem that I didn't confirm the sandbox account's e-mail address? No. It doesn't work before or after I've confirmed the e-mail. Is the problem that I don't have two-factor authentication on for the sandbox account? No. It doesn't work whether or not two-factor authentication is enabled. I am not the only one having this problem. People on a certain Reddit thread I'm for some reason not allowed to link to here (sandbox_accounts_simulator_help) have been having it for the past year it looks like, except they got it to work on a real device, and I'm using an iPhone 17, which is a real device, and it doesn't work. This is the third bug in Apple's code I've found in the past couple of weeks that is preventing me from getting my app published and it's getting frustrating. Any assistance would be appreciated. Fix your code, Apple.
2
0
585
Jul ’26
Our sandbox accounts don't work now.
Our sandbox accounts don't work now. We are testing our IAP product now, so we need our sandbox accounts to be logged in, for purchaise test. Settings -> Developer -> Sandbox Apple Account screen - > log in : Not working Logged out status -> test app -> purchasing IAP product : Not working our 4 members of dev team have same problem now.
0
0
307
Jul ’26
Non-Consumable IAP stuck in ‘Developer Action Required’ – cannot link to version page
My Non-Consumable IAP was rejected with Guideline 3.1.1 and now has status ‘Developer Action Required’. The problem: On the version page in App Store Connect, the ‘In-App Purchases and Subscriptions’ section does not appear at the bottom. I cannot link the IAP to a new version submission. Every time I submit a new binary, Apple approves the app version but rejects the IAP afterward — even though I have no way to attach it to the version in the first place. This seems to be a circular issue: the IAP doesn’t appear on the version page because of its current status, but the only way to fix the status is to submit it with a new version. Has anyone experienced this and found a solution? Any help appreciated!​​​​​​​​​​​​​​​​
4
0
591
Jul ’26
SKTestSession configurations broken?
SKTestSession configurations seem to have been broken starting in Xcode 26.3. The release notes for iOS 26.5 indicate that it was supposed to be fixed there, but I still haven't been able to get it to work. Is there something that has changed recently about how SKTestSession configurations need to be used?
4
2
571
Jul ’26
Cannot load products in Sandbox
Hi, I'm trying to hook up some test in app purchases to test purchase code between our app and our app's backend. When I try to load products (requestProductData) with my Sandbox account, my product identifiers come back in the invalid product identifiers member of the response. My product says it's in "waiting for review" status in app store connect, and I'm logged in to the app store with my sandbox account on my device. We just accepted the paid apps agreement as well--is there some propagation time to that? The product ID I'm using (both in app store connect and in-app) is test_durable. Do I need to append the package name to that or something? I've dug through the docs and through the forums here and come up empty. I tried using the Xcode storekit test harness and the issue there is that because that doesn't actually talk to the store apis, I can't use that to test my backend correctly validating/processing the transactions. Thanks!
0
0
446
Jul ’26
StoreKit 2 returns no products for auto-renewable subscriptions in TestFlight
Hi everyone, I’m having an issue where my TestFlight build cannot load auto-renewable subscription products from App Store Connect. The app is built with Flutter and uses StoreKit 2 through an in-app purchase implementation. The same subscription system works correctly on Google Play Billing and returns product details/prices there, but on iOS StoreKit returns no subscription products. I tested this on a real iPhone installed from TestFlight, not from Xcode debug and not using a local StoreKit configuration. The app requests four auto-renewable subscription product IDs. The IDs in code exactly match the product IDs in App Store Connect. The app diagnostics show: Platform: iOS StoreKit mode: StoreKit 2 Store available: true Requested IDs: 4 subscription product IDs Returned IDs: none Missing IDs: all requested product IDs Error source: app_store Error code: storekit_no_response Error message: StoreKit: Failed to get response from platform. Store note: The store accepted the query, but did not return details for these product IDs. Things I have already checked: Product IDs match exactly between Flutter code and App Store Connect Bundle ID matches the App Store Connect app record In-App Purchase capability is enabled Subscriptions are in one subscription group Subscription availability is set for all countries/regions The TestFlight build is installed on a real device Local StoreKit configuration was removed StoreKit reports store availability as true App Store Connect / In-App Purchase keys are configured for backend verification The same product-loading flow works on Google Play The current App Store Connect status for the subscriptions is: Subscriptions: Ready to Submit / Ready for Review Localizations: Prepare for Submission Also, the bank information is not submitted yet. My question is: can StoreKit in TestFlight return subscription product details while the first auto-renewable subscriptions are still only “Ready to Submit” and have not yet been submitted with an app version for review? Or will StoreKit return no products until: The first subscriptions are attached to an app version and submitted for review Subscription localizations are fully prepared/submitted Paid agreements, tax, and banking are fully completed Since StoreKit is available and accepts the product query, but returns zero products, I’m trying to understand whether this is expected App Store Connect behavior or if there is another configuration issue I should check. Thanks.
1
0
890
Jun ’26
Your first subscription must be submitted with a new app version.
I have seen this problem arise from multiple sources. I am trying to submit my app but a new app version must be bundled with the subscription. The guide consistently says (copy pasted from the "Submit an In-App Purchase" guide) _"On the right, scroll down to the In-App Purchases and Subscriptions section. Click Select In-App Purchases or Subscriptions, or if you’ve already started selecting In-App Purchases or subscriptions, click Edit."_ The problem is there IS NO In-App Purchases or subscription section in the the app section. I have submitted again but at this point I'm loosing hope. I am hoping that adding a StoreKit config file this time on the Xcode side will help however again reading "submission (1)" does not give much hope. Please help as this has delayed launch by quite a lot.
0
0
340
Jun ’26
Can Product.products / SKProductsRequest be used only for display metadata when EU storefront uses ExternalPurchaseCustomLink only?
This is a StoreKit / ExternalPurchaseCustomLink clarification. Apple DTS asked me to post the follow-up question here. We are designing an SDK for apps that support EU external purchase. In EU storefronts, the app will use ExternalPurchaseCustomLink only: No App Store In-App Purchase will be offered to users. No Product.purchase() will be called. No SKPaymentQueue.add(_:) will be called. The actual purchase will happen only on our external website through the ExternalPurchaseCustomLink flow. Question: In this EU ExternalPurchaseCustomLink-only setup, is it acceptable and supported to call Product.products(for:) / SKProductsRequest only to fetch product display metadata from App Store Connect? The metadata would only be used to display the product list UI, for example: product title / display name localized price currency / priceLocale formatting information The returned Product / SKProduct would not be used to start an App Store purchase. Or should apps avoid Product.products(for:) / SKProductsRequest entirely in EU storefronts where only ExternalPurchaseCustomLink is offered, and use their own product catalog instead?
1
0
546
Jun ’26
IAP products not loading in sandbox after activating Paid Apps Agreement
I activated the Paid Apps Agreement today along with banking and tax information. My app uses react-native-purchases (RevenueCat) with StoreKit 2. When tapping purchase buttons in TestFlight I still get "Product not available - Could not load this product." Products show "Waiting for Review" in App Store Connect. Sandbox tester is configured. Is there a delay after activating the Paid Apps Agreement before sandbox purchases work? How long should I expect to wait?
0
0
338
Jun ’26
Refund requests failing in production
We offer an in-app way for customers to request an Apple refund for an auto-renewable subscription using StoreKit2. Everything worked during testing and verification in the Sandbox and TestFlight phases, but now consistently fails in Production. We present the refund sheet on a button press: .refundRequestSheet(for: transactionID, isPresented: $isPresenting) { result in switch result { case .success(let status): // .success / .userCancelled handled here case .failure(let error): // -> .failed for every user } } We log the outcome of all the requests, success and cancel behaves as expected. Since RefundRequestError only has .duplicateRequest .failed and the localizedDescription is generic, we don't know why it is failing. We have already checked that the transaction are for verified, not revoked, non-upgraded and active subscriptions. The issue only happens in Production. Is there any way to get more information about why a refund request fails or what other configuration needs to verified for this to work? Is there an eligibility window or other non-specified limit that might result in these errors?
Replies
1
Boosts
0
Views
609
Activity
Jul ’26
SKPaymentQueue.restoreCompletedTransactions returns 0 transactions for auto-renewable subscriptions on iOS 26.4
Is anybody else seeing this? Since iOS 26.4, calling SKPaymentQueue.restoreCompletedTransactions() no longer returns any transactions for active auto-renewable subscriptions. The success callback is invoked correctly, but the transactions array is empty. The same device and the same Apple ID return the expected transactions on iOS 26.3.1 and earlier. Environment Affected: iOS 26.4.x (confirmed on 26.4.2) Working: iOS 26.3.1 and earlier Product type: Auto-renewable subscriptions Deployment target: iOS 14.0 Steps to reproduce Have an active auto-renewable subscription on an Apple ID (sandbox or production) Run on a device with iOS 26.4 or later Call SKPaymentQueue.default().restoreCompletedTransactions() (or the equivalent via a wrapper such as RMStore) Observe the paymentQueueRestoreCompletedTransactionsFinished delegate callback Expected behaviour The delegate receives the restored transactions via paymentQueue(_:updatedTransactions:) before paymentQueueRestoreCompletedTransactionsFinished is called, as documented. Actual behaviour paymentQueueRestoreCompletedTransactionsFinished is called immediately with no prior transaction updates. The transactions array is empty.
Replies
1
Boosts
1
Views
546
Activity
Jul ’26
App Subscription "Confirm with Apple Device" UI
My tvOS app includes the purchase of subscriptions, and I am updating the code with Storekit 2.0. I have seen other apps that present the "Confirm with Apple Device" UI upon selection of a product, but for me I only ever see an alert confirming the purchase. I have tested this using Xcode storekit data and a sandbox account. I have also attempted using Storekit views and passing the UIWindowScene to the purchase(confirmIn: ) parameter, but neither made any difference. Is there some limitation that prevents that UI from showing in debug builds?
Replies
1
Boosts
0
Views
747
Activity
Jul ’26
Production StoreKit silently omits one approved auto-renewable subscription product — sandbox returns it correctly, sudden onset 2026-05-09
Hi all, Reporting an active production issue in case anyone else is seeing the same pattern, or has insight into what could cause this. Symptom As of 2026-05-09 morning, one specific auto-renewable subscription product is silently absent from Production StoreKit responses on our live App Store build. The product is still 'Approved' in App Store Connect, all metadata is intact, no error code is returned — the product simply does not appear in the products array. The other 3 products in the same subscription group continue to work normally. 100% of production users are affected. Setup App: live on App Store, version 1.0.0 (build 8) Subscription group with 4 auto-renewable products: standard_monthly_799 ✅ returns correctly standard_annual_6999 ✅ returns correctly unlimited_monthly_1299 ❌ MISSING from production response unlimited_annual_9999 ✅ returns correctly SDK: purchases_flutter (RevenueCat) → StoreKit Same physical device, same code, same RC config behaves correctly in Sandbox — all 4 products are returned and a sandbox purchase of unlimited_monthly_1299 succeeds. Timeline 2026-05-08: working correctly, purchases succeeding normally 2026-05-09 morning: product silently disappears from production StoreKit responses No app update was submitted between those dates No App Store Connect changes were made Onset was simultaneous across all production users at one timestamp What I've verified App Store Connect: Product status: Approved All territories enabled, all prices configured (no N/A in any territory) Subscription group correctly contains all 4 products No 'Submit for Review' pending changes Product attached to live app version 1.0.0 (8) Tax category: Match to parent app Family Sharing: Off (consistent with the working products) Paid Applications Agreement: Status: Active Banking and Tax forms: Active RevenueCat dashboard: All 4 products show Store Status: Approved Default offering contains all 4 packages iOS attachment for the affected product is intact No warnings or sync errors Sandbox StoreKit (today): flutter run (debug) on physical device → all 4 products returned flutter run --release on physical device → all 4 products returned Sandbox purchase of unlimited_monthly_1299 succeeds Production StoreKit (today, broken): App Store-downloaded 1.0.0 (8) on multiple users' devices Multiple Apple IDs / multiple devices / multiple regions — all reproduce Only unlimited_monthly_1299 affected; other 3 products fine Why this looks server-side Sudden simultaneous onset across all users No code or config change preceded onset Sandbox unaffected, only Production affected Single product affected, not the whole subscription group or app No error returned — silent omission only Cannot reproduce with locally signed builds, only with App Store-distributed binary This pattern is consistent with a server-side product indexing or fronting issue specific to one product in Production StoreKit. As a developer I don't have visibility into Apple's product-serving infrastructure to investigate further — looking for guidance from anyone who has seen this before. Questions for the community Has anyone else seen a single auto-renewable subscription silently drop out of Production StoreKit responses while remaining Approved in ASC, with no error code returned? Is there any internal product-state flag (beyond what's exposed in the ASC UI) that could cause Production StoreKit to silently omit a product? Anything similar to a hidden 'review hold' or 'price tier reconciliation' state? Has the asymmetry between RevenueCat package identifiers (Standard uses RC's $rc_monthly/$rc_annual default identifiers, Premium uses custom premium_monthly/premium_annual identifiers) ever been implicated in this kind of failure? RC support has been notified, but worth asking publicly. For anyone who has resolved a similar issue: what action ended up clearing it — ASC re-save, RC re-sync, Apple Support escalation, or did it self-resolve after Apple-side cache propagation? Filings in progress ASC Contact Us ticket: filed Apple DTS technical incident: filed RevenueCat support ticket: filed Feedback Assistant report: in progress Will update this thread with the resolution path once we have one. Thanks, — Kin Pong Lo (developer, Alice: AI English Tutor)
Replies
1
Boosts
0
Views
860
Activity
Jul ’26
Guideline 3.1.1 – Consumable IAPs rejected after binary approved; asked for “new binary” though 1.8 already submitted
Hi, We received App Review feedback under Guideline 3.1.1 for our in-app purchases, and we’d appreciate guidance on the expected next step. What we submitted; We created and completed metadata for the new consumable IAPs (pricing, availability, review screenshots, localizations). We uploaded and submitted app version 1.8 with a recent binary (build processed/VALID in App Store Connect). We also submitted the consumable IAPs for review. Outcome: App version 1.8 was approved (currently Pending Developer Release). The consumable IAPs were returned with Developer Action Needed. Our confusion We already uploaded/submitted a new binary (1.8) for this release, and the consumable purchase flows are implemented in that binary (Store / offers). The app binary itself was approved, but the consumable IAPs were rejected with a request for another new binary. For a first-time expansion from Non-Consumable-only to Consumables, is a separate / subsequent binary submission always required even if the approved version already contains the purchase UI?
Replies
1
Boosts
0
Views
290
Activity
Jul ’26
AppStore.ageRatingCode always returns 0 on real device — is this expected behavior?
Hello everyone I'm implementing age verification in my app to comply with upcoming age assurance laws (Utah, etc.), and I'm using AppStore.ageRatingCode from StoreKit to retrieve my app's current age rating. According to the documentation: extension AppStore { @available(iOS 26.2, macOS 26.2, tvOS 26.2, watchOS 26.2, *) public static var ageRatingCode: Int? { get async } } "Use this property to fetch the age rating for your app and compare it with the last known age rating to check if it has changed." However, calling this always returns 0 in my environment. Environment: Device: Real physical device (not simulator) iOS version: 26.4 Sandbox Apple Account: signed in via Settings → Developer → Sandbox Apple Account App Store Connect: app is registered and age rating is configured Xcode Scheme → Run → Options → StoreKit Configuration: None Code: func getAgeRatingCode() async -> Int? { guard let ageRatingCode = await AppStore.ageRatingCode else { print("Age rating code unavailable") return nil } print("ageRatingCode: \(ageRatingCode)") // always prints 0 return ageRatingCode } Questions: What integer values does ageRatingCode map to? (e.g., does 4+ = 4, 9+ = 9, 13+ = 13, etc.? Or is it a different internal code?) This mapping is not documented anywhere I can find. Is 0 a valid return value, and if so, what does it represent? Is there a known issue with this API returning 0 even when all conditions appear to be correctly configured? Any guidance from Apple engineers or developers who have successfully used this API would be greatly appreciated.
Replies
1
Boosts
0
Views
590
Activity
Jul ’26
In App Purchase UI difference for tvOS
We're seeing differences in the purchase dialog and overall presentation when testing with Sandbox accounts compared to commercially available apps. Are these UI differences are expected and are simply a characteristic of the Sandbox testing environment, or if there are any configuration requirements that affect the purchase sheet appearance? It would be helpful to know whether developers should expect the production purchase UI to match App Store apps once the app is distributed through TestFlight/App Store, or if there are additional factors involved. Sandbox UI Expected UI
Replies
0
Boosts
0
Views
537
Activity
Jul ’26
Subscription bundle & suite testing failure on XCode 27 Beta 3
I'm quite excited about the newly announced bundle and suite feature and trying to test the new Subscription Bundle type introduced in the recent Xcode Beta (using a local .storekit configuration file). I have set up: A local .storekit file. Inside it, I configured a Subscription Bundle with the ID "bundle". This bundle is linked to two internal auto-renewable subscriptions in the same file. The StoreKit configuration is active in my Scheme options. When I try to fetch a standard auto-renewable subscription ID, it works perfectly. However, when I try to fetch the "bundle" ID, the API returns successfully but with an empty array [] (no errors thrown). Is there a different way to query/fetch the new Subscription Bundle type in StoreKit 2, or is local testing for bundles not yet supported in the simulator in this beta? My sample code import StoreKit @MainActor class StoreManager: ObservableObject { @Published var products: [Product] = [] func fetchProducts() async { do { // "bundle" is defined in our local .storekit file as a SubscriptionBundle self.products = try await Product.products(for: ["bundle"]) print("Fetched products: \(self.products.map { $0.id })") } catch { print("Fetch error: \(error)") } } } struct ContentView: View { @StateObject private var store = StoreManager() var body: some View { VStack { if store.products.isEmpty { Text("Stuck Loading: Product not found.") } else { ForEach(store.products, id: \.id) { product in Text("Found: \(product.displayName) - \(product.displayPrice)") } } } .task { await store.task { await store.fetchProducts() } } } } My storekit "appPolicies" : { "eula" : "", "policies" : [ { "locale" : "en_US", "policyText" : "", "policyURL" : "" } ] }, "identifier" : "2B237494", "nonRenewingSubscriptions" : [ ], "products" : [ ], "settings" : { "_askToBuyEnabled" : false, "_billingGracePeriodEnabled" : false, "_billingIssuesEnabled" : false, "_disableDialogs" : false, "_failTransactionsEnabled" : false, "_locale" : "en_US", "_renewalBillingIssuesEnabled" : false, "_storefront" : "USA", "_storeKitErrors" : [ ], "_timeRate" : 0 }, "subscriptionBundleGroups" : [ { "id" : "EE1EB207", "localizations" : [ ], "name" : "bundle_group", "subscriptions" : [ { "displayPrice" : "0.99", "duration" : "P1M", "groupNumber" : 1, "internalID" : "84A95B47", "introductoryOffers" : [ { "billingPlanType" : "BILLED_UPFRONT", "internalID" : "DD9208A6", "numberOfPeriods" : 1, "paymentMode" : "free", "subscriptionPeriod" : "P1W" } ], "isFamilyShareable" : false, "linkedSubscriptions" : [ { "internal" : "D1A384C1" }, { "internal" : "01ABB5D2" } ], "localizations" : [ { "description" : "", "displayName" : "", "locale" : "en_US" } ], "productID" : "bundle", "referenceName" : "Awesome Bundle", "subscriptionGroupID" : "EE1EB207", "type" : "SubscriptionBundle" } ] } ], "subscriptionGroups" : [ { "id" : "84E94B59", "localizations" : [ ], "name" : "premium_group", "subscriptions" : [ { "adHocOffers" : [ ], "billingPlans" : [ { "billingPlanType" : "BILLED_UPFRONT", "commitmentDisplayPrice" : "1.99", "displayPrice" : "1.99", "internalID" : "21C9C75B", "isEnabled" : true } ], "codeOffers" : [ ], "displayPrice" : "1.99", "familyShareable" : false, "groupNumber" : 1, "internalID" : "D1A384C1", "introductoryOffer" : { "billingPlanType" : "BILLED_UPFRONT", "displayPrice" : "0.99", "internalID" : "F0651A66", "numberOfPeriods" : 1, "paymentMode" : "payUpFront", "subscriptionPeriod" : "P1M" }, "introductoryOffers" : [ { "billingPlanType" : "BILLED_UPFRONT", "displayPrice" : "0.99", "internalID" : "F0651A66", "numberOfPeriods" : 1, "paymentMode" : "payUpFront", "subscriptionPeriod" : "P1M" } ], "localizations" : [ { "description" : "", "displayName" : "", "locale" : "en_US" } ], "productID" : "premium_monthly", "recurringSubscriptionPeriod" : "P1M", "referenceName" : "premiume monthly", "subscriptionGroupID" : "84E94B59", "type" : "RecurringSubscription", "winbackOffers" : [ ] } ] }, { "id" : "39607B86", "localizations" : [ ], "name" : "basic_group", "subscriptions" : [ { "adHocOffers" : [ ], "billingPlans" : [ { "billingPlanType" : "BILLED_UPFRONT", "commitmentDisplayPrice" : "0.99", "displayPrice" : "0.99", "internalID" : "0FAC3C7D", "isEnabled" : true } ], "codeOffers" : [ ], "displayPrice" : "0.99", "familyShareable" : false, "groupNumber" : 1, "internalID" : "01ABB5D2", "introductoryOffers" : [ ], "localizations" : [ { "description" : "", "displayName" : "", "locale" : "en_US" } ], "productID" : "basic_monthly", "recurringSubscriptionPeriod" : "P1M", "referenceName" : "basic monthly", "subscriptionGroupID" : "39607B86", "type" : "RecurringSubscription", "winbackOffers" : [ ] } ] } ], "subscriptionSuiteGroups" : [ ], "version" : { "major" : 6, "minor" : 3 } }
Replies
0
Boosts
0
Views
437
Activity
Jul ’26
"Sandbox Apple Account" Developer Setting Does Not Work
I am trying to test a sandbox account for an in-app subscription. It will not work. When I try to check out in my app, I'm told... 2026-07-08 14:41:59.282977-0700 PlainSite[1364:48033] [Default] [StoreKit] Purchase did not return a transaction: Error Domain=ASDErrorDomain Code=500 "Unhandled exception" UserInfo={NSUnderlyingError=0x2835d21f0 {Error Domain=AMSErrorDomain Code=100 "Authentication Failed" UserInfo={NSMultipleUnderlyingErrorsKey=( "Error Domain=AMSErrorDomain Code=2 \"An unknown error occurred. Please try again.\" UserInfo={NSLocalizedDescription=An unknown error occurred. Please try again.}", "Error Domain=AMSServerErrorDomain Code=-5000 \"(null)\" UserInfo={failureType=-5000, m-allowed=false, pings=(\n), cancel-purchase-batch=true, customerMessage=Check the account information you entered and try again.}" ), NSLocalizedDescription=Authentication Failed, NSLocalizedFailureReason=The authentication failed.}}, NSLocalizedFailureReason=An unknown error occurred, NSLocalizedDescription=Unhandled exception} [CreateAccountView] purchaseForSignup threw: userCancelled This is false. The user (me) did not cancel. This is with me manually typing in the sandbox credentials as the Apple ID and password at the point of completing the transaction on both iOS 15 and iOS 26. So I try to make sure that my sandbox account is properly set in iOS 26's Settings -> Developer -> Sandbox Apple Account screen. It says Sign In. Then it says "Apple Account Sign in Requested". What does this actually mean? Who knows. It could mean my App Store Connect credentials are what it wants so that it can query which sandbox accounts are available to use—after all, that is where they are set up. It could also mean that you should type in the sandbox account's credentials directly because a sandbox account is basically a fake Apple ID. I try both. Neither works. No matter what I do, it just goes back to the Developer view and says "Sign In". Have I signed in? I don't know. Maybe, but probably not, given that nothing works. Is the problem that I didn't confirm the sandbox account's e-mail address? No. It doesn't work before or after I've confirmed the e-mail. Is the problem that I don't have two-factor authentication on for the sandbox account? No. It doesn't work whether or not two-factor authentication is enabled. I am not the only one having this problem. People on a certain Reddit thread I'm for some reason not allowed to link to here (sandbox_accounts_simulator_help) have been having it for the past year it looks like, except they got it to work on a real device, and I'm using an iPhone 17, which is a real device, and it doesn't work. This is the third bug in Apple's code I've found in the past couple of weeks that is preventing me from getting my app published and it's getting frustrating. Any assistance would be appreciated. Fix your code, Apple.
Replies
2
Boosts
0
Views
585
Activity
Jul ’26
Our sandbox accounts don't work now.
Our sandbox accounts don't work now. We are testing our IAP product now, so we need our sandbox accounts to be logged in, for purchaise test. Settings -> Developer -> Sandbox Apple Account screen - > log in : Not working Logged out status -> test app -> purchasing IAP product : Not working our 4 members of dev team have same problem now.
Replies
0
Boosts
0
Views
307
Activity
Jul ’26
Our sandbox accounts don't work now.
Our sandbox accounts don't work now. We are testing our IAP product now, so we needed our sandbox accounts to be logged in, for purchaise test. Settings -> Developer -> Sandbox Apple Account screen - > log in : Not working Logged out status -> test app -> purchasing IAP product : Not working our 4 members of dev team have same problem now.
Replies
0
Boosts
0
Views
440
Activity
Jul ’26
Non-Consumable IAP stuck in ‘Developer Action Required’ – cannot link to version page
My Non-Consumable IAP was rejected with Guideline 3.1.1 and now has status ‘Developer Action Required’. The problem: On the version page in App Store Connect, the ‘In-App Purchases and Subscriptions’ section does not appear at the bottom. I cannot link the IAP to a new version submission. Every time I submit a new binary, Apple approves the app version but rejects the IAP afterward — even though I have no way to attach it to the version in the first place. This seems to be a circular issue: the IAP doesn’t appear on the version page because of its current status, but the only way to fix the status is to submit it with a new version. Has anyone experienced this and found a solution? Any help appreciated!​​​​​​​​​​​​​​​​
Replies
4
Boosts
0
Views
591
Activity
Jul ’26
SKTestSession configurations broken?
SKTestSession configurations seem to have been broken starting in Xcode 26.3. The release notes for iOS 26.5 indicate that it was supposed to be fixed there, but I still haven't been able to get it to work. Is there something that has changed recently about how SKTestSession configurations need to be used?
Replies
4
Boosts
2
Views
571
Activity
Jul ’26
Referrer System at Subscriptions
Hi, I want to develop a referral system for my subscribers. If someone suggests my app and his/her friend buy a subscription I want to give the referrer a one-month free subscription or extend the existing subscription to one month for free. Is it possible to do this with offer codes?
Replies
3
Boosts
0
Views
1.1k
Activity
Jul ’26
Cannot load products in Sandbox
Hi, I'm trying to hook up some test in app purchases to test purchase code between our app and our app's backend. When I try to load products (requestProductData) with my Sandbox account, my product identifiers come back in the invalid product identifiers member of the response. My product says it's in "waiting for review" status in app store connect, and I'm logged in to the app store with my sandbox account on my device. We just accepted the paid apps agreement as well--is there some propagation time to that? The product ID I'm using (both in app store connect and in-app) is test_durable. Do I need to append the package name to that or something? I've dug through the docs and through the forums here and come up empty. I tried using the Xcode storekit test harness and the issue there is that because that doesn't actually talk to the store apis, I can't use that to test my backend correctly validating/processing the transactions. Thanks!
Replies
0
Boosts
0
Views
446
Activity
Jul ’26
How to manage TestFlight subscriptions on macOS?
I purchased a subscription within my TestFlight macOS build. I would like to access a screen to manage subscriptions and cancel it. How can I do that? I can't find this screen. In the App Store app I can only see my personal purchases.
Replies
1
Boosts
0
Views
1k
Activity
Jul ’26
StoreKit 2 returns no products for auto-renewable subscriptions in TestFlight
Hi everyone, I’m having an issue where my TestFlight build cannot load auto-renewable subscription products from App Store Connect. The app is built with Flutter and uses StoreKit 2 through an in-app purchase implementation. The same subscription system works correctly on Google Play Billing and returns product details/prices there, but on iOS StoreKit returns no subscription products. I tested this on a real iPhone installed from TestFlight, not from Xcode debug and not using a local StoreKit configuration. The app requests four auto-renewable subscription product IDs. The IDs in code exactly match the product IDs in App Store Connect. The app diagnostics show: Platform: iOS StoreKit mode: StoreKit 2 Store available: true Requested IDs: 4 subscription product IDs Returned IDs: none Missing IDs: all requested product IDs Error source: app_store Error code: storekit_no_response Error message: StoreKit: Failed to get response from platform. Store note: The store accepted the query, but did not return details for these product IDs. Things I have already checked: Product IDs match exactly between Flutter code and App Store Connect Bundle ID matches the App Store Connect app record In-App Purchase capability is enabled Subscriptions are in one subscription group Subscription availability is set for all countries/regions The TestFlight build is installed on a real device Local StoreKit configuration was removed StoreKit reports store availability as true App Store Connect / In-App Purchase keys are configured for backend verification The same product-loading flow works on Google Play The current App Store Connect status for the subscriptions is: Subscriptions: Ready to Submit / Ready for Review Localizations: Prepare for Submission Also, the bank information is not submitted yet. My question is: can StoreKit in TestFlight return subscription product details while the first auto-renewable subscriptions are still only “Ready to Submit” and have not yet been submitted with an app version for review? Or will StoreKit return no products until: The first subscriptions are attached to an app version and submitted for review Subscription localizations are fully prepared/submitted Paid agreements, tax, and banking are fully completed Since StoreKit is available and accepts the product query, but returns zero products, I’m trying to understand whether this is expected App Store Connect behavior or if there is another configuration issue I should check. Thanks.
Replies
1
Boosts
0
Views
890
Activity
Jun ’26
Your first subscription must be submitted with a new app version.
I have seen this problem arise from multiple sources. I am trying to submit my app but a new app version must be bundled with the subscription. The guide consistently says (copy pasted from the "Submit an In-App Purchase" guide) _"On the right, scroll down to the In-App Purchases and Subscriptions section. Click Select In-App Purchases or Subscriptions, or if you’ve already started selecting In-App Purchases or subscriptions, click Edit."_ The problem is there IS NO In-App Purchases or subscription section in the the app section. I have submitted again but at this point I'm loosing hope. I am hoping that adding a StoreKit config file this time on the Xcode side will help however again reading "submission (1)" does not give much hope. Please help as this has delayed launch by quite a lot.
Replies
0
Boosts
0
Views
340
Activity
Jun ’26
Can Product.products / SKProductsRequest be used only for display metadata when EU storefront uses ExternalPurchaseCustomLink only?
This is a StoreKit / ExternalPurchaseCustomLink clarification. Apple DTS asked me to post the follow-up question here. We are designing an SDK for apps that support EU external purchase. In EU storefronts, the app will use ExternalPurchaseCustomLink only: No App Store In-App Purchase will be offered to users. No Product.purchase() will be called. No SKPaymentQueue.add(_:) will be called. The actual purchase will happen only on our external website through the ExternalPurchaseCustomLink flow. Question: In this EU ExternalPurchaseCustomLink-only setup, is it acceptable and supported to call Product.products(for:) / SKProductsRequest only to fetch product display metadata from App Store Connect? The metadata would only be used to display the product list UI, for example: product title / display name localized price currency / priceLocale formatting information The returned Product / SKProduct would not be used to start an App Store purchase. Or should apps avoid Product.products(for:) / SKProductsRequest entirely in EU storefronts where only ExternalPurchaseCustomLink is offered, and use their own product catalog instead?
Replies
1
Boosts
0
Views
546
Activity
Jun ’26
IAP products not loading in sandbox after activating Paid Apps Agreement
I activated the Paid Apps Agreement today along with banking and tax information. My app uses react-native-purchases (RevenueCat) with StoreKit 2. When tapping purchase buttons in TestFlight I still get "Product not available - Could not load this product." Products show "Waiting for Review" in App Store Connect. Sandbox tester is configured. Is there a delay after activating the Paid Apps Agreement before sandbox purchases work? How long should I expect to wait?
Replies
0
Boosts
0
Views
338
Activity
Jun ’26