StoreKit

RSS for tag

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

Posts under StoreKit tag

200 Posts

Post

Replies

Boosts

Views

Activity

In-App Purchase Resources
General: Forums topic: StoreKit Forums tag: In-App Purchase App Store Pathway Simple and safe In-App Purchases Auto-renewable subscriptions In-App Purchase documentation Getting started with In-App Purchase using StoreKit views documentation Supporting business model changes by using the app transaction documentation Testing at all stages of development with Xcode and the sandbox documentation App Store Server Notifications documentation App Store Server API documentation Simplifying your implementation by using the App Store Server Library documentation TN3185: Troubleshooting In-App Purchases availability in Xcode technote TN3186: Troubleshooting In-App Purchases availability in the sandbox technote TN3188: Troubleshooting In-App Purchases availability in the App Store technote Understanding StoreKit workflows sample code Implementing a store in your app using the StoreKit API sample code What’s new in StoreKit and In-App Purchase video
0
0
227
3w
StoreKit 2: Transaction.all and Transaction.currentEntitlements return empty for valid non-consumable purchases in production
FB: https://feedbackassistant.apple.com/feedback/22556883 We're seeing a small number of production users where both Transaction.currentEntitlements and Transaction.all return zero transactions for a valid, active, non-refunded non-consumable IAP. This makes it impossible to restore the purchase via any StoreKit 2 API. Environment: Xcode 26.4 (Build 17E192) iOS 26.4.1 Direct call to SK2 Transactions.all & Flutter in_app_purchase package v3.2.3 (uses SK2 on iOS 15+) Non-consumable IAP (one-time purchase) What we observe: AppStore.sync() triggers but the purchase stream returns 0 transactions Transaction.all returns empty Transaction.currentEntitlements also returns empty User is confirmed on the correct Apple ID Issue reproduces on both iPhone and Mac for the same Apple ID Issue appears to have started recently for users who previously had no problems Debug log from affected production user: [2026-04-20T08:50:10.744115Z] init: iapAvailable=true [2026-04-20T08:50:10.744566Z] init: isPremium=false [2026-04-20T08:50:10.744567Z] init: triggering silent restorePurchases [2026-04-20T08:50:45.974566Z] restore: started [2026-04-20T08:50:45.986848Z] restore: sk2Transactions count=0 [2026-04-20T08:50:45.993004Z] restore: sk2Direct isVerified=false active=null [2026-04-20T08:50:45.993011Z] restore: sk2Direct inconclusive — falling back to standard restore [2026-04-20T08:51:16.000851Z] restore: timed out after 30s — fallback isPremium=false [2026-04-20T08:51:16.000910Z] restore: completed — succeeded=false foundPurchase=false Unable to reproduce in sandbox — Transaction.all works correctly there. Appears specific to production for a small subset of users. Has anyone else seen this?
23
4
2.0k
4h
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.
0
0
28
21h
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
120
21h
StoreKit returns no in-app subscriptions on TestFlight despite correct App Store Connect configuration
Hello Applet, I’m experiencing an issue with StoreKit on a TestFlight build. My app uses auto-renewable subscriptions through StoreKit and RevenueCat. Configuration already verified: App installed through TestFlight (not debug). Bundle Identifier: com.ciborgu.vytalai Paid Applications agreement is active. In-App Purchase capability is enabled. Three auto-renewable subscriptions exist in App Store Connect. Product IDs match exactly between App Store Connect, RevenueCat and the application. RevenueCat initializes successfully. A Sandbox test account has been created. Tested on a physical iPhone. Device restarted and app reinstalled from TestFlight. VPN and iCloud Private Relay disabled. When attempting to purchase a subscription, the Apple payment sheet never appears. Our diagnostics indicate that StoreKit does not return any available products for the configured Product IDs, preventing the purchase sheet from opening. Expected Product IDs: vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro Could you please verify if there is any issue with the App Store Connect configuration, StoreKit availability, or the processing state of these subscriptions on Apple’s side? If additional logs or diagnostics are required, I can provide them. Thank you. I have already contacted Apple Developer Support regarding this same issue. Previously, I was advised to schedule a technical support meeting. However, when I requested the meeting, my request was declined because of the subject of my issue, so I was unable to speak with an Apple engineer. Since I have now completed all the recommended troubleshooting and the issue still persists, I would greatly appreciate it if this case could be reviewed by the appropriate technical team or a StoreKit engineer. Thank you for your assistance.
0
0
30
1d
The default message configured through the Retention Message API is not displayed to users
Hello, I have a problem with the Retention Message API. The default message is not displayed to users when they try to cancel their subscription in the device's Settings app. The API configuration was made with Revenue Request. The request to use this API was approved by Apple for our account. After configuring it for the Sandbox environment, everything worked as expected the image and text were displayed to users. Later, I applied the same configuration to the Production environment. I received the Approved status for the message, but after purchasing the subscription from the App Store, although I can see the subscription in Settings, the retention message is not displayed when I attempt to cancel it. I have tried different Apple accounts from different regions (both EU and non-EU) and tested from physical locations without using a VPN. Also, for clarification, we do not use real-time communication only the default retention message. For additional information: I also tried configuring this message from App Store Connect, as shown in WWDC 2026, but this section is not available under the Subscriptions category. When I deactivate and then reactivate the message, I notice that the deactivated state shows the text status "Waiting for sync (0/9)", while the active state shows "Approved". All other assets have an Approved state. In my case, the message is configured for all subscription types without any filters or other restrictions. What could be causing this problem, and how can I fix it? It seems that the issue is not on my side.
0
0
25
1d
New auto-renewable subscription not appearing in sandbox (getOfferings/StoreKit returns 0) after re-creating the product — new app, not yet approved
I have a new app (first version, not yet approved) with one auto-renewable subscription. Earlier in development, the subscription loaded and I could complete a sandbox purchase (the StoreKit sheet showed "Sandbox", the price, and my sandbox account). To resolve an App Store Connect submission deadlock, I deleted that subscription and created a new one with a new Product ID. Since then, the new subscription does NOT appear in the sandbox: StoreKit returns no products, so getOfferings (via RevenueCat) returns 0 packages — both during App Review and on my own development build signed into a sandbox account. Configuration (all verified): Subscription is "Ready to Submit" / "Waiting for Review" Available in all territories Paid Apps Agreement active; banking and tax complete Bundle ID and shared secret unchanged from when it worked App Review keeps rejecting under Guideline 2.1(b) ("プレミアムをはじめる" / purchase button unresponsive) because the product never loads. Questions: For a newly created IAP on a not-yet-approved app, how long does it take to become available in the sandbox? Is there a known propagation delay (24h+)? Does re-creating the product with a new Product ID reset or delay sandbox availability? Is anything required for a new product to be served in the sandbox before the app's first version is approved? Any guidance appreciated. Thanks!
1
0
71
2d
Cannot get StoreKit products on watchOS
I'm using Product.products(for:) to get my auto-renewable subscription on watchOS: let products = try await Product.products(for: [<##Identifier##>]) However, it doesn't return any value, and doesn't throw errors. The console shows an error: Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.billingPlanType], expected: StoreKit.BackingValue) Is this a bug or I did't configure something well? This product has been approved by App Review.
1
0
93
2d
First app release rejected because IAPs didn’t appear, and now the In-App Purchases section is missing from the app version page
I’m trying to submit the first release of my iOS app together with the app’s first consumable in-app purchases, and I’m stuck in what looks like an App Store Connect state issue. My app was already rejected by App Review because the in-app purchases did not appear inside the app when the reviewer opened the paywall. Current setup: First app release Current app version page: iOS App Version 1.0.2 Current attached build: 5 App has never been released before 4 consumable IAPs: com.glowup.credits.100 com.glowup.credits.500 com.glowup.credits.1000 com.glowup.credits.2500 What I see in App Store Connect: All 4 IAPs show Waiting for Review On the iOS App Version 1.0.2 page, the In-App Purchases and Subscriptions section does not appear at all Because of that, I cannot explicitly select or attach the IAPs from the version page What I’ve already done: Uploaded a new build and attached build 5 to version 1.0.2 Removed my local StoreKit configuration file so the app now uses live App Store / StoreKit only Confirmed RevenueCat is configured correctly and sees the offering/packages RevenueCat logs show the products exist remotely, but StoreKit cannot fetch any live products and returns an “offerings empty / none of the products could be fetched” type error RevenueCat also reports the products are still in WAITING_FOR_REVIEW My questions: If the IAPs already show Waiting for Review, are they automatically linked to the current app submission? Is it expected that the In-App Purchases and Subscriptions section can disappear from the app version page in this state? For a first-release app that was already rejected, is attaching a new build and clicking Update Review enough, or is there another step required to associate the IAPs with the resubmission? Has anyone seen App Review reject an app for missing IAPs while the IAPs were still pending review and not yet fetchable from StoreKit? Any guidance from someone who has dealt with this exact first-release + first-IAP submission flow would help a lot.
2
0
256
2d
Clarification about product with status "Developer Removed from Sale"
Summary After setting a single auto-renewable subscription product (not the app) to "Developer Removed from Sale" in App Store Connect, the next scheduled renewal for an existing active subscriber failed with DID_FAIL_TO_RENEW v2 and expirationIntent = 5 ("expired for some other reason"). I expected expirationIntent = 4 ("product wasn't available for purchase at the time of renewal"), since the product was, in fact, not available for purchase. I would like to confirm whether 5 is the documented/expected value for this scenario, and how to deterministically distinguish "developer removed product from sale" from other renewal failures using the notification payload. Reproduction / observed sequence Day 15: Changed product annual_promo (auto-renewable subscription) status from "Approved" to "Developer Removed from Sale" in App Store Connect. The app itself remained Approved and on sale. Other subscription products in the same group remained Approved. Day 16: An existing active subscriber on that product had a scheduled automatic renewal date. Result: Renewal did not occur. We received a DID_FAIL_TO_RENEW v2 notification. Payload (relevant fields): JWSRenewalInfoDecodedPayload.expirationIntent = 5 JWSRenewalInfoDecodedPayload.autoRenewStatus = 0 Questions Is expirationIntent = 5 the correct/expected value when a renewal fails because the developer removed the product from sale? Or should it have been 4 ("product wasn't available for purchase at the time of renewal")? If 5 is intentional, what is the engineering rationale for not using 4 in this scenario? Given that expirationIntent = 5 is documented as a catch-all ("some other reason"), which other fields in the DID_FAIL_TO_RENEW payload (e.g., subtype, autoRenewStatus, gracePeriodExpiresDate, signedTransactionInfo) should we inspect to deterministically classify the failure cause and isolate "developer removed product from sale" from billing failure / customer cancel / price-increase not accepted / etc.? Context I'm aware of the docs page In-App Purchase statuses and Set availability for an auto-renewable subscription, but they describe the status semantics, not the resulting notification payload. Product has been reverted to "Approved" to avoid further impact on subscribers while this is clarified. Thanks in advance.
0
0
39
2d
StoreKit returns 0 subscription products in Sandbox/TestFlight — payment sheet never opens (auto-renewable subscriptions)
Hello, I'm developing a consumer iOS app (Capacitor + RevenueCat SDK) and I've been blocked for several weeks on a StoreKit issue: subscription products are never returned to the device, so the Apple payment sheet cannot open. I previously contacted Apple Support. I was told to request a phone call, but my call request was declined because of the topic (StoreKit / in-app purchases). I'm posting here hoping someone from Apple or the community can help. App details App name: Vytal AI Bundle ID: com.ciborgu.vytalai App Store Connect App ID: 6767160542 Team ID: JZF7CR3W8Z Distribution: TestFlight (physical iPhone, France) iOS deployment target: 15+ Subscription product IDs (auto-renewable) vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro All three are in subscription group "Vytal AI" on the correct ASC app (not a typo bundle). Cleared for Sale is ON. Paid Apps Agreement is active. In-App Purchase capability is enabled on the App ID (checkbox is grayed out / locked, which I understand is normal). Problem On a real device via TestFlight: RevenueCat SDK configures successfully (public iOS API key present in build). Purchases.getProducts({ productIdentifiers: [...] }) returns { products: [] } — zero products. Because StoreKit returns an empty array, the Sandbox payment sheet never appears when the user taps Subscribe. This is NOT a UI issue — the native SDK call to Apple returns no products. What I've already verified Bundle ID in signed IPA matches ASC app: com.ciborgu.vytalai Subscriptions exist only on the correct app (not on an old typo bundle com.ciborgue.vytalai) Removed duplicate ASC app; old App ID cannot be deleted ("in use by App Store") but has no IAPs Regenerated EAS provisioning profile for com.ciborgu.vytalai Sandbox tester account configured on device (Settings → App Store → Sandbox Account) Tested without VPN / iCloud Private Relay Reinstalled app from TestFlight after ASC changes Waited for propagation after metadata / availability updates Associated Domains enabled (for deep links) — separate from IAP SDK / integration @revenuecat/purchases-capacitor 13.x Direct StoreKit fetch via Purchases.getProducts() (not only RevenueCat offerings) Same result: 0 products from Apple Expected vs actual Expected: StoreKit returns 3 subscription products in Sandbox; payment sheet opens on purchase. Actual: products array is always empty; no payment sheet. Questions Why would StoreKit return 0 products for valid auto-renewable subscriptions on TestFlight when metadata is "Waiting for Review" / in review — shouldn't Sandbox still return products per TN3186? Is there an ASC configuration state (availability, subscription group localization, missing review screenshot on yearly products, etc.) that causes StoreKit to return zero products even in Sandbox? Is there an internal flag or propagation delay on Apple's side I should ask to be reset for this app/bundle? I'm happy to provide additional logs, a sysdiagnose, or a short screen recording from TestFlight showing the empty product response. Thank you for any guidance — this is blocking App Review (Guideline 2.1) and I cannot test IAP at all. Nathan
0
0
52
3d
StoreKit returns 0 subscriptions on TestFlight — Apple IAP payment sheet never opens (Capacitor + RevenueCat)
Hello, I'm developing a Capacitor/Next.js iOS app with RevenueCat for auto-renewable subscriptions. On a real iPhone via TestFlight, StoreKit never returns my subscription products, so the Apple payment sheet never appears. App TestFlight builds tested: 110, 111, 112 (iOS 1.1.0) In-App Purchase capability enabled on App ID Paid Applications Agreement: active Banking/tax: active Subscription product IDs (auto-renewable, same subscription group) vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro (exit offer) What happens Install app from TestFlight on physical iPhone Navigate to paywall App calls RevenueCat → Purchases.getProducts() with the 3 product IDs above StoreKit returns 0 products (or configure/getProducts times out) UI shows: "Apple Store: 0 subscriptions on this device — Sandbox popup cannot open" Tapping subscribe does not open the Apple payment sheet Fallback prices appear (3.49 / 29.99) instead of live App Store prices (3,49 € / 29,99 €), which suggests StoreKit is not returning products. What we already verified Correct bundle ID in build metadata NEXT_PUBLIC_REVENUECAT_API_KEY_IOS (appl_*) embedded in EAS production build Provisioning profile regenerated and active Subscription metadata corrected (was Rejected, now Waiting for Review) All 3 subscriptions attached to app version submission RevenueCat offering "default" with monthly, annual, and annual_intro packages App Store Server Notifications URL configured to RevenueCat Legal pages open in-app (no external cookie banner on native) Testing on TestFlight only (not Safari/web) App Review context We received Guideline 2.1(b) rejections because: Error on purchase page Exit offer (50% OFF / €1.91 per month equivalent) referenced product vytalai_premium_yearly_intro which was not submitted for review initially — now added and submitted with the app version. Question Even with subscriptions in "Waiting for Review" state and metadata completed, should StoreKit Sandbox/TestFlight return these products on device so we can test the payment sheet before approval? If not, what exact App Store Connect state is required for StoreKit to return products on TestFlight? Any guidance on why getProducts would return 0 for valid product IDs on a TestFlight build would be greatly appreciated. Thank you.
2
0
109
3d
Transitioning to performance-based pricing (Stripe) & removing legacy StoreKit subscriptions
Hello everyone, We have a SaaS product and are currently transitioning our business model. Previously, we used a standard recurring subscription model implemented via StoreKit 2 in our iOS app. Recently, we changed our pricing to a performance-based model, where we charge a percentage fee based on the user's specific usage and performance. On our web platform, we use Stripe to calculate and accept these dynamic percentage-based payments. I have two questions regarding this transition for our iOS app: Payment Gateway: Since our new pricing model is a variable, performance-based percentage rather than a fixed subscription, does Apple allow us to integrate Stripe directly into the iOS app to process these payments? The service provided is digital. Removing Old Subscriptions: We have completely commented out all StoreKit code in our app build since we are no longer offering those plans. However, we cannot find a "Delete" option in App Store Connect to remove the old subscription items. What is the proper way to completely remove these from our app's backend and store listing? Any guidance on the best way to handle this transition and remain compliant with App Review would be greatly appreciated. Thank you!
0
0
63
4d
StoreKit purchase cancelled after app backgrounding during bank authentication (3D Secure)
Hello, We are experiencing an issue with StoreKit purchases on iOS. Some users are required by their bank to complete an additional authentication step (3D Secure / banking app validation) during an in-app purchase subscription flow. The purchase starts correctly and StoreKit displays the purchase sheet. When the user temporarily leaves the app to validate the payment in their banking application and then returns, StoreKit eventually reports the purchase as cancelled. No transaction is delivered to StoreKit observers, no entitlement becomes active, and restoring purchases does not find any completed transaction. Steps to reproduce: Open the app. Start an auto-renewable subscription purchase using StoreKit. Authenticate with Apple ID if requested. When the bank authentication screen appears, leave the app and open the banking application. Approve the payment in the banking application. Return to the original app. Observed result: StoreKit reports the purchase as cancelled and no transaction is received. Expected result: The transaction should continue processing after bank authentication and eventually complete successfully. Environment: Xcode 26.3 (17C529) macOS Tahoe 26.3 iOS 26.2.1 Physical iPhone device Question: Is this expected StoreKit behavior when a user leaves the app for external banking authentication, or is there a recommended StoreKit integration pattern that should allow the purchase flow to continue successfully? Thank you.
12
0
365
1w
xcodebuild test (CLI) does not sync .storekit to storekitd on iOS 26.5 — SKTestSession unusable in CI
On iOS 26.5 simulator runtime, running UI tests via xcodebuild test from the command line does not push the scheme's StoreKitConfigurationFileReference to the destination simulator's storekitd AppGroup Octane container. As a consequence, SKTestSession(configurationFileNamed:) either silently falls through to the production App Store (surfacing a "Sign in to Apple Account" SpringBoard alert during paywall tests), or throws SKInternalErrorDomain Code=3 "Error saving configuration file" if you call any SKTestSession instance method. The same project, same scheme, same .storekit file works correctly when launched via Xcode IDE (Cmd+R / Cmd+U) — which uses DVTDevice.handleStoreKitConfigurationSyncForBundleID:configurationFilePath: via an internal IDELaunchSession XPC path that the public xcodebuild CLI does not invoke. This regression makes StoreKit Test unusable in CI for any project using xcodebuild test or xcodebuild test-without-building against an iOS 26.5 simulator. Environment macOS: 26.x Xcode: 26.4.1 (25E253) iOS Simulator runtime affected: 26.5 iOS Simulator runtime that does not exhibit the bug: 26.1 Test target: XCTest UI tests Test plan: *.xctestplan with "storeKitConfiguration": "MyApp.storekit" in defaultOptions Affected scheme actions: Test (CLI) Not affected: Run, Test (Xcode IDE) Steps to Reproduce Create a SwiftUI iOS app com.example.MyApp. Add a MyApp.storekit with one auto-renewable subscription. Add a UI test target. In the xctestplan: defaultOptions.storeKitConfiguration = "MyApp.storekit". In the UI test base case: private var storeKitSession: SKTestSession? override func setUpWithError() throws { storeKitSession = try SKTestSession(configurationFileNamed: "MyApp") app.launch() } Boot a fresh iOS 26.5 simulator. Run via CLI: xcodebuild test \ -project MyApp.xcodeproj \ -scheme MyApp \ -testPlan MyAppUITests \ -destination "platform=iOS Simulator,name=iPhone 17 Pro" In the test, trigger paywall and call Product.purchase(). Expected Product.purchase() presents the StoreKit Test sheet labeled "[Environment] Xcode". Same behavior as Xcode IDE Cmd+U. Actual Production App Store flow triggers. SpringBoard alert "Sign in to Apple Account" appears. Tests waiting on the "Xcode"-labeled sheet fail with Element does not exist. Evidence The simulator's ~/Library/Developer/CoreSimulator/Devices/<UDID>/data/Containers/Shared/AppGroup/<storekit-AGID>/Documents/Persistence/Octane/com.example.MyApp/Configuration.storekit: Present (≈100 KB) when launched via Xcode IDE. Missing when launched via xcodebuild test CLI on the same simulator UDID. Workarounds Attempted (all fail on iOS 26.5) No-op XCTestCase "warmup" that calls XCUIApplication.launch() + sleep — does not trigger the sync because XCUIApplication.launch() routes through XCTRunner, not IDELaunchSession. Multi-destination xcodebuild test with -parallelize-tests-among-destinations. Manually cp-ing the .storekit file into the AppGroup Octane container — storekitd only loads via the XPC channel. launchctl kickstart -k system/com.apple.storekitd — wipes in-memory state, does not pick up disk file. Only working workaround: open project in Xcode IDE, Cmd+R, wait ~20–30 sec, Cmd+., then Cmd+U. Not viable for CI. Related Open Feedback FB22237318 — SKTestSession instance methods (clearTransactions(), failTransactionsEnabled = true) throw SKInternalErrorDomain Code=3 "Error saving configuration file". Discussion thread: https://developer.apple.com/forums/thread/808030 The iOS 26.5 Release Notes (https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes) under StoreKit Test list this issue as resolved in 26.5: "Fixed: SKTestSession may fail to save its configuration file when invoked outside of an Xcode debug session." However, on the public iOS 26.5 simulator runtime the behavior is unchanged — SKTestSession still hits Code=3 on any mutation, and xcodebuild test from CLI still does not sync the .storekit configuration. The 26.5 fix either did not actually ship, or this report describes a distinct but related issue that the fix did not cover. Impact Any CI/CD pipeline running UI tests for apps with StoreKit subscriptions is broken when targeting an iOS 26.5 simulator. Workarounds are either: Pin CI simulator runtime to iOS 26.1. Manually run the project in Xcode IDE before each test run (impossible headless). Has anyone found a CLI-friendly workaround? Or is there an undocumented xcodebuild flag / simctl command that can trigger the same DVTDevice sync from outside the IDE?
5
2
562
1w
Refund old IAPs
My app is being wound down and I'd like to provide a way for people who have purchased the lifetime subscription to get a pro-rated refund. But it seems like older IAPs don't show up on https://reportaproblem.apple.com/ and the in-app refund sheet throws an error when trying to process these refunds ("Your request could not be submitted"). In the in-app refund sheet: Am I doing sth wrong or is this expected behavior? Is there any way I can get a refund for these people? What's the specific cutoff for refunds?
0
0
144
2w
IAP purchase fails in App Review sandbox — error alert shown to reviewer, 2.1(b) rejection
Getting 2.1(b) rejection. Reviewer sees "Purchase Failed" alert. Products configured correctly in ASC. Does App Review sandbox use same sandbox environment as developer testing? Can reviewer sandbox accounts trigger purchase failures that developer sandbox accounts cannot? Any known issues with first-time IAP products failing specifically during App Review sandbox session?
0
0
176
2w
StoreKit 2 currentEntitlements persists after Sandbox Purchase History reset in TestFlight
I am testing a StoreKit 2 non-consumable IAP through TestFlight. Product ID: com.metabolla.plus.lifetime Type: Non-Consumable Environment: TestFlight / Sandbox Transaction.currentEntitlements keeps returning an active entitlement for this product even after: configuring a Sandbox Apple Account clearing Sandbox Purchase History reinstalling the app rebooting the device Important detail: the first TestFlight purchase was completed before configuring the Sandbox Apple Account on the device. If I temporarily change the Product ID in code, the entitlement disappears, so the issue seems tied to the original Product ID/account/receipt. Question: Can a non-consumable TestFlight purchase made before Sandbox Apple Account configuration remain associated with the original TestFlight/Apple ID identity? Is there any supported way to clear this entitlement for testing?
3
0
536
2w
AppTransaction.shared throws StoreKitError code=2 in macOS TestFlight while deviceVerificationID is available
I am implementing device authentication for a macOS app. Our iOS app uses App Attest, but App Attest is not available on macOS, so we are evaluating StoreKit's AppTransaction plus AppStore.deviceVerificationID as the macOS equivalent signal. The issue: in a macOS app installed through TestFlight, AppStore.deviceVerificationID is available, but AppTransaction.shared throws StoreKitError code=2. I reproduced this in a focused standalone macOS test app with no backend and no custom dependencies. Environment: Platform: macOS Distribution: TestFlight App Store Connect app ID: 6769568350 Bundle ID: com.soundcity.AppTransactionProbe App version: 1.0 Build: 1 Observed output from the TestFlight-installed app: Bundle ID: com.soundcity.AppTransactionProbe App version: 1.0 Build: 1 deviceVerificationID available: true deviceVerificationID prefix: CA91ED5D... AppTransaction.shared threw error: StoreKitError; domain=StoreKit.StoreKitError; code=2 The relevant code path is essentially: import StoreKit let deviceVerificationID = try? AppStore.deviceVerificationID let appTransaction = try await AppTransaction.shared In the TestFlight-installed build: AppStore.deviceVerificationID succeeds. AppTransaction.shared throws StoreKitError code=2. Questions: Is AppTransaction.shared expected to work for macOS apps distributed through TestFlight? If yes, what does StoreKitError code=2 indicate in this context, and what setup might be missing? If no, is there an Apple-supported way to obtain an AppTransaction JWS, or equivalent signed App Store/TestFlight app-install assertion, for macOS TestFlight builds? For macOS apps that need a device-bound trust signal comparable to iOS App Attest, is AppStore.deviceVerificationID intended to be used without AppTransaction.shared, or should these APIs be used together? I have a focused Xcode test project that demonstrates the issue and can share it if helpful.
4
0
394
2w
Sandbox testing - Clear Purchase History
Hi, Overview I have an app for which I have created a sandbox account. When I try to clear purchase history it doesn't work, it still shows the in-app purchase items (non-consumable in-app purchases) as purchased. I have tied tried the following ways, but none of them work. Any help on this would be much appreciated! Attempt 1: Go to https://appstoreconnect.apple.com/ Users and Access > Sandbox Check sandbox account > Tap Clear Purchase History button Attempt 2: Go to the iPhone > Settings > Developer > Sandbox Apple Account Tap on account > Manage > Clear Purchase History Attempt 3: Sign out of Sandbox account and sign back in Attempt 4: Delete app and re-run app from Xcode
2
2
258
2w
In-App Purchase Resources
General: Forums topic: StoreKit Forums tag: In-App Purchase App Store Pathway Simple and safe In-App Purchases Auto-renewable subscriptions In-App Purchase documentation Getting started with In-App Purchase using StoreKit views documentation Supporting business model changes by using the app transaction documentation Testing at all stages of development with Xcode and the sandbox documentation App Store Server Notifications documentation App Store Server API documentation Simplifying your implementation by using the App Store Server Library documentation TN3185: Troubleshooting In-App Purchases availability in Xcode technote TN3186: Troubleshooting In-App Purchases availability in the sandbox technote TN3188: Troubleshooting In-App Purchases availability in the App Store technote Understanding StoreKit workflows sample code Implementing a store in your app using the StoreKit API sample code What’s new in StoreKit and In-App Purchase video
Replies
0
Boosts
0
Views
227
Activity
3w
StoreKit 2: Transaction.all and Transaction.currentEntitlements return empty for valid non-consumable purchases in production
FB: https://feedbackassistant.apple.com/feedback/22556883 We're seeing a small number of production users where both Transaction.currentEntitlements and Transaction.all return zero transactions for a valid, active, non-refunded non-consumable IAP. This makes it impossible to restore the purchase via any StoreKit 2 API. Environment: Xcode 26.4 (Build 17E192) iOS 26.4.1 Direct call to SK2 Transactions.all & Flutter in_app_purchase package v3.2.3 (uses SK2 on iOS 15+) Non-consumable IAP (one-time purchase) What we observe: AppStore.sync() triggers but the purchase stream returns 0 transactions Transaction.all returns empty Transaction.currentEntitlements also returns empty User is confirmed on the correct Apple ID Issue reproduces on both iPhone and Mac for the same Apple ID Issue appears to have started recently for users who previously had no problems Debug log from affected production user: [2026-04-20T08:50:10.744115Z] init: iapAvailable=true [2026-04-20T08:50:10.744566Z] init: isPremium=false [2026-04-20T08:50:10.744567Z] init: triggering silent restorePurchases [2026-04-20T08:50:45.974566Z] restore: started [2026-04-20T08:50:45.986848Z] restore: sk2Transactions count=0 [2026-04-20T08:50:45.993004Z] restore: sk2Direct isVerified=false active=null [2026-04-20T08:50:45.993011Z] restore: sk2Direct inconclusive — falling back to standard restore [2026-04-20T08:51:16.000851Z] restore: timed out after 30s — fallback isPremium=false [2026-04-20T08:51:16.000910Z] restore: completed — succeeded=false foundPurchase=false Unable to reproduce in sandbox — Transaction.all works correctly there. Appears specific to production for a small subset of users. Has anyone else seen this?
Replies
23
Boosts
4
Views
2.0k
Activity
4h
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
0
Boosts
0
Views
28
Activity
21h
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
120
Activity
21h
StoreKit returns no in-app subscriptions on TestFlight despite correct App Store Connect configuration
Hello Applet, I’m experiencing an issue with StoreKit on a TestFlight build. My app uses auto-renewable subscriptions through StoreKit and RevenueCat. Configuration already verified: App installed through TestFlight (not debug). Bundle Identifier: com.ciborgu.vytalai Paid Applications agreement is active. In-App Purchase capability is enabled. Three auto-renewable subscriptions exist in App Store Connect. Product IDs match exactly between App Store Connect, RevenueCat and the application. RevenueCat initializes successfully. A Sandbox test account has been created. Tested on a physical iPhone. Device restarted and app reinstalled from TestFlight. VPN and iCloud Private Relay disabled. When attempting to purchase a subscription, the Apple payment sheet never appears. Our diagnostics indicate that StoreKit does not return any available products for the configured Product IDs, preventing the purchase sheet from opening. Expected Product IDs: vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro Could you please verify if there is any issue with the App Store Connect configuration, StoreKit availability, or the processing state of these subscriptions on Apple’s side? If additional logs or diagnostics are required, I can provide them. Thank you. I have already contacted Apple Developer Support regarding this same issue. Previously, I was advised to schedule a technical support meeting. However, when I requested the meeting, my request was declined because of the subject of my issue, so I was unable to speak with an Apple engineer. Since I have now completed all the recommended troubleshooting and the issue still persists, I would greatly appreciate it if this case could be reviewed by the appropriate technical team or a StoreKit engineer. Thank you for your assistance.
Replies
0
Boosts
0
Views
30
Activity
1d
The default message configured through the Retention Message API is not displayed to users
Hello, I have a problem with the Retention Message API. The default message is not displayed to users when they try to cancel their subscription in the device's Settings app. The API configuration was made with Revenue Request. The request to use this API was approved by Apple for our account. After configuring it for the Sandbox environment, everything worked as expected the image and text were displayed to users. Later, I applied the same configuration to the Production environment. I received the Approved status for the message, but after purchasing the subscription from the App Store, although I can see the subscription in Settings, the retention message is not displayed when I attempt to cancel it. I have tried different Apple accounts from different regions (both EU and non-EU) and tested from physical locations without using a VPN. Also, for clarification, we do not use real-time communication only the default retention message. For additional information: I also tried configuring this message from App Store Connect, as shown in WWDC 2026, but this section is not available under the Subscriptions category. When I deactivate and then reactivate the message, I notice that the deactivated state shows the text status "Waiting for sync (0/9)", while the active state shows "Approved". All other assets have an Approved state. In my case, the message is configured for all subscription types without any filters or other restrictions. What could be causing this problem, and how can I fix it? It seems that the issue is not on my side.
Replies
0
Boosts
0
Views
25
Activity
1d
New auto-renewable subscription not appearing in sandbox (getOfferings/StoreKit returns 0) after re-creating the product — new app, not yet approved
I have a new app (first version, not yet approved) with one auto-renewable subscription. Earlier in development, the subscription loaded and I could complete a sandbox purchase (the StoreKit sheet showed "Sandbox", the price, and my sandbox account). To resolve an App Store Connect submission deadlock, I deleted that subscription and created a new one with a new Product ID. Since then, the new subscription does NOT appear in the sandbox: StoreKit returns no products, so getOfferings (via RevenueCat) returns 0 packages — both during App Review and on my own development build signed into a sandbox account. Configuration (all verified): Subscription is "Ready to Submit" / "Waiting for Review" Available in all territories Paid Apps Agreement active; banking and tax complete Bundle ID and shared secret unchanged from when it worked App Review keeps rejecting under Guideline 2.1(b) ("プレミアムをはじめる" / purchase button unresponsive) because the product never loads. Questions: For a newly created IAP on a not-yet-approved app, how long does it take to become available in the sandbox? Is there a known propagation delay (24h+)? Does re-creating the product with a new Product ID reset or delay sandbox availability? Is anything required for a new product to be served in the sandbox before the app's first version is approved? Any guidance appreciated. Thanks!
Replies
1
Boosts
0
Views
71
Activity
2d
Cannot get StoreKit products on watchOS
I'm using Product.products(for:) to get my auto-renewable subscription on watchOS: let products = try await Product.products(for: [<##Identifier##>]) However, it doesn't return any value, and doesn't throw errors. The console shows an error: Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.billingPlanType], expected: StoreKit.BackingValue) Is this a bug or I did't configure something well? This product has been approved by App Review.
Replies
1
Boosts
0
Views
93
Activity
2d
First app release rejected because IAPs didn’t appear, and now the In-App Purchases section is missing from the app version page
I’m trying to submit the first release of my iOS app together with the app’s first consumable in-app purchases, and I’m stuck in what looks like an App Store Connect state issue. My app was already rejected by App Review because the in-app purchases did not appear inside the app when the reviewer opened the paywall. Current setup: First app release Current app version page: iOS App Version 1.0.2 Current attached build: 5 App has never been released before 4 consumable IAPs: com.glowup.credits.100 com.glowup.credits.500 com.glowup.credits.1000 com.glowup.credits.2500 What I see in App Store Connect: All 4 IAPs show Waiting for Review On the iOS App Version 1.0.2 page, the In-App Purchases and Subscriptions section does not appear at all Because of that, I cannot explicitly select or attach the IAPs from the version page What I’ve already done: Uploaded a new build and attached build 5 to version 1.0.2 Removed my local StoreKit configuration file so the app now uses live App Store / StoreKit only Confirmed RevenueCat is configured correctly and sees the offering/packages RevenueCat logs show the products exist remotely, but StoreKit cannot fetch any live products and returns an “offerings empty / none of the products could be fetched” type error RevenueCat also reports the products are still in WAITING_FOR_REVIEW My questions: If the IAPs already show Waiting for Review, are they automatically linked to the current app submission? Is it expected that the In-App Purchases and Subscriptions section can disappear from the app version page in this state? For a first-release app that was already rejected, is attaching a new build and clicking Update Review enough, or is there another step required to associate the IAPs with the resubmission? Has anyone seen App Review reject an app for missing IAPs while the IAPs were still pending review and not yet fetchable from StoreKit? Any guidance from someone who has dealt with this exact first-release + first-IAP submission flow would help a lot.
Replies
2
Boosts
0
Views
256
Activity
2d
Clarification about product with status "Developer Removed from Sale"
Summary After setting a single auto-renewable subscription product (not the app) to "Developer Removed from Sale" in App Store Connect, the next scheduled renewal for an existing active subscriber failed with DID_FAIL_TO_RENEW v2 and expirationIntent = 5 ("expired for some other reason"). I expected expirationIntent = 4 ("product wasn't available for purchase at the time of renewal"), since the product was, in fact, not available for purchase. I would like to confirm whether 5 is the documented/expected value for this scenario, and how to deterministically distinguish "developer removed product from sale" from other renewal failures using the notification payload. Reproduction / observed sequence Day 15: Changed product annual_promo (auto-renewable subscription) status from "Approved" to "Developer Removed from Sale" in App Store Connect. The app itself remained Approved and on sale. Other subscription products in the same group remained Approved. Day 16: An existing active subscriber on that product had a scheduled automatic renewal date. Result: Renewal did not occur. We received a DID_FAIL_TO_RENEW v2 notification. Payload (relevant fields): JWSRenewalInfoDecodedPayload.expirationIntent = 5 JWSRenewalInfoDecodedPayload.autoRenewStatus = 0 Questions Is expirationIntent = 5 the correct/expected value when a renewal fails because the developer removed the product from sale? Or should it have been 4 ("product wasn't available for purchase at the time of renewal")? If 5 is intentional, what is the engineering rationale for not using 4 in this scenario? Given that expirationIntent = 5 is documented as a catch-all ("some other reason"), which other fields in the DID_FAIL_TO_RENEW payload (e.g., subtype, autoRenewStatus, gracePeriodExpiresDate, signedTransactionInfo) should we inspect to deterministically classify the failure cause and isolate "developer removed product from sale" from billing failure / customer cancel / price-increase not accepted / etc.? Context I'm aware of the docs page In-App Purchase statuses and Set availability for an auto-renewable subscription, but they describe the status semantics, not the resulting notification payload. Product has been reverted to "Approved" to avoid further impact on subscribers while this is clarified. Thanks in advance.
Replies
0
Boosts
0
Views
39
Activity
2d
StoreKit returns 0 subscription products in Sandbox/TestFlight — payment sheet never opens (auto-renewable subscriptions)
Hello, I'm developing a consumer iOS app (Capacitor + RevenueCat SDK) and I've been blocked for several weeks on a StoreKit issue: subscription products are never returned to the device, so the Apple payment sheet cannot open. I previously contacted Apple Support. I was told to request a phone call, but my call request was declined because of the topic (StoreKit / in-app purchases). I'm posting here hoping someone from Apple or the community can help. App details App name: Vytal AI Bundle ID: com.ciborgu.vytalai App Store Connect App ID: 6767160542 Team ID: JZF7CR3W8Z Distribution: TestFlight (physical iPhone, France) iOS deployment target: 15+ Subscription product IDs (auto-renewable) vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro All three are in subscription group "Vytal AI" on the correct ASC app (not a typo bundle). Cleared for Sale is ON. Paid Apps Agreement is active. In-App Purchase capability is enabled on the App ID (checkbox is grayed out / locked, which I understand is normal). Problem On a real device via TestFlight: RevenueCat SDK configures successfully (public iOS API key present in build). Purchases.getProducts({ productIdentifiers: [...] }) returns { products: [] } — zero products. Because StoreKit returns an empty array, the Sandbox payment sheet never appears when the user taps Subscribe. This is NOT a UI issue — the native SDK call to Apple returns no products. What I've already verified Bundle ID in signed IPA matches ASC app: com.ciborgu.vytalai Subscriptions exist only on the correct app (not on an old typo bundle com.ciborgue.vytalai) Removed duplicate ASC app; old App ID cannot be deleted ("in use by App Store") but has no IAPs Regenerated EAS provisioning profile for com.ciborgu.vytalai Sandbox tester account configured on device (Settings → App Store → Sandbox Account) Tested without VPN / iCloud Private Relay Reinstalled app from TestFlight after ASC changes Waited for propagation after metadata / availability updates Associated Domains enabled (for deep links) — separate from IAP SDK / integration @revenuecat/purchases-capacitor 13.x Direct StoreKit fetch via Purchases.getProducts() (not only RevenueCat offerings) Same result: 0 products from Apple Expected vs actual Expected: StoreKit returns 3 subscription products in Sandbox; payment sheet opens on purchase. Actual: products array is always empty; no payment sheet. Questions Why would StoreKit return 0 products for valid auto-renewable subscriptions on TestFlight when metadata is "Waiting for Review" / in review — shouldn't Sandbox still return products per TN3186? Is there an ASC configuration state (availability, subscription group localization, missing review screenshot on yearly products, etc.) that causes StoreKit to return zero products even in Sandbox? Is there an internal flag or propagation delay on Apple's side I should ask to be reset for this app/bundle? I'm happy to provide additional logs, a sysdiagnose, or a short screen recording from TestFlight showing the empty product response. Thank you for any guidance — this is blocking App Review (Guideline 2.1) and I cannot test IAP at all. Nathan
Replies
0
Boosts
0
Views
52
Activity
3d
StoreKit returns 0 subscriptions on TestFlight — Apple IAP payment sheet never opens (Capacitor + RevenueCat)
Hello, I'm developing a Capacitor/Next.js iOS app with RevenueCat for auto-renewable subscriptions. On a real iPhone via TestFlight, StoreKit never returns my subscription products, so the Apple payment sheet never appears. App TestFlight builds tested: 110, 111, 112 (iOS 1.1.0) In-App Purchase capability enabled on App ID Paid Applications Agreement: active Banking/tax: active Subscription product IDs (auto-renewable, same subscription group) vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro (exit offer) What happens Install app from TestFlight on physical iPhone Navigate to paywall App calls RevenueCat → Purchases.getProducts() with the 3 product IDs above StoreKit returns 0 products (or configure/getProducts times out) UI shows: "Apple Store: 0 subscriptions on this device — Sandbox popup cannot open" Tapping subscribe does not open the Apple payment sheet Fallback prices appear (3.49 / 29.99) instead of live App Store prices (3,49 € / 29,99 €), which suggests StoreKit is not returning products. What we already verified Correct bundle ID in build metadata NEXT_PUBLIC_REVENUECAT_API_KEY_IOS (appl_*) embedded in EAS production build Provisioning profile regenerated and active Subscription metadata corrected (was Rejected, now Waiting for Review) All 3 subscriptions attached to app version submission RevenueCat offering "default" with monthly, annual, and annual_intro packages App Store Server Notifications URL configured to RevenueCat Legal pages open in-app (no external cookie banner on native) Testing on TestFlight only (not Safari/web) App Review context We received Guideline 2.1(b) rejections because: Error on purchase page Exit offer (50% OFF / €1.91 per month equivalent) referenced product vytalai_premium_yearly_intro which was not submitted for review initially — now added and submitted with the app version. Question Even with subscriptions in "Waiting for Review" state and metadata completed, should StoreKit Sandbox/TestFlight return these products on device so we can test the payment sheet before approval? If not, what exact App Store Connect state is required for StoreKit to return products on TestFlight? Any guidance on why getProducts would return 0 for valid product IDs on a TestFlight build would be greatly appreciated. Thank you.
Replies
2
Boosts
0
Views
109
Activity
3d
StoreKit problem
StoreKit getProducts returns 0 subscriptions on TestFlight for product IDs vytalai_premium_monthly, vytalai_premium_yearly, vytalai_premium_yearly_intro (bundle com.ciborgu.vytalai, build 112+). All metadata submitted, Paid Apps Agreement active. Please check why Sandbox catalog is empty for this app.
Replies
0
Boosts
0
Views
50
Activity
4d
Transitioning to performance-based pricing (Stripe) & removing legacy StoreKit subscriptions
Hello everyone, We have a SaaS product and are currently transitioning our business model. Previously, we used a standard recurring subscription model implemented via StoreKit 2 in our iOS app. Recently, we changed our pricing to a performance-based model, where we charge a percentage fee based on the user's specific usage and performance. On our web platform, we use Stripe to calculate and accept these dynamic percentage-based payments. I have two questions regarding this transition for our iOS app: Payment Gateway: Since our new pricing model is a variable, performance-based percentage rather than a fixed subscription, does Apple allow us to integrate Stripe directly into the iOS app to process these payments? The service provided is digital. Removing Old Subscriptions: We have completely commented out all StoreKit code in our app build since we are no longer offering those plans. However, we cannot find a "Delete" option in App Store Connect to remove the old subscription items. What is the proper way to completely remove these from our app's backend and store listing? Any guidance on the best way to handle this transition and remain compliant with App Review would be greatly appreciated. Thank you!
Replies
0
Boosts
0
Views
63
Activity
4d
StoreKit purchase cancelled after app backgrounding during bank authentication (3D Secure)
Hello, We are experiencing an issue with StoreKit purchases on iOS. Some users are required by their bank to complete an additional authentication step (3D Secure / banking app validation) during an in-app purchase subscription flow. The purchase starts correctly and StoreKit displays the purchase sheet. When the user temporarily leaves the app to validate the payment in their banking application and then returns, StoreKit eventually reports the purchase as cancelled. No transaction is delivered to StoreKit observers, no entitlement becomes active, and restoring purchases does not find any completed transaction. Steps to reproduce: Open the app. Start an auto-renewable subscription purchase using StoreKit. Authenticate with Apple ID if requested. When the bank authentication screen appears, leave the app and open the banking application. Approve the payment in the banking application. Return to the original app. Observed result: StoreKit reports the purchase as cancelled and no transaction is received. Expected result: The transaction should continue processing after bank authentication and eventually complete successfully. Environment: Xcode 26.3 (17C529) macOS Tahoe 26.3 iOS 26.2.1 Physical iPhone device Question: Is this expected StoreKit behavior when a user leaves the app for external banking authentication, or is there a recommended StoreKit integration pattern that should allow the purchase flow to continue successfully? Thank you.
Replies
12
Boosts
0
Views
365
Activity
1w
xcodebuild test (CLI) does not sync .storekit to storekitd on iOS 26.5 — SKTestSession unusable in CI
On iOS 26.5 simulator runtime, running UI tests via xcodebuild test from the command line does not push the scheme's StoreKitConfigurationFileReference to the destination simulator's storekitd AppGroup Octane container. As a consequence, SKTestSession(configurationFileNamed:) either silently falls through to the production App Store (surfacing a "Sign in to Apple Account" SpringBoard alert during paywall tests), or throws SKInternalErrorDomain Code=3 "Error saving configuration file" if you call any SKTestSession instance method. The same project, same scheme, same .storekit file works correctly when launched via Xcode IDE (Cmd+R / Cmd+U) — which uses DVTDevice.handleStoreKitConfigurationSyncForBundleID:configurationFilePath: via an internal IDELaunchSession XPC path that the public xcodebuild CLI does not invoke. This regression makes StoreKit Test unusable in CI for any project using xcodebuild test or xcodebuild test-without-building against an iOS 26.5 simulator. Environment macOS: 26.x Xcode: 26.4.1 (25E253) iOS Simulator runtime affected: 26.5 iOS Simulator runtime that does not exhibit the bug: 26.1 Test target: XCTest UI tests Test plan: *.xctestplan with "storeKitConfiguration": "MyApp.storekit" in defaultOptions Affected scheme actions: Test (CLI) Not affected: Run, Test (Xcode IDE) Steps to Reproduce Create a SwiftUI iOS app com.example.MyApp. Add a MyApp.storekit with one auto-renewable subscription. Add a UI test target. In the xctestplan: defaultOptions.storeKitConfiguration = "MyApp.storekit". In the UI test base case: private var storeKitSession: SKTestSession? override func setUpWithError() throws { storeKitSession = try SKTestSession(configurationFileNamed: "MyApp") app.launch() } Boot a fresh iOS 26.5 simulator. Run via CLI: xcodebuild test \ -project MyApp.xcodeproj \ -scheme MyApp \ -testPlan MyAppUITests \ -destination "platform=iOS Simulator,name=iPhone 17 Pro" In the test, trigger paywall and call Product.purchase(). Expected Product.purchase() presents the StoreKit Test sheet labeled "[Environment] Xcode". Same behavior as Xcode IDE Cmd+U. Actual Production App Store flow triggers. SpringBoard alert "Sign in to Apple Account" appears. Tests waiting on the "Xcode"-labeled sheet fail with Element does not exist. Evidence The simulator's ~/Library/Developer/CoreSimulator/Devices/<UDID>/data/Containers/Shared/AppGroup/<storekit-AGID>/Documents/Persistence/Octane/com.example.MyApp/Configuration.storekit: Present (≈100 KB) when launched via Xcode IDE. Missing when launched via xcodebuild test CLI on the same simulator UDID. Workarounds Attempted (all fail on iOS 26.5) No-op XCTestCase "warmup" that calls XCUIApplication.launch() + sleep — does not trigger the sync because XCUIApplication.launch() routes through XCTRunner, not IDELaunchSession. Multi-destination xcodebuild test with -parallelize-tests-among-destinations. Manually cp-ing the .storekit file into the AppGroup Octane container — storekitd only loads via the XPC channel. launchctl kickstart -k system/com.apple.storekitd — wipes in-memory state, does not pick up disk file. Only working workaround: open project in Xcode IDE, Cmd+R, wait ~20–30 sec, Cmd+., then Cmd+U. Not viable for CI. Related Open Feedback FB22237318 — SKTestSession instance methods (clearTransactions(), failTransactionsEnabled = true) throw SKInternalErrorDomain Code=3 "Error saving configuration file". Discussion thread: https://developer.apple.com/forums/thread/808030 The iOS 26.5 Release Notes (https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes) under StoreKit Test list this issue as resolved in 26.5: "Fixed: SKTestSession may fail to save its configuration file when invoked outside of an Xcode debug session." However, on the public iOS 26.5 simulator runtime the behavior is unchanged — SKTestSession still hits Code=3 on any mutation, and xcodebuild test from CLI still does not sync the .storekit configuration. The 26.5 fix either did not actually ship, or this report describes a distinct but related issue that the fix did not cover. Impact Any CI/CD pipeline running UI tests for apps with StoreKit subscriptions is broken when targeting an iOS 26.5 simulator. Workarounds are either: Pin CI simulator runtime to iOS 26.1. Manually run the project in Xcode IDE before each test run (impossible headless). Has anyone found a CLI-friendly workaround? Or is there an undocumented xcodebuild flag / simctl command that can trigger the same DVTDevice sync from outside the IDE?
Replies
5
Boosts
2
Views
562
Activity
1w
Refund old IAPs
My app is being wound down and I'd like to provide a way for people who have purchased the lifetime subscription to get a pro-rated refund. But it seems like older IAPs don't show up on https://reportaproblem.apple.com/ and the in-app refund sheet throws an error when trying to process these refunds ("Your request could not be submitted"). In the in-app refund sheet: Am I doing sth wrong or is this expected behavior? Is there any way I can get a refund for these people? What's the specific cutoff for refunds?
Replies
0
Boosts
0
Views
144
Activity
2w
IAP purchase fails in App Review sandbox — error alert shown to reviewer, 2.1(b) rejection
Getting 2.1(b) rejection. Reviewer sees "Purchase Failed" alert. Products configured correctly in ASC. Does App Review sandbox use same sandbox environment as developer testing? Can reviewer sandbox accounts trigger purchase failures that developer sandbox accounts cannot? Any known issues with first-time IAP products failing specifically during App Review sandbox session?
Replies
0
Boosts
0
Views
176
Activity
2w
StoreKit 2 currentEntitlements persists after Sandbox Purchase History reset in TestFlight
I am testing a StoreKit 2 non-consumable IAP through TestFlight. Product ID: com.metabolla.plus.lifetime Type: Non-Consumable Environment: TestFlight / Sandbox Transaction.currentEntitlements keeps returning an active entitlement for this product even after: configuring a Sandbox Apple Account clearing Sandbox Purchase History reinstalling the app rebooting the device Important detail: the first TestFlight purchase was completed before configuring the Sandbox Apple Account on the device. If I temporarily change the Product ID in code, the entitlement disappears, so the issue seems tied to the original Product ID/account/receipt. Question: Can a non-consumable TestFlight purchase made before Sandbox Apple Account configuration remain associated with the original TestFlight/Apple ID identity? Is there any supported way to clear this entitlement for testing?
Replies
3
Boosts
0
Views
536
Activity
2w
AppTransaction.shared throws StoreKitError code=2 in macOS TestFlight while deviceVerificationID is available
I am implementing device authentication for a macOS app. Our iOS app uses App Attest, but App Attest is not available on macOS, so we are evaluating StoreKit's AppTransaction plus AppStore.deviceVerificationID as the macOS equivalent signal. The issue: in a macOS app installed through TestFlight, AppStore.deviceVerificationID is available, but AppTransaction.shared throws StoreKitError code=2. I reproduced this in a focused standalone macOS test app with no backend and no custom dependencies. Environment: Platform: macOS Distribution: TestFlight App Store Connect app ID: 6769568350 Bundle ID: com.soundcity.AppTransactionProbe App version: 1.0 Build: 1 Observed output from the TestFlight-installed app: Bundle ID: com.soundcity.AppTransactionProbe App version: 1.0 Build: 1 deviceVerificationID available: true deviceVerificationID prefix: CA91ED5D... AppTransaction.shared threw error: StoreKitError; domain=StoreKit.StoreKitError; code=2 The relevant code path is essentially: import StoreKit let deviceVerificationID = try? AppStore.deviceVerificationID let appTransaction = try await AppTransaction.shared In the TestFlight-installed build: AppStore.deviceVerificationID succeeds. AppTransaction.shared throws StoreKitError code=2. Questions: Is AppTransaction.shared expected to work for macOS apps distributed through TestFlight? If yes, what does StoreKitError code=2 indicate in this context, and what setup might be missing? If no, is there an Apple-supported way to obtain an AppTransaction JWS, or equivalent signed App Store/TestFlight app-install assertion, for macOS TestFlight builds? For macOS apps that need a device-bound trust signal comparable to iOS App Attest, is AppStore.deviceVerificationID intended to be used without AppTransaction.shared, or should these APIs be used together? I have a focused Xcode test project that demonstrates the issue and can share it if helpful.
Replies
4
Boosts
0
Views
394
Activity
2w
Sandbox testing - Clear Purchase History
Hi, Overview I have an app for which I have created a sandbox account. When I try to clear purchase history it doesn't work, it still shows the in-app purchase items (non-consumable in-app purchases) as purchased. I have tied tried the following ways, but none of them work. Any help on this would be much appreciated! Attempt 1: Go to https://appstoreconnect.apple.com/ Users and Access > Sandbox Check sandbox account > Tap Clear Purchase History button Attempt 2: Go to the iPhone > Settings > Developer > Sandbox Apple Account Tap on account > Manage > Clear Purchase History Attempt 3: Sign out of Sandbox account and sign back in Attempt 4: Delete app and re-run app from Xcode
Replies
2
Boosts
2
Views
258
Activity
2w