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

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?
24
5
3.8k
Aug ’26
Transaction.currentEntitlements and subscription.status both return empty for active production subscription
Product: Auto-renewable annual subscription Environment: Production iOS version: 26.6 StoreKit version: StoreKit 2 I have an active subscription that shows correctly in the App Store app, but neither Transaction.currentEntitlements nor Product.SubscriptionInfo.Status (via subscription.status) return any record of it — both come back empty. What I've checked: Transaction.currentEntitlements — iterated fully, zero transactions found for this product ID Product.SubscriptionInfo.Status — checked independently as a second signal, also returns no active status for this product AppStore.sync() — called before checking entitlements, completes successfully, does not resolve the issue Settings → [Apple ID] → Subscriptions on-device — does not show this subscription "Restore Purchases" in-app — consistently reports nothing found Impact: Since my app gates access behind an active entitlement check, this means the user is stuck on the paywall screen indefinitely, despite having a valid, active, paid subscription. There's no client-side workaround, since every available StoreKit 2 API reports no entitlement exists. Code pattern (simplified): swift for await result in Transaction.currentEntitlements { if case .verified(let transaction) = result, transaction.productID == productID { // never reached for this product } } if let subscription = product.subscription { let statuses = try await subscription.status // statuses is empty / doesn't reflect the active subscription } This looks consistent with the pattern reported in thread 823454, where currentEntitlements and Transaction.all return empty for valid, non-refunded purchases in production for a small number of users. In my case, this is affecting a currently active subscription — not a refunded or expired one — and is reproducible on this account across multiple app builds. Has anyone found a reliable workaround, or is this being tracked by Apple as an active known issue beyond the fix already applied for the non-Gregorian calendar case (which doesn't apply here)?
0
0
649
Aug ’26
iOS26.4,appStoreReceiptURL获取票据延迟
iOS 26.4系统上,我们发现三个问题: 1.调用了finishTransaction接口,但是在App重新启动后,[SKPaymentQueue defaultQueue].transactions仍然会有这笔订单。 2.支付完成后,[[NSBundle mainBundle] appStoreReceiptURL]],拿到的票据解析出来里面的商品是空的,需要延迟2秒钟左右在调用[[NSBundle mainBundle] appStoreReceiptURL]]才能获取有效票据。 3.支付完成后,如果用户没有点击最后弹出的确认弹框,等待5秒钟,系统会自己回调 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions; 代理方法。正常应该是用户点击了最后弹出的确认弹框,在回调- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions;方法。 我们在苹果开发者论坛上面找到其他开发者反馈的类似问题,链接如下: https://developer.apple.com/forums/thread/817700 https://developer.apple.com/forums/thread/792437?answerId=849557022#849557022 https://developer.apple.com/forums/thread/817834 https://developer.apple.com/forums/thread/817706 https://developer.apple.com/forums/thread/818586 我们有大量用户升级到了26.4系统,这对于我们造成了巨大的困扰,我们需要你们的帮助,感谢!
8
1
1.9k
Aug ’26
Production SKAdNetwork postbacks remain version 3.0 instead of 4.0
We are investigating SKAdNetwork attribution for a production iOS app distributed through the App Store. Bundle ID: com.stencilstudio.app App Store ID: 6760613806 We receive real winning SKAdNetwork postbacks directly from the App Store at our attribution endpoint. The raw Apple payloads consistently contain: version: "3.0" campaign-id: 25 did-win: true Some postbacks also include a valid fine conversion value, for example: conversion-value: 1 However, we have not received postbacks containing: version: "4.0" source-identifier postback-sequence-index coarse-conversion-value The advertising network is Meta. The advertised app is App Store distributed and has an iOS deployment target of 16.1. We are trying to understand one specific technical point: What determines whether the resulting production attribution postback is SKAdNetwork 3.0 or 4.0? In particular: Is the postback version determined by the SKAdNetwork version used by the ad network when signing the winning ad impression? Can anything on the advertised-app side, such as an entitlement, App Store Connect setting, build configuration, registration state, or SDK configuration, cause an attribution to remain on version 3.0? Is there any advertiser-side diagnostic that allows the advertised-app developer to determine which SKAdNetwork version the winning impression was signed with? Given that the postbacks themselves explicitly contain version: "3.0", is there any other condition we should verify on the advertised-app side before asking the ad network to investigate how its impressions are being signed? Example raw postback received directly from the App Store: { "app-id": 6760613806, "fidelity-type": 1, "conversion-value": 1, "campaign-id": 25, "did-win": true, "version": "3.0", "ad-network-id": "v9wttpbfk9.skadnetwork", "redownload": false } We can provide additional production postbacks if useful.
0
0
420
Aug ’26
StoreKit 2: Does Transaction.currentEntitlements get updated when my app isn't running?
TL;DR: Does iOS automatically receive App Store transaction updates in the background when internet connection is available so the backing storage state of Transaction.currentEntitlements gets synced even when my app is not running? Or does iOS update Transaction.currentEntitlements only when my app is running? The long version: Imagine the following situation: A user has purchased a non-consumable IAP in my app and is granted the locked premium content. The IAP transaction is now present in Transaction.currentEntitlements (it's also cached locally). The user blocks internet access every time before my app gets opened (either enables the Airplane mode and/or disconnects from the Wi-Fi before launching my app). So from this point on, my app never gets a chance to connect to the internet. The user gets refunded for the IAP. The user uses their iPhone to browse the internet via Safari, checks emails, etc. Then, before launching my app, the user blocks internet access. My app gets is launched (without internet access) and reads entitlements from Transaction.currentEntitlements. The question is: does the StoreKit service know that the IAP has been refunded? Did iOS update the local cached storage of Transaction.currentEntitlements while the user was connected to the internet in step 4? Or will Transaction.currentEntitlements contain the old state from step 1 so the app won't know about the refund and the user will be able to use my app's premium content which has been refunded by now? Is the behavior the same for auto-renewable subscriptions as it is for non-consumable IAPs?
0
0
584
Aug ’26
StoreKit 2: products load with correct prices but purchase fails immediately with "Item Unavailable" (app not yet approved)
Our app sells two auto-renewable subscriptions. Product loading succeeds and returns both products with correct localized prices, but every purchase attempt fails roughly one second later with "Item Unavailable". No purchase sheet is ever presented to the user. The app has not yet passed its first App Review. It was rejected under Guideline 2.1(b) because the reviewer encountered this same error on their device. MY QUESTION Under what conditions does StoreKit reject a purchase with "Item Unavailable" for a product that has just been returned successfully, with a valid localized price, by a product request? Is an auto-renewable subscription transactable in the sandbox environment for an app that has never had a binary approved by App Review? Question 2 is the one I most need answered. App Review's rejection states that In-App Purchase products "do not need prior approval to function in review", but neither we nor the reviewer can transact them. DIAGNOSTIC LOG Captured on-device during a failing session: 01:08:56 fetchProducts [com.aurascanner.app.pro.weekly, com.aurascanner.app.pro.annual] 01:08:56 fetchProducts -> 2 product(s): com.aurascanner.app.pro.annual=$39.99; com.aurascanner.app.pro.weekly=$6.99 01:08:56 requestPurchase sku=com.aurascanner.app.pro.weekly 01:08:57 purchaseError: code=purchase-error msg=Item Unavailable 01:08:57 error code=purchase-error, storefront=USA 01:09:05 fetchProducts -> 2 product(s), same prices returned again 01:09:05 requestPurchase sku=com.aurascanner.app.pro.annual 01:09:06 requestPurchase threw: Item Unavailable 01:09:06 error code=purchase-error, storefront=USA An introductory-offer eligibility check earlier in the session also succeeded, using the subscription group ID read from the loaded product. So product metadata, including the subscription group, resolves correctly. CONDITIONS Fails identically for both products, on every attempt. Reproduces in TestFlight on our own devices and Apple IDs. Also failed during App Review on iPad Air 11-inch (M3), iPadOS 26.5.2. Storefront reports as USA in every case. Real devices only. Not reproduced on Simulator. ALREADY VERIFIED Paid Applications Agreement: Active, banking and tax information complete. In-App Purchase capability: enabled on the App ID at Certificates, Identifiers & Profiles. Bundle identifier com.aurascanner.app matches the App Store Connect record. Both subscriptions: complete metadata, review screenshots uploaded, USD pricing set, United States availability. Both subscriptions and the subscription group are attached to the current submission, status "Ready for Review". Subscription group has a localized display name. Build distributed via TestFlight, which routes purchases to sandbox automatically. IMPLEMENTATION The app is React Native and uses a wrapper library over StoreKit 2, but the error text originates from StoreKit rather than the wrapper, and the call order follows the documented pattern: Initialize the StoreKit connection. Load products. This succeeds and returns both products. Register transaction update and error listeners. Request the purchase. This is where it fails. Purchases are verified server-side using Apple's App Store Server Library, and the transaction is finished only after verification succeeds. I am not asking anyone to debug the wrapper. My question is about StoreKit and App Store behaviour: what causes the store to quote a product and then decline to sell it? Any pointers appreciated. I can supply screenshots or the full log.
2
1
1.3k
Aug ’26
Transaction.currentEntitlements sometimes does not emit a result until device is reboot
I have the typical StoreKit 2 manager class, where I check currentEntitlements for subscription. I have filed a feedback (FB22349195), I hope someone can take a look at it. func updateCustomerProductStatus() async { var activeSubscription: String? = nil // BUG: In some cases the currentEntitlements does not emit a transaction until the device is reboot for await result in Transaction.currentEntitlements { print("Found transaction: \(result)") // This print does not appear until a restart! do { let transaction = try checkVerified(result) // Skip revoked transactions if transaction.revocationDate != nil { print("Skipping revoked transaction for \(transaction.productID)") continue } // Skip expired subscriptions if let expirationDate = transaction.expirationDate, expirationDate < Date() { print("Skipping expired subscription for \(transaction.productID)") continue } // Check product type switch transaction.productType { case .autoRenewable: activeSubscription = transaction.productID default: break } } catch { print("Unable to verify transaction: \(error)") } } // Update state once after processing all entitlements self.activeSubscription = activeSubscription print("updateCustomerProductStatus() activeSubscription: \(activeSubscription ?? "nil")") } There is some unexpected behavior where the currentEntitlements does not emit a result until the iPhone device is reboot. This bug appeared in iOS 26.4 (and in the betas).
3
3
1.6k
Aug ’26
purchase() always fails with ASDServerErrorDomain 3504 (productUnavailable) in Sandbox, while products(for:) succeeds — all 3 IAPs, JPN storefront
Summary: In Sandbox, Product.products(for:) returns all 3 of my IAPs with correct JPY prices and Japanese localizations, but product.purchase() fails immediately — the payment sheet is never presented — with ASDServerErrorDomain Code=3504 (Product.PurchaseError.productUnavailable). All 3 products fail identically. Reproduction captured in the sysdiagnose attached to FB24067333: 2026-07-30 18:43:58 JST — in-app purchase() on app.negaiboshi.placement; 18:44:40 JST — OS-level test (Settings > Developer > Sandbox Apple Account > Manage > Start Transaction), same product ID. Server correlation keys from the device log: inAppBuy → AMSServerCorrelationKey HNB5UGLE72AXSMY5KY7G4NAXQY (failureType 3504); Start Transaction → FQN4Y4JOEHYBW2GIR7KPTYTB2A (AMSServerErrorCode 3766, "provided product ID or bundle ID is invalid"). Environment App: Negaiboshi — Apple ID 6794682125, Bundle ID app.negaiboshi, Team 778QPP83C4 App status: first submission in preparation (never reviewed); build 1.0 (1) on TestFlight IAPs (all "Ready to Submit" since 2026-07-27 JST, attached to the 1.0 submission): app.negaiboshi.pro.monthly (auto-renewable, ¥480, group 22264517), app.negaiboshi.placement (non-consumable, ¥720), app.negaiboshi.nightsky (non-consumable, ¥1,200) IAP base country: Japan (JPY); availability 145/175 countries Device: iPhone, iOS 26.5.2; development build from Xcode; StoreKit Configuration = None Sandbox Apple Account: (address in FB24067333), region Japan, no purchase history; signed in under Settings > Developer Storefront.current = JPN. No Screen Time restrictions. Actual error (verbatim): Error Domain=ASDServerErrorDomain Code=3504 "このアイテムは見つかりませんでした。" UserInfo={AMSServerErrorCode=3504, client-environment-type=Sandbox, storefront-country-code=JPN} TN3186 checklist fully verified, none apply (Paid Apps Agreement, banking, tax all active; bundle ID + IAP capability; signing; membership). Also tried: Sandbox sign-out/sign-in, device restart — no change. Consistent across all 3 products and relaunches. Reproduced with zero app code involved (decisive): Settings > Developer > Start Transaction with product ID app.negaiboshi.placement and bundle ID app.negaiboshi fails: "The provided product ID or bundle ID is invalid. [Environment: Sandbox]" — Apple's own OS-level tool, no third-party code. Calibration: a deliberately nonexistent ID (app.negaiboshi.zzz) yields the identical error — the backend treats my real product like a nonexistent one. A price change (¥720→¥700, "now", 2026-07-29) propagated to the sandbox metadata catalog within minutes (products(for:) returned "¥700") — purchase() still 3504. Reverted. A full base-country change (2026-07-30): Japan (¥720) → United States ($4.99) at 15:52 JST — this deletes and recreates the price schedule and is the exact operation that resolved the identical symptom in thread 839557. It propagated to the metadata catalog (auto-converted ¥800 shown in ~20 min), yet purchase() and Start Transaction still failed at 16:10 and 16:55 JST. Reverted to ¥720 at 16:59 JST. Every lever that rewrites the price schedule reaches the metadata catalog but never the commerce/purchase catalog. Timeline: the products reached Ready to Submit hours after the 2026-07-26 15:22–17:58 PDT In-App Purchases outage (Message ID 1000005803), and the failure still reproduces after the 2026-07-29 16:20–19:30 PDT emergency maintenance on In-App Purchases + Advanced Commerce API (messageId 1000005805). Peer reports with the same metadata-vs-commerce-catalog split in the same window: threads 839220, 839441, 839437, 839645, 839557. Questions: Why does purchase() fail server-side with 3504 ("item not found") while products(for:) succeeds for the same IDs in the same JPN storefront? Can someone check the sandbox commerce-catalog state of the 3 product IDs above (Apple ID 6794682125)? This looks like a server-side provisioning failure that no developer-side action can repair. Is any additional App Store Connect state required before sandbox purchases can complete for a never-yet-reviewed app?
1
0
1.3k
Aug ’26
AppTransaction.shared fails with SKServerErrorDomain Code=-1 across all install methods (sandbox) — stumped after ruling out everything checkable
Hi all, I've been debugging a persistent sandbox StoreKit issue for a while now and have ruled out everything I can check from my end. Posting the full picture here in case anyone recognizes this pattern or has advice — genuinely stuck. The core problem AppTransaction.shared (StoreKit 2) consistently fails with: Error Domain=SKServerErrorDomain Code=-1 "(null)" UserInfo={storefront-country-code=AUS, client-environment-type=Sandbox} A real purchase attempt separately fails with: Error Domain=ASDServerErrorDomain Code=3504 "This item cannot be found." UserInfo={storefront-country-code=AUS, AMSServerErrorCode=3504, client-environment-type=Sandbox} What's confirmed working (so I can rule these out as the cause) Product catalog/pricing fetch — real price, title, currency load correctly every time canMakePayments → true getStorefront → AUS, correctly App Store Connect account: Paid Apps Agreement Active, Free Apps Agreement Active, bank account Active, all 3 tax forms Active (ABN/GST, Certificate of Foreign Status, W-8BEN) The IAP itself: correctly configured (com.subwizard.subwizard.unlock, Non-Consumable, "Ready for Review" status) App code: verified twice independently — product ID, type, and registration are all correct, no bugs found Xcode's local StoreKit Configuration file (fully simulated, no network): confirms my purchase/entitlement code works correctly end-to-end when StoreKit cooperates — so this isn't a code bug What's confirmed failing — identically, across every method I've tried Raw Xcode Debug build, installed directly to a real device TestFlight (Internal Testing) install A fresh Xcode Release-configuration run Same error, same domain, same code, every single time: AppTransaction.shared fetch, receipt refresh, Restore Purchases, and the actual purchase attempt (different code, 3504, but same underlying pattern). The pattern that stands out Everything that's a simple read of the public catalog (what does this app sell, what's the price) works. Everything requiring Apple's servers to process something tied to my specific account's transaction/commerce state (transaction history, an actual purchase) fails. My leading theory This is a brand-new Individual Apple Developer account. The Paid Apps Agreement only went Active 5 days before I started testing this. First-ever IAP product, first-ever real purchase attempt on the account. I'm wondering if this is a propagation/settling delay on Apple's commerce backend that the "Active" UI status doesn't fully reflect — I found a few other forum threads where Apple's own response to error 3504 specifically was to double check the Paid Apps Agreement/tax/banking, even in cases where it already showed as complete. What I've already ruled out App Store submission status — per Apple's TN3186 doc and other DTS-engineer forum replies I found, sandbox purchases shouldn't require app/IAP submission or approval at all A raw Xcode install lacking a "real acquisition record" that TestFlight would have — tested directly, TestFlight failed identically Sandbox tester account misconfiguration — sign-in works fine, tester accounts are valid and usable Where things stand right now Given everything above checked out clean, I went ahead and submitted the app + this IAP for App Review, partly just to see whether that changes anything, and partly because I need to actually ship at some point regardless. If it gets approved and the purchase works for the reviewer, that would at least tell me production is fine even if sandbox stays broken — I can live with that. But if it comes back rejected specifically because the purchase doesn't work, I'm genuinely out of ideas on what else to check from my side.
1
0
439
Aug ’26
First auto-renewable subscription: sandbox purchase fails with (4040004) App not found / AMS 3504
Summary Sandbox purchases of our first auto-renewable subscription fail with "This item cannot be found". Product metadata loads correctly, so this looks specific to commerce. Our App Store Connect configuration is complete and has been verified exhaustively, and four other apps on the same team sell in-app purchases in production without issue. The affected app has never been submitted or released, and the subscription sits in "Ready to Submit". Symptoms On device (TestFlight build, purchasing with the tester's real Apple Account - no sandbox Apple Account is configured, per the documented TestFlight flow), a purchase attempt returns storeProductNotAvailable and the system alert "Item Unavailable". Device logs (idevicesyslog) show: mzstorekit-sb.itunes.apple.com/inApps/v2/history -> HTTP 404, (4040004) App not found sandbox.itunes.apple.com/.../inAppBuy -> AMSErrorDomain 305, AMSServerErrorCode=3504, "This item cannot be found" Product.products(for:) returns the product and the paywall renders product.displayPrice, so product metadata resolves. Only the purchase fails. Server-side observation Using the App Store Server API in the sandbox environment with our team key, requesting a deliberately non-existent transaction ID: GET https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/1234567890 App Products Released? Result The affected app 1 subscription, Ready to Submit never HTTP 401, empty body Another app, same team non-consumable, Approved yes 404 4040010 Transaction id not found Another app, same team 2 non-consumables, Approved yes 404 4040010 Transaction id not found Another app, same team 2 non-consumables, Approved yes 404 4040010 Transaction id not found Another app, same team non-consumable, Approved yes 404 4040010 Transaction id not found Same key, same issuer, same team, same request shape - only the bid claim differs. We note openly that this is not a clean experiment: all four comparison apps differ from the affected app in two ways at once (they are released, and they have approved products), so the 401 may simply reflect an app with no approved commerce products rather than a missing app record. We include it because the difference is stark and reproducible, not because we think it is conclusive. What makes this app different Being unreleased does not by itself appear to be the barrier: we were able to test the in-app purchases of the four apps above in the sandbox before those apps were released. The difference we cannot account for is product type and approval state - those were one-time non-consumables, whereas this is our first auto-renewable subscription, which App Store Connect tells us "must be submitted with a new app version" and which has therefore never been approved. Timeline 2026-07-30 ~00:30 CEST - Pricing and Availability set for the app (it had been unset; that was the cause of an earlier, separate failure). 2026-07-30 09:26 CEST - captured the device logs above. 2026-07-31 00:50 CEST - toggled a territory's availability off and back on to force a re-propagation of the availability record. No change. 2026-07-31 - still failing 24+ hours on. Automated probes every 30 minutes throughout have returned the same result without exception. This is well beyond the "up to 1 hour" propagation window documented in TN3186. Already verified Account level - four other apps on this same team currently sell in-app purchases in production: Paid Apps agreement: Active Banking and tax information: complete and active App Store Connect configuration for the affected app: App availability: 175 of 175 territories, none excluded Subscription availability: 175 of 175 territories Subscription priced in all 175 territories Four localizations and the review screenshot present; group localized; subscription state Ready to Submit App price: Free Every territory reads CANNOT_SELL / AVAILABLE_FOR_SALE_UNRELEASED_APP, consistent with an app that has not yet been released Client / build: Product ID in code matches App Store Connect exactly Explicit App ID (no wildcard), In-App Purchase capability enabled Build signed with Apple Distribution, delivered via Transporter, tested from TestFlight (not a development build) No StoreKit configuration file active in the scheme Bundle ID matches the App Store Connect record Questions Is the subscription provisioned for commerce in the sandbox environment? The (4040004) App not found response suggests the app or its commerce record is not present there. TN3186 states that sandbox testing does not require submitting in-app purchases for review. Does that hold for an app's first auto-renewable subscription, given that such a subscription must be submitted alongside an app version and so cannot reach an approved state beforehand? If submitting the app version together with the subscription is in fact the prerequisite, please confirm - we are currently holding our submission specifically so we can complete one successful sandbox purchase first, since App Review purchases through this same environment. If that ordering is not possible, we would rather submit and have App Review encounter the working production path than keep waiting on a sandbox purchase that cannot succeed. Happy to provide the app's Apple ID and product identifier privately if that helps.
1
0
901
Jul ’26
SKStoreReviewController.requestReview limits not working?
We're currently having an issue with our app where the review prompt is displaying for the user too often. I know the documentation says that: If the person hasn’t rated or reviewed your app on this device, StoreKit displays the ratings and review request a maximum of three times within a 365-day period. If the person has rated or reviewed your app on this device, StoreKit displays the ratings and review request if the app version is new, and if more than 365 days have passed since the person’s previous review. From this post I can see that there's an updated API that is recommended AppStore.requestReview(in:). Is there a currently known bug with the SKStoreReviewController version that would cause the review prompt to display outside of the limitations? Locally we're seeing a limit of 3 prompts in the same session but a few days later, we get the same 3 prompt limit when it's should have been limited for another year. Does using the AppStore version just fix our issue? Is it actually a different API?
2
0
839
Jul ’26
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.
9
0
1.4k
Jul ’26
WatchOS IAP -- why is this such a mess?
Need to vent a bit before relaxing for Christmas... WatchOS IAP using Storekit 2 is such a mess...is nobody actually using this or does Apple just not care for the user experience here? Lots of users experience after the purchase confirmation double tap on the side button an instant return to the purchase screen with nothing actually happening. No error message whatsoever. There is just one remedy: users need to unpair and re-pair their watch, including restoring a backup and setting up their wallet again. Nobody really wants to do this, or doesn't believe me and think this is just typical support BS, because their watch is paired and most things just work as they expect. And it turns away a customer, often leaving a bad review. And I can't do anything about it. Other errors in the purchase process are reported, but like "process interrupted" in case the payment is not setup correctly (credit car no longer valid or sth.). How should the user know? There must be better ways of letting him know what exactly the problem is. You need to implement a "Restore Purchase" function, otherwise you're not passing the review. But it really asks every time for the AppStore password, and users with crazy passwords -- that they rightfully should have! -- have almost no chance of typing them successfully on the tiny AW keyboard. Why is it not also just a side button double tap like for purchase? At the very least you would need access to the keychain PWs or allow pasting of sth. copied on the paired iPhone. Promo Codes for IAP on AW-only apps just don't work. AW has no redemption at all, and on the iPhone the AppStore will try to talk to a companion app (which AW-only doesn't have) and the end up in a dead-end installation effort. This all feels like never really tested in the field, and people are of course blaming the 3rd party dev. for all these issues. And opening a ticket is just leading nowhere -- at best it's closed after months with the hint "duplicate" but w/o any chance for me to see that one that they then actually work on and track progress. It's all so frustratingly broken...
3
0
1.1k
Jul ’26
Error when access StoreView / ProductView on iOS 27.0 simulator
Hi, Feedback: FB23494579 Using StoreView / ProductView on iOS 27.0 simulator / device hub throws the following error: Error: Accessing State<ProductViewEventConfiguration>'s value without being installed on a View. This will create a new ProductViewEventConfiguration instance each time. Environment macOS 26.5.2 (25F84) Xcode 27.0 beta 2 (27A5209h) Simulator / Device Hub - iPhone 17 Pro (iOS 27.0) Screenshot
2
0
1.5k
Jul ’26
ASDServerErrorDomain Code 3504 when purchasing non-consumable IAP
I am experiencing an issue with a non-consumable in-app purchase in my iOS app. The product loads correctly from the App Store and is displayed in the app, but when attempting to complete the purchase, StoreKit returns the following error: Payment completed with error: Error Domain=ASDServerErrorDomain Code=3504 "This item cannot be found." UserInfo={ NSLocalizedFailureReason=This item cannot be found., AMSServerErrorCode=3504, client-environment-type=Sandbox, storefront-country-code=USA } The same issue was also encountered by the App Review tester when they attempted to purchase the non-consumable product during review. The product: Is correctly configured in App Store Connect Has active pricing Is available in the United States Was included in the app submission Loads successfully and displays the correct price Fails only when the purchase is initiated Since the product metadata can be retrieved successfully, but the transaction fails with “This item cannot be found,” this appears to be a possible inconsistency between the StoreKit product catalog and the purchase backend. Has anyone encountered ASDServerErrorDomain Code=3504 for a non-consumable product that loads correctly but cannot be purchased? Is there any known App Store sandbox or commerce backend issue that can cause this, or any additional App Store Connect configuration that should be checked?
3
0
1.2k
Jul ’26
Advanced Commerce API Approval
Hey All, My company has submitted no less than four requests over the last couple months trying to get approved to use the advanced commerce API. We have an approved app version, provided the product ID for what we want to use it for, just have never heard back. Anytime we call apple support, they take the submission ID and escalate it, then its radio silence from there. Wanted to see if anyone ran into this issue and how they got around it. We have been waiting around 2 months to be approved. Have not received a rejection, update, or anything that could shed some light into whats going on. Any pointers/help on this would be greatly appreciated!
0
0
258
Jul ’26
Issue with subscriptions?
We have 1 renewable subscription and 1 nonrenewable subscription which, as of yesterday, are in the approved state. I'm not even sure how they were approved because the Product.products(for: Self.productIDs) call is returning an empty array in production. We have the paid agreement signed, a valid bank account added, and everything else that is required. The product IDs being passed are correct. But the API is still returning an empty array. Is there some sort of system issue happening right now?
0
0
214
Jul ’26
Newly created IAP products are unavailable in Sandbox, while old products still work
Hello, I’m experiencing what appears to be an app-specific Sandbox catalog propagation issue. Environment: Bundle ID: com.auroradrama.app App Store Connect App ID: 6786937298 StoreKit 2 Testing with a Sandbox Apple Account on a physical device An older product can still be fetched successfully: com.heroon.aurora.vip.year However, all newly created products return an empty result from Product.products(for:). Examples: com.auroradrama.pay.en.a.vip.week com.auroradrama.pay.en.a.coin.t1 com.auroradrama.test.coin001 The last product was created manually in the App Store Connect web interface, while the others were created through the App Store Connect API. Therefore, this does not appear to be specific to API-created products. Example result: Bundle ID: com.auroradrama.app Requested products: com.auroradrama.pay.en.a.vip.week com.auroradrama.pay.en.a.coin.t1 Returned product count: 0 Missing product IDs: com.auroradrama.pay.en.a.vip.week com.auroradrama.pay.en.a.coin.t1 I also tested the new product IDs using: Settings → Developer → Sandbox Apple Account → Manage → Initiate Purchase The system reports that the new product IDs are invalid. Therefore, the issue can be reproduced outside of my application code. I have verified through the App Store Connect API that the new products have: READY_TO_SUBMIT state Product versions in PREPARE_FOR_SUBMISSION Localization metadata A price configured for the United States Availability in 175 territories availableInNewTerritories enabled Valid subscription groups and subscription periods where applicable The Paid Applications Agreement, banking information, and tax information are all active. The app has the In-App Purchase capability enabled. Since an older product still works with the same app, Bundle ID, signing configuration, device, Sandbox account, and StoreKit code, these settings appear to be correct. The new products have remained unavailable for more than eight hours, which is well beyond the documented Sandbox metadata propagation period. Has anyone experienced a situation where old products remain available but every newly created product fails to enter the Sandbox StoreKit catalog? Could an Apple engineer please check whether the device-facing Sandbox catalog/index for App ID 6786937298 needs to be reprocessed or re-propagated? I can provide the App Store Connect resource IDs, timestamps, StoreKit logs, and a sysdiagnose privately if needed. Thank you.
1
1
319
Jul ’26
SKTestSession.buyProduct(identifier: options:) throws error
Hi, Overview I am trying to write a unit test case to buy a storekit product. SKTestSession.buyProduct(identifier: options:) throws the error StoreKit.StoreKitError.notEntitled Testcase Code @Test func example() async throws { let session = try SKTestSession(configurationFileNamed: "VehicleStore") session.disableDialogs = true session.clearTransactions() do { let transaction = try await session.buyProduct(identifier: "nonconsumable.car", options: []) print(transaction) } catch { // Throws StoreKit.StoreKitError.notEntitled print("Error: \(error)") } } Storekit configuration file Note In-App purchases capability is added StoreKit configuration file is used in testcase Environment: macOS 26.5.2 (25F84) Xcode 26.6 (17F113)
7
0
1.7k
Jul ’26
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
24
Boosts
5
Views
3.8k
Activity
Aug ’26
Transaction.currentEntitlements and subscription.status both return empty for active production subscription
Product: Auto-renewable annual subscription Environment: Production iOS version: 26.6 StoreKit version: StoreKit 2 I have an active subscription that shows correctly in the App Store app, but neither Transaction.currentEntitlements nor Product.SubscriptionInfo.Status (via subscription.status) return any record of it — both come back empty. What I've checked: Transaction.currentEntitlements — iterated fully, zero transactions found for this product ID Product.SubscriptionInfo.Status — checked independently as a second signal, also returns no active status for this product AppStore.sync() — called before checking entitlements, completes successfully, does not resolve the issue Settings → [Apple ID] → Subscriptions on-device — does not show this subscription "Restore Purchases" in-app — consistently reports nothing found Impact: Since my app gates access behind an active entitlement check, this means the user is stuck on the paywall screen indefinitely, despite having a valid, active, paid subscription. There's no client-side workaround, since every available StoreKit 2 API reports no entitlement exists. Code pattern (simplified): swift for await result in Transaction.currentEntitlements { if case .verified(let transaction) = result, transaction.productID == productID { // never reached for this product } } if let subscription = product.subscription { let statuses = try await subscription.status // statuses is empty / doesn't reflect the active subscription } This looks consistent with the pattern reported in thread 823454, where currentEntitlements and Transaction.all return empty for valid, non-refunded purchases in production for a small number of users. In my case, this is affecting a currently active subscription — not a refunded or expired one — and is reproducible on this account across multiple app builds. Has anyone found a reliable workaround, or is this being tracked by Apple as an active known issue beyond the fix already applied for the non-Gregorian calendar case (which doesn't apply here)?
Replies
0
Boosts
0
Views
649
Activity
Aug ’26
iOS26.4,appStoreReceiptURL获取票据延迟
iOS 26.4系统上,我们发现三个问题: 1.调用了finishTransaction接口,但是在App重新启动后,[SKPaymentQueue defaultQueue].transactions仍然会有这笔订单。 2.支付完成后,[[NSBundle mainBundle] appStoreReceiptURL]],拿到的票据解析出来里面的商品是空的,需要延迟2秒钟左右在调用[[NSBundle mainBundle] appStoreReceiptURL]]才能获取有效票据。 3.支付完成后,如果用户没有点击最后弹出的确认弹框,等待5秒钟,系统会自己回调 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions; 代理方法。正常应该是用户点击了最后弹出的确认弹框,在回调- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions;方法。 我们在苹果开发者论坛上面找到其他开发者反馈的类似问题,链接如下: https://developer.apple.com/forums/thread/817700 https://developer.apple.com/forums/thread/792437?answerId=849557022#849557022 https://developer.apple.com/forums/thread/817834 https://developer.apple.com/forums/thread/817706 https://developer.apple.com/forums/thread/818586 我们有大量用户升级到了26.4系统,这对于我们造成了巨大的困扰,我们需要你们的帮助,感谢!
Replies
8
Boosts
1
Views
1.9k
Activity
Aug ’26
Production SKAdNetwork postbacks remain version 3.0 instead of 4.0
We are investigating SKAdNetwork attribution for a production iOS app distributed through the App Store. Bundle ID: com.stencilstudio.app App Store ID: 6760613806 We receive real winning SKAdNetwork postbacks directly from the App Store at our attribution endpoint. The raw Apple payloads consistently contain: version: "3.0" campaign-id: 25 did-win: true Some postbacks also include a valid fine conversion value, for example: conversion-value: 1 However, we have not received postbacks containing: version: "4.0" source-identifier postback-sequence-index coarse-conversion-value The advertising network is Meta. The advertised app is App Store distributed and has an iOS deployment target of 16.1. We are trying to understand one specific technical point: What determines whether the resulting production attribution postback is SKAdNetwork 3.0 or 4.0? In particular: Is the postback version determined by the SKAdNetwork version used by the ad network when signing the winning ad impression? Can anything on the advertised-app side, such as an entitlement, App Store Connect setting, build configuration, registration state, or SDK configuration, cause an attribution to remain on version 3.0? Is there any advertiser-side diagnostic that allows the advertised-app developer to determine which SKAdNetwork version the winning impression was signed with? Given that the postbacks themselves explicitly contain version: "3.0", is there any other condition we should verify on the advertised-app side before asking the ad network to investigate how its impressions are being signed? Example raw postback received directly from the App Store: { "app-id": 6760613806, "fidelity-type": 1, "conversion-value": 1, "campaign-id": 25, "did-win": true, "version": "3.0", "ad-network-id": "v9wttpbfk9.skadnetwork", "redownload": false } We can provide additional production postbacks if useful.
Replies
0
Boosts
0
Views
420
Activity
Aug ’26
StoreKit 2: Does Transaction.currentEntitlements get updated when my app isn't running?
TL;DR: Does iOS automatically receive App Store transaction updates in the background when internet connection is available so the backing storage state of Transaction.currentEntitlements gets synced even when my app is not running? Or does iOS update Transaction.currentEntitlements only when my app is running? The long version: Imagine the following situation: A user has purchased a non-consumable IAP in my app and is granted the locked premium content. The IAP transaction is now present in Transaction.currentEntitlements (it's also cached locally). The user blocks internet access every time before my app gets opened (either enables the Airplane mode and/or disconnects from the Wi-Fi before launching my app). So from this point on, my app never gets a chance to connect to the internet. The user gets refunded for the IAP. The user uses their iPhone to browse the internet via Safari, checks emails, etc. Then, before launching my app, the user blocks internet access. My app gets is launched (without internet access) and reads entitlements from Transaction.currentEntitlements. The question is: does the StoreKit service know that the IAP has been refunded? Did iOS update the local cached storage of Transaction.currentEntitlements while the user was connected to the internet in step 4? Or will Transaction.currentEntitlements contain the old state from step 1 so the app won't know about the refund and the user will be able to use my app's premium content which has been refunded by now? Is the behavior the same for auto-renewable subscriptions as it is for non-consumable IAPs?
Replies
0
Boosts
0
Views
584
Activity
Aug ’26
StoreKit 2: products load with correct prices but purchase fails immediately with "Item Unavailable" (app not yet approved)
Our app sells two auto-renewable subscriptions. Product loading succeeds and returns both products with correct localized prices, but every purchase attempt fails roughly one second later with "Item Unavailable". No purchase sheet is ever presented to the user. The app has not yet passed its first App Review. It was rejected under Guideline 2.1(b) because the reviewer encountered this same error on their device. MY QUESTION Under what conditions does StoreKit reject a purchase with "Item Unavailable" for a product that has just been returned successfully, with a valid localized price, by a product request? Is an auto-renewable subscription transactable in the sandbox environment for an app that has never had a binary approved by App Review? Question 2 is the one I most need answered. App Review's rejection states that In-App Purchase products "do not need prior approval to function in review", but neither we nor the reviewer can transact them. DIAGNOSTIC LOG Captured on-device during a failing session: 01:08:56 fetchProducts [com.aurascanner.app.pro.weekly, com.aurascanner.app.pro.annual] 01:08:56 fetchProducts -> 2 product(s): com.aurascanner.app.pro.annual=$39.99; com.aurascanner.app.pro.weekly=$6.99 01:08:56 requestPurchase sku=com.aurascanner.app.pro.weekly 01:08:57 purchaseError: code=purchase-error msg=Item Unavailable 01:08:57 error code=purchase-error, storefront=USA 01:09:05 fetchProducts -> 2 product(s), same prices returned again 01:09:05 requestPurchase sku=com.aurascanner.app.pro.annual 01:09:06 requestPurchase threw: Item Unavailable 01:09:06 error code=purchase-error, storefront=USA An introductory-offer eligibility check earlier in the session also succeeded, using the subscription group ID read from the loaded product. So product metadata, including the subscription group, resolves correctly. CONDITIONS Fails identically for both products, on every attempt. Reproduces in TestFlight on our own devices and Apple IDs. Also failed during App Review on iPad Air 11-inch (M3), iPadOS 26.5.2. Storefront reports as USA in every case. Real devices only. Not reproduced on Simulator. ALREADY VERIFIED Paid Applications Agreement: Active, banking and tax information complete. In-App Purchase capability: enabled on the App ID at Certificates, Identifiers & Profiles. Bundle identifier com.aurascanner.app matches the App Store Connect record. Both subscriptions: complete metadata, review screenshots uploaded, USD pricing set, United States availability. Both subscriptions and the subscription group are attached to the current submission, status "Ready for Review". Subscription group has a localized display name. Build distributed via TestFlight, which routes purchases to sandbox automatically. IMPLEMENTATION The app is React Native and uses a wrapper library over StoreKit 2, but the error text originates from StoreKit rather than the wrapper, and the call order follows the documented pattern: Initialize the StoreKit connection. Load products. This succeeds and returns both products. Register transaction update and error listeners. Request the purchase. This is where it fails. Purchases are verified server-side using Apple's App Store Server Library, and the transaction is finished only after verification succeeds. I am not asking anyone to debug the wrapper. My question is about StoreKit and App Store behaviour: what causes the store to quote a product and then decline to sell it? Any pointers appreciated. I can supply screenshots or the full log.
Replies
2
Boosts
1
Views
1.3k
Activity
Aug ’26
Transaction.currentEntitlements sometimes does not emit a result until device is reboot
I have the typical StoreKit 2 manager class, where I check currentEntitlements for subscription. I have filed a feedback (FB22349195), I hope someone can take a look at it. func updateCustomerProductStatus() async { var activeSubscription: String? = nil // BUG: In some cases the currentEntitlements does not emit a transaction until the device is reboot for await result in Transaction.currentEntitlements { print("Found transaction: \(result)") // This print does not appear until a restart! do { let transaction = try checkVerified(result) // Skip revoked transactions if transaction.revocationDate != nil { print("Skipping revoked transaction for \(transaction.productID)") continue } // Skip expired subscriptions if let expirationDate = transaction.expirationDate, expirationDate < Date() { print("Skipping expired subscription for \(transaction.productID)") continue } // Check product type switch transaction.productType { case .autoRenewable: activeSubscription = transaction.productID default: break } } catch { print("Unable to verify transaction: \(error)") } } // Update state once after processing all entitlements self.activeSubscription = activeSubscription print("updateCustomerProductStatus() activeSubscription: \(activeSubscription ?? "nil")") } There is some unexpected behavior where the currentEntitlements does not emit a result until the iPhone device is reboot. This bug appeared in iOS 26.4 (and in the betas).
Replies
3
Boosts
3
Views
1.6k
Activity
Aug ’26
purchase() always fails with ASDServerErrorDomain 3504 (productUnavailable) in Sandbox, while products(for:) succeeds — all 3 IAPs, JPN storefront
Summary: In Sandbox, Product.products(for:) returns all 3 of my IAPs with correct JPY prices and Japanese localizations, but product.purchase() fails immediately — the payment sheet is never presented — with ASDServerErrorDomain Code=3504 (Product.PurchaseError.productUnavailable). All 3 products fail identically. Reproduction captured in the sysdiagnose attached to FB24067333: 2026-07-30 18:43:58 JST — in-app purchase() on app.negaiboshi.placement; 18:44:40 JST — OS-level test (Settings > Developer > Sandbox Apple Account > Manage > Start Transaction), same product ID. Server correlation keys from the device log: inAppBuy → AMSServerCorrelationKey HNB5UGLE72AXSMY5KY7G4NAXQY (failureType 3504); Start Transaction → FQN4Y4JOEHYBW2GIR7KPTYTB2A (AMSServerErrorCode 3766, "provided product ID or bundle ID is invalid"). Environment App: Negaiboshi — Apple ID 6794682125, Bundle ID app.negaiboshi, Team 778QPP83C4 App status: first submission in preparation (never reviewed); build 1.0 (1) on TestFlight IAPs (all "Ready to Submit" since 2026-07-27 JST, attached to the 1.0 submission): app.negaiboshi.pro.monthly (auto-renewable, ¥480, group 22264517), app.negaiboshi.placement (non-consumable, ¥720), app.negaiboshi.nightsky (non-consumable, ¥1,200) IAP base country: Japan (JPY); availability 145/175 countries Device: iPhone, iOS 26.5.2; development build from Xcode; StoreKit Configuration = None Sandbox Apple Account: (address in FB24067333), region Japan, no purchase history; signed in under Settings > Developer Storefront.current = JPN. No Screen Time restrictions. Actual error (verbatim): Error Domain=ASDServerErrorDomain Code=3504 "このアイテムは見つかりませんでした。" UserInfo={AMSServerErrorCode=3504, client-environment-type=Sandbox, storefront-country-code=JPN} TN3186 checklist fully verified, none apply (Paid Apps Agreement, banking, tax all active; bundle ID + IAP capability; signing; membership). Also tried: Sandbox sign-out/sign-in, device restart — no change. Consistent across all 3 products and relaunches. Reproduced with zero app code involved (decisive): Settings > Developer > Start Transaction with product ID app.negaiboshi.placement and bundle ID app.negaiboshi fails: "The provided product ID or bundle ID is invalid. [Environment: Sandbox]" — Apple's own OS-level tool, no third-party code. Calibration: a deliberately nonexistent ID (app.negaiboshi.zzz) yields the identical error — the backend treats my real product like a nonexistent one. A price change (¥720→¥700, "now", 2026-07-29) propagated to the sandbox metadata catalog within minutes (products(for:) returned "¥700") — purchase() still 3504. Reverted. A full base-country change (2026-07-30): Japan (¥720) → United States ($4.99) at 15:52 JST — this deletes and recreates the price schedule and is the exact operation that resolved the identical symptom in thread 839557. It propagated to the metadata catalog (auto-converted ¥800 shown in ~20 min), yet purchase() and Start Transaction still failed at 16:10 and 16:55 JST. Reverted to ¥720 at 16:59 JST. Every lever that rewrites the price schedule reaches the metadata catalog but never the commerce/purchase catalog. Timeline: the products reached Ready to Submit hours after the 2026-07-26 15:22–17:58 PDT In-App Purchases outage (Message ID 1000005803), and the failure still reproduces after the 2026-07-29 16:20–19:30 PDT emergency maintenance on In-App Purchases + Advanced Commerce API (messageId 1000005805). Peer reports with the same metadata-vs-commerce-catalog split in the same window: threads 839220, 839441, 839437, 839645, 839557. Questions: Why does purchase() fail server-side with 3504 ("item not found") while products(for:) succeeds for the same IDs in the same JPN storefront? Can someone check the sandbox commerce-catalog state of the 3 product IDs above (Apple ID 6794682125)? This looks like a server-side provisioning failure that no developer-side action can repair. Is any additional App Store Connect state required before sandbox purchases can complete for a never-yet-reviewed app?
Replies
1
Boosts
0
Views
1.3k
Activity
Aug ’26
AppTransaction.shared fails with SKServerErrorDomain Code=-1 across all install methods (sandbox) — stumped after ruling out everything checkable
Hi all, I've been debugging a persistent sandbox StoreKit issue for a while now and have ruled out everything I can check from my end. Posting the full picture here in case anyone recognizes this pattern or has advice — genuinely stuck. The core problem AppTransaction.shared (StoreKit 2) consistently fails with: Error Domain=SKServerErrorDomain Code=-1 "(null)" UserInfo={storefront-country-code=AUS, client-environment-type=Sandbox} A real purchase attempt separately fails with: Error Domain=ASDServerErrorDomain Code=3504 "This item cannot be found." UserInfo={storefront-country-code=AUS, AMSServerErrorCode=3504, client-environment-type=Sandbox} What's confirmed working (so I can rule these out as the cause) Product catalog/pricing fetch — real price, title, currency load correctly every time canMakePayments → true getStorefront → AUS, correctly App Store Connect account: Paid Apps Agreement Active, Free Apps Agreement Active, bank account Active, all 3 tax forms Active (ABN/GST, Certificate of Foreign Status, W-8BEN) The IAP itself: correctly configured (com.subwizard.subwizard.unlock, Non-Consumable, "Ready for Review" status) App code: verified twice independently — product ID, type, and registration are all correct, no bugs found Xcode's local StoreKit Configuration file (fully simulated, no network): confirms my purchase/entitlement code works correctly end-to-end when StoreKit cooperates — so this isn't a code bug What's confirmed failing — identically, across every method I've tried Raw Xcode Debug build, installed directly to a real device TestFlight (Internal Testing) install A fresh Xcode Release-configuration run Same error, same domain, same code, every single time: AppTransaction.shared fetch, receipt refresh, Restore Purchases, and the actual purchase attempt (different code, 3504, but same underlying pattern). The pattern that stands out Everything that's a simple read of the public catalog (what does this app sell, what's the price) works. Everything requiring Apple's servers to process something tied to my specific account's transaction/commerce state (transaction history, an actual purchase) fails. My leading theory This is a brand-new Individual Apple Developer account. The Paid Apps Agreement only went Active 5 days before I started testing this. First-ever IAP product, first-ever real purchase attempt on the account. I'm wondering if this is a propagation/settling delay on Apple's commerce backend that the "Active" UI status doesn't fully reflect — I found a few other forum threads where Apple's own response to error 3504 specifically was to double check the Paid Apps Agreement/tax/banking, even in cases where it already showed as complete. What I've already ruled out App Store submission status — per Apple's TN3186 doc and other DTS-engineer forum replies I found, sandbox purchases shouldn't require app/IAP submission or approval at all A raw Xcode install lacking a "real acquisition record" that TestFlight would have — tested directly, TestFlight failed identically Sandbox tester account misconfiguration — sign-in works fine, tester accounts are valid and usable Where things stand right now Given everything above checked out clean, I went ahead and submitted the app + this IAP for App Review, partly just to see whether that changes anything, and partly because I need to actually ship at some point regardless. If it gets approved and the purchase works for the reviewer, that would at least tell me production is fine even if sandbox stays broken — I can live with that. But if it comes back rejected specifically because the purchase doesn't work, I'm genuinely out of ideas on what else to check from my side.
Replies
1
Boosts
0
Views
439
Activity
Aug ’26
First auto-renewable subscription: sandbox purchase fails with (4040004) App not found / AMS 3504
Summary Sandbox purchases of our first auto-renewable subscription fail with "This item cannot be found". Product metadata loads correctly, so this looks specific to commerce. Our App Store Connect configuration is complete and has been verified exhaustively, and four other apps on the same team sell in-app purchases in production without issue. The affected app has never been submitted or released, and the subscription sits in "Ready to Submit". Symptoms On device (TestFlight build, purchasing with the tester's real Apple Account - no sandbox Apple Account is configured, per the documented TestFlight flow), a purchase attempt returns storeProductNotAvailable and the system alert "Item Unavailable". Device logs (idevicesyslog) show: mzstorekit-sb.itunes.apple.com/inApps/v2/history -> HTTP 404, (4040004) App not found sandbox.itunes.apple.com/.../inAppBuy -> AMSErrorDomain 305, AMSServerErrorCode=3504, "This item cannot be found" Product.products(for:) returns the product and the paywall renders product.displayPrice, so product metadata resolves. Only the purchase fails. Server-side observation Using the App Store Server API in the sandbox environment with our team key, requesting a deliberately non-existent transaction ID: GET https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/1234567890 App Products Released? Result The affected app 1 subscription, Ready to Submit never HTTP 401, empty body Another app, same team non-consumable, Approved yes 404 4040010 Transaction id not found Another app, same team 2 non-consumables, Approved yes 404 4040010 Transaction id not found Another app, same team 2 non-consumables, Approved yes 404 4040010 Transaction id not found Another app, same team non-consumable, Approved yes 404 4040010 Transaction id not found Same key, same issuer, same team, same request shape - only the bid claim differs. We note openly that this is not a clean experiment: all four comparison apps differ from the affected app in two ways at once (they are released, and they have approved products), so the 401 may simply reflect an app with no approved commerce products rather than a missing app record. We include it because the difference is stark and reproducible, not because we think it is conclusive. What makes this app different Being unreleased does not by itself appear to be the barrier: we were able to test the in-app purchases of the four apps above in the sandbox before those apps were released. The difference we cannot account for is product type and approval state - those were one-time non-consumables, whereas this is our first auto-renewable subscription, which App Store Connect tells us "must be submitted with a new app version" and which has therefore never been approved. Timeline 2026-07-30 ~00:30 CEST - Pricing and Availability set for the app (it had been unset; that was the cause of an earlier, separate failure). 2026-07-30 09:26 CEST - captured the device logs above. 2026-07-31 00:50 CEST - toggled a territory's availability off and back on to force a re-propagation of the availability record. No change. 2026-07-31 - still failing 24+ hours on. Automated probes every 30 minutes throughout have returned the same result without exception. This is well beyond the "up to 1 hour" propagation window documented in TN3186. Already verified Account level - four other apps on this same team currently sell in-app purchases in production: Paid Apps agreement: Active Banking and tax information: complete and active App Store Connect configuration for the affected app: App availability: 175 of 175 territories, none excluded Subscription availability: 175 of 175 territories Subscription priced in all 175 territories Four localizations and the review screenshot present; group localized; subscription state Ready to Submit App price: Free Every territory reads CANNOT_SELL / AVAILABLE_FOR_SALE_UNRELEASED_APP, consistent with an app that has not yet been released Client / build: Product ID in code matches App Store Connect exactly Explicit App ID (no wildcard), In-App Purchase capability enabled Build signed with Apple Distribution, delivered via Transporter, tested from TestFlight (not a development build) No StoreKit configuration file active in the scheme Bundle ID matches the App Store Connect record Questions Is the subscription provisioned for commerce in the sandbox environment? The (4040004) App not found response suggests the app or its commerce record is not present there. TN3186 states that sandbox testing does not require submitting in-app purchases for review. Does that hold for an app's first auto-renewable subscription, given that such a subscription must be submitted alongside an app version and so cannot reach an approved state beforehand? If submitting the app version together with the subscription is in fact the prerequisite, please confirm - we are currently holding our submission specifically so we can complete one successful sandbox purchase first, since App Review purchases through this same environment. If that ordering is not possible, we would rather submit and have App Review encounter the working production path than keep waiting on a sandbox purchase that cannot succeed. Happy to provide the app's Apple ID and product identifier privately if that helps.
Replies
1
Boosts
0
Views
901
Activity
Jul ’26
SKStoreReviewController.requestReview limits not working?
We're currently having an issue with our app where the review prompt is displaying for the user too often. I know the documentation says that: If the person hasn’t rated or reviewed your app on this device, StoreKit displays the ratings and review request a maximum of three times within a 365-day period. If the person has rated or reviewed your app on this device, StoreKit displays the ratings and review request if the app version is new, and if more than 365 days have passed since the person’s previous review. From this post I can see that there's an updated API that is recommended AppStore.requestReview(in:). Is there a currently known bug with the SKStoreReviewController version that would cause the review prompt to display outside of the limitations? Locally we're seeing a limit of 3 prompts in the same session but a few days later, we get the same 3 prompt limit when it's should have been limited for another year. Does using the AppStore version just fix our issue? Is it actually a different API?
Replies
2
Boosts
0
Views
839
Activity
Jul ’26
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
9
Boosts
0
Views
1.4k
Activity
Jul ’26
WatchOS IAP -- why is this such a mess?
Need to vent a bit before relaxing for Christmas... WatchOS IAP using Storekit 2 is such a mess...is nobody actually using this or does Apple just not care for the user experience here? Lots of users experience after the purchase confirmation double tap on the side button an instant return to the purchase screen with nothing actually happening. No error message whatsoever. There is just one remedy: users need to unpair and re-pair their watch, including restoring a backup and setting up their wallet again. Nobody really wants to do this, or doesn't believe me and think this is just typical support BS, because their watch is paired and most things just work as they expect. And it turns away a customer, often leaving a bad review. And I can't do anything about it. Other errors in the purchase process are reported, but like "process interrupted" in case the payment is not setup correctly (credit car no longer valid or sth.). How should the user know? There must be better ways of letting him know what exactly the problem is. You need to implement a "Restore Purchase" function, otherwise you're not passing the review. But it really asks every time for the AppStore password, and users with crazy passwords -- that they rightfully should have! -- have almost no chance of typing them successfully on the tiny AW keyboard. Why is it not also just a side button double tap like for purchase? At the very least you would need access to the keychain PWs or allow pasting of sth. copied on the paired iPhone. Promo Codes for IAP on AW-only apps just don't work. AW has no redemption at all, and on the iPhone the AppStore will try to talk to a companion app (which AW-only doesn't have) and the end up in a dead-end installation effort. This all feels like never really tested in the field, and people are of course blaming the 3rd party dev. for all these issues. And opening a ticket is just leading nowhere -- at best it's closed after months with the hint "duplicate" but w/o any chance for me to see that one that they then actually work on and track progress. It's all so frustratingly broken...
Replies
3
Boosts
0
Views
1.1k
Activity
Jul ’26
Error when access StoreView / ProductView on iOS 27.0 simulator
Hi, Feedback: FB23494579 Using StoreView / ProductView on iOS 27.0 simulator / device hub throws the following error: Error: Accessing State<ProductViewEventConfiguration>'s value without being installed on a View. This will create a new ProductViewEventConfiguration instance each time. Environment macOS 26.5.2 (25F84) Xcode 27.0 beta 2 (27A5209h) Simulator / Device Hub - iPhone 17 Pro (iOS 27.0) Screenshot
Replies
2
Boosts
0
Views
1.5k
Activity
Jul ’26
ASDServerErrorDomain Code 3504 when purchasing non-consumable IAP
I am experiencing an issue with a non-consumable in-app purchase in my iOS app. The product loads correctly from the App Store and is displayed in the app, but when attempting to complete the purchase, StoreKit returns the following error: Payment completed with error: Error Domain=ASDServerErrorDomain Code=3504 "This item cannot be found." UserInfo={ NSLocalizedFailureReason=This item cannot be found., AMSServerErrorCode=3504, client-environment-type=Sandbox, storefront-country-code=USA } The same issue was also encountered by the App Review tester when they attempted to purchase the non-consumable product during review. The product: Is correctly configured in App Store Connect Has active pricing Is available in the United States Was included in the app submission Loads successfully and displays the correct price Fails only when the purchase is initiated Since the product metadata can be retrieved successfully, but the transaction fails with “This item cannot be found,” this appears to be a possible inconsistency between the StoreKit product catalog and the purchase backend. Has anyone encountered ASDServerErrorDomain Code=3504 for a non-consumable product that loads correctly but cannot be purchased? Is there any known App Store sandbox or commerce backend issue that can cause this, or any additional App Store Connect configuration that should be checked?
Replies
3
Boosts
0
Views
1.2k
Activity
Jul ’26
Advanced Commerce API Approval
Hey All, My company has submitted no less than four requests over the last couple months trying to get approved to use the advanced commerce API. We have an approved app version, provided the product ID for what we want to use it for, just have never heard back. Anytime we call apple support, they take the submission ID and escalate it, then its radio silence from there. Wanted to see if anyone ran into this issue and how they got around it. We have been waiting around 2 months to be approved. Have not received a rejection, update, or anything that could shed some light into whats going on. Any pointers/help on this would be greatly appreciated!
Replies
0
Boosts
0
Views
258
Activity
Jul ’26
Issue with subscriptions?
We have 1 renewable subscription and 1 nonrenewable subscription which, as of yesterday, are in the approved state. I'm not even sure how they were approved because the Product.products(for: Self.productIDs) call is returning an empty array in production. We have the paid agreement signed, a valid bank account added, and everything else that is required. The product IDs being passed are correct. But the API is still returning an empty array. Is there some sort of system issue happening right now?
Replies
0
Boosts
0
Views
214
Activity
Jul ’26
Newly created IAP products are unavailable in Sandbox, while old products still work
Hello, I’m experiencing what appears to be an app-specific Sandbox catalog propagation issue. Environment: Bundle ID: com.auroradrama.app App Store Connect App ID: 6786937298 StoreKit 2 Testing with a Sandbox Apple Account on a physical device An older product can still be fetched successfully: com.heroon.aurora.vip.year However, all newly created products return an empty result from Product.products(for:). Examples: com.auroradrama.pay.en.a.vip.week com.auroradrama.pay.en.a.coin.t1 com.auroradrama.test.coin001 The last product was created manually in the App Store Connect web interface, while the others were created through the App Store Connect API. Therefore, this does not appear to be specific to API-created products. Example result: Bundle ID: com.auroradrama.app Requested products: com.auroradrama.pay.en.a.vip.week com.auroradrama.pay.en.a.coin.t1 Returned product count: 0 Missing product IDs: com.auroradrama.pay.en.a.vip.week com.auroradrama.pay.en.a.coin.t1 I also tested the new product IDs using: Settings → Developer → Sandbox Apple Account → Manage → Initiate Purchase The system reports that the new product IDs are invalid. Therefore, the issue can be reproduced outside of my application code. I have verified through the App Store Connect API that the new products have: READY_TO_SUBMIT state Product versions in PREPARE_FOR_SUBMISSION Localization metadata A price configured for the United States Availability in 175 territories availableInNewTerritories enabled Valid subscription groups and subscription periods where applicable The Paid Applications Agreement, banking information, and tax information are all active. The app has the In-App Purchase capability enabled. Since an older product still works with the same app, Bundle ID, signing configuration, device, Sandbox account, and StoreKit code, these settings appear to be correct. The new products have remained unavailable for more than eight hours, which is well beyond the documented Sandbox metadata propagation period. Has anyone experienced a situation where old products remain available but every newly created product fails to enter the Sandbox StoreKit catalog? Could an Apple engineer please check whether the device-facing Sandbox catalog/index for App ID 6786937298 needs to be reprocessed or re-propagated? I can provide the App Store Connect resource IDs, timestamps, StoreKit logs, and a sysdiagnose privately if needed. Thank you.
Replies
1
Boosts
1
Views
319
Activity
Jul ’26
SKTestSession.buyProduct(identifier: options:) throws error
Hi, Overview I am trying to write a unit test case to buy a storekit product. SKTestSession.buyProduct(identifier: options:) throws the error StoreKit.StoreKitError.notEntitled Testcase Code @Test func example() async throws { let session = try SKTestSession(configurationFileNamed: "VehicleStore") session.disableDialogs = true session.clearTransactions() do { let transaction = try await session.buyProduct(identifier: "nonconsumable.car", options: []) print(transaction) } catch { // Throws StoreKit.StoreKitError.notEntitled print("Error: \(error)") } } Storekit configuration file Note In-App purchases capability is added StoreKit configuration file is used in testcase Environment: macOS 26.5.2 (25F84) Xcode 26.6 (17F113)
Replies
7
Boosts
0
Views
1.7k
Activity
Jul ’26