Hi Apple Developer Team,
I'm looking to confirm some technical details regarding the pre-order flow and App Store receipt handling. Specifically, I have the following questions:
Q1: After a user installs an app via pre-order and launches it for the first time, will a valid App Store receipt be available immediately via [[NSBundle mainBundle] appStoreReceiptURL]? Are there any known cases where the receipt might be missing or invalid, requiring a manual refresh (e.g., via SKReceiptRefreshRequest)?
Q2: Is the pre-order flow currently supported in the sandbox environment? Specifically, is it possible to simulate pre-ordering an app and installing it in a sandbox or TestFlight environment, in order to test receipt generation and related logic?
https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt
Q3: The receipt field in the App Store receipt structure is marked as deprecated. Is it still acceptable to use this field for validating receipts? Has Apple announced any timeline or system version in which this field will be fully removed or unsupported?
StoreKit
RSS for tagSupport in-app purchases and interactions with the App Store using StoreKit.
Posts under StoreKit tag
181 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello,
I have a question regarding the App Store Server API's getTransactionInfo endpoint.
Previously, the official documentation for getTransactionInfo mentioned that:
“This endpoint doesn’t support an app transaction. To get information about an app transaction, decode the signed app transaction received from the device.”
However, as of June 2025, I can no longer find this sentence in the current documentation (link). Now, the docs state that all in-app purchase transaction IDs are supported (consumable, non-consumable, auto-renewable subscriptions, etc.).
But in practice, when I call getTransactionInfo with an AppTransactionId (extracted from a signed App Transaction JWS), I receive this error: apiErrorCode: 4000048
“Invalid request. App transactions aren’t supported by this endpoint.”
Is this endpoint supposed to support AppTransactionId now, or is the restriction still in place (but not mentioned in the docs)?
Is there any official statement about when this restriction was added/removed?
Can you clarify if only in-app purchase transaction IDs (and not AppTransactionIds) are supported for this endpoint, or has the policy changed recently?
Any clarification or historical context would be greatly appreciated.
Additionally, I would like to know about the behavior of an App Transaction in the event of a refund.
If a user receives a refund for the app itself (not an in-app purchase), how can changes to the AppTransaction be detected?
Does the App Store Server Notification v2 provide notifications for app-level refunds, or are such events only visible by decoding the latest App Transaction JWS on the device?
Is there any way to receive app-level refund information server-side, or must we always rely on the device to provide the updated signed app transaction?
Any clarification on this refund flow and notification coverage would also be appreciated.
Thank you!
I have non-consumable and consumable in-app purchases in my app. The tutorial I was following stated Transaction.currentEntitlements includes unfinished consumables, which is incorrect according to the documentation. Is the correct way to handle unfinished consumables (and non-consumables) to implement Transaction.updates and call finish() if it’s verified? The documentation says that listener will receive unfinished transactions once upon app launch, so with that, do I understand correctly you do not need to implement Transaction.unfinished unless you want to look for unfinished transactions manually later on? Otherwise what is the correct and most recommended way to handle unfinished consumables? Is there a way to test that scenario in Xcode?
Hello,
Thank you for attending today’s Metal & game technologies group lab at WWDC25!
We were delighted to answer many questions from developers and energized by the community engagement.
We hope you enjoyed it and welcome your feedback.
We invite you to carry on the conversation here, particularly if your question appeared in Slido and we were unable to answer it during the lab.
If your question received feedback let us know if you need clarification.
You may want to ask your question again in a different lab e.g. visionOS tomorrow.
(We realize that this can be confusing when frameworks interoperate)
We have a lot to learn from each other so let’s get to Q&A and make the best of WWDC25! 😃
Looking forward to your questions posted in new threads.
🔹 Description of the issue:
My app uses Adapty to fetch and display in-app subscription products on a paywall. The system has worked perfectly until recently. After I edited the localizations of the subscriptions in App Store Connect, they were temporarily rejected. Since that moment, the products no longer show in the app.
Even though I re-submitted the localizations and they were approved, StoreKit still does not return any products, and Adapty returns the error:
less
CopyEdit
AdaptyError(code: 1000, message: "No products were found for provided product ids")
🔹 Error Message:
noProductIDsFound — from Adapty SDK when attempting to load paywall products.
🔹 Steps to Reproduce:
Open the Aida Nena app (App ID: 6737695739).
Sign in with a test account or create a new one.
Go to Profile → Subscription.
The paywall will show but no products will appear.
Logs show Adapty attempting to fetch product IDs but none are found in StoreKit.
🔹 What I’ve Tried:
Re-activating the Adapty SDK.
Forcing a cache reset via app reinstall.
Re-checking App Store Connect: all subscriptions and localizations now show Approved (green).
Waiting several hours in case of propagation.
Verifying correct product identifiers are in use — they haven’t changed.
🔹 My Hypothesis:
The StoreKit product metadata is still not properly refreshed after the rejection and re-approval of the localizations. This is preventing Adapty (and StoreKit) from returning the product data even though the products are live and approved.
🔹 Additional Info:
SDK: @adapty/react-native + Adapty iOS SDK under the hood.
This seems to be a known edge case among developers after a product's metadata/localization is changed and re-approved.
Thanks, I appreciate any help.
I have setup offer codes and subscriptions for users to purchase, when a user signs up using an offer code outside of the app the offer code does not save into my database where the subscriptions are saved
the transaction is successful and validated by store kit but I cant see that that user used an offer code - an example
https://apps.apple.com/redeem/?ctx=offercodes&id=6744338284&code=ASKDOM
I then setup an edge function in supabase to retrieve the data that store kit sends back and im not sure where to find the offer code as it still doesnt save
is there an internal apple reference that they use as apposed to the users offer code i.e offer code askdomSA = P3050 for example
how can Identify if an offer code was used
thank you
Cannot retrieve products for iap or subscription on simulator iPhone 16 and real device iPhone XR also.
lutter: IAPError(code: storekit2_products_error, source: app_store, message: The operation couldn’t be completed. (NSURLErrorDomain error -1009.), details: The operation couldn’t be completed. (NSURLErrorDomain error -1009.))
flutter: Error fetching IAP products: IAPError(code: storekit2_products_error, source: app_store, message: The operation couldn’t be completed. (NSURLErrorDomain error -1009.), details: The operation couldn’t be completed. (NSURLErrorDomain error -1009.))
I am using Store Kit 2 to implement In App Purchases for my app. I need to maintain a pending state in the UI for all my pending purchases. Is there a way to get a list of all pending purchases? If not, is there a way to know if my pending purchase was cancelled?
I have consumable IAPs in my app. Currently there is no way for me to test refunds for them as Xcode testing doesn't allow refunds option for my Purchases. According to this official documentation on Transaction.all , i should be getting my refunded consumables in Transaction's all property.
But there is no way for me to know what kind of data is in the refunded transaction object. Will there be a 'revocation date' like in the case of non-consumables?
A purchase can result in success with verificationResult .unverified. Is there a list of reasons for which the transaction might be unverified and how should i handle it in my app? From my understanding, a successful unverified transaction means the user has already paid for the purchase. So, do i just ignore the unverified transaction or do i provide content to the user anyways?
Issue Description
The submission did not include all the required information for apps offering auto-renewable subscriptions.
The app's metadata is missing the following required information:
A functional link to the Terms of Use (EULA). If you are using the standard Apple Terms of Use (EULA), include a link to the Terms of Use in the App Description. If you are using a custom EULA, add it in App Store Connect.
Next Steps
Update the metadata to include the information specified above.
Resources
Apps offering auto-renewable subscriptions must include all of the following required information in the binary:
Title of auto-renewing subscription (this may be the same as the in-app purchase product name)
Length of subscription
Price of subscription, and price per unit if appropriate
Functional links to the privacy policy and Terms of Use (EULA)
The app metadata must also include functional links to the privacy policy in the Privacy Policy field in App Store Connect and the Terms of Use (EULA) in the App Description or EULA field in App Store Connect.
Please let me know where I have to add this link (EULA). And by EULA, they mean a simple terms of use link, or is it something else?
Topic:
App Store Distribution & Marketing
SubTopic:
App Review
Tags:
Subscriptions
StoreKit Test
StoreKit
In-App Purchase
Hello developers,
We're facing a critical issue with our app and need your insights:
Since today, 3 specific IAP products return empty data when calling Product.products(for: [productId]).
This affects all users, preventing any successful purchases of these items.
Other IAP products seem unaffected.
let products = try await Product.products(for: [productId])
Key details:
Production environment
Issue started: 2025.6.17
No recent app updates
All products show as "Approved" in App Store Connect
Questions:
Has anyone experienced similar issues recently?
Could this be a StoreKit or App Store system problem?
Any suggestions for diagnosing or resolving this, besides contacting Apple Support?
Recommendations for temporary workarounds?
This is severely impacting our business. Any help is greatly appreciated!
Thank you!
Dear my friends,
I have set up two subscriptions (monthly and annual) in App Store Connect. By configuring with StoreKit, I can import the configurations from App Store Connect into the local .storekit file, and the program can
run normally. However, when the StoreKit configuration is set to NONE, I am unable to retrieve product information from App Store Connect.
The code for fetching the product list is as follows. Could you please provide suggestions on how to proceed? Thank you very much!
private let productIds: [String] = ["subscription.year", "subscription.monthly"]
subscriptions = try await Product.products(for: productIds)
Hello,
I've noticed the prices of my products in my Xcode synced StoreKit configuration are not updated when I change the price in App Store Connect. I tried to manually sync the file, to remove and add it again to my project but old initial prices are still used.
In the screenshot below, the price is currently $2.99 but the file still uses the initial price of $1.99. It makes testing a little bit painful because I'm never sure which product is being shown.
Is this a bug?
Is there a way to get the live production App Store prices be used instead of the starting prices?
I filed a feedback for this: FB17798486
Regards,
Axel
Topic:
Developer Tools & Services
SubTopic:
Xcode
Tags:
StoreKit Test
StoreKit
App Store Connect
Xcode
Hi,
We're currently experiencing an issue with consumable In-App Purchases on our production iOS app. Until the end of May, everything was working as expected, but starting in early June, our app no longer receives any products when calling queryProductDetails() using Flutter’s in_app_purchase plugin (which utilizes StoreKit).
Here’s what we’ve confirmed so far:
The product IDs are correctly configured in App Store Connect, and all items are marked as “Approved.”
No recent changes have been made to the bundle ID or the product IDs.
The “Base Territory” setting was updated for each IAP item in early May. After that change, product retrieval and purchases were working normally through the end of May.
This issue is happening on real devices in production, and multiple users are affected.
The same functionality continues to work correctly on Android.
All requested product IDs are being returned in the notFoundIDs list of the queryProductDetails() response.
We're quite puzzled by this issue as no clear cause has been identified so far.
Any thoughts on this issue would be much appreciated.
Thank you!
Question on token testing in development:
Hello,
I'm developing a React Native application using StoreKit External Purchase. I'm having difficulties testing the transaction token retrieval in the development environment.
Specific questions:
Is it possible to test the transaction token retrieval in development/sandbox environment?
Is there a special testing mode for developers that would allow simulating token reception without going through the App Store?
Are there specific debugging tools to verify proper token reception?
Question on native implementation:
Regarding the native implementation of StoreKit External Purchase:
Is there detailed documentation on creating native modules for React Native that implement StoreKit External Purchase?
Can you confirm if the following approach is correct for native implementation:
Using NSClassFromString(@"ExternalPurchase")
Calling presentNoticeSheetWithURL:completion:
Retrieving the token in the completion block
Are there any code examples for complete native implementation?
Question on implementation validation:
For validating StoreKit External Purchase implementation:
How can we verify that our implementation is correct before App Store submission?
Are there validation tools or automated tests to check compliance?
What are common errors to avoid during implementation?
Question on best practices:
Regarding implementation best practices:
What's the best way to handle potential errors during token retrieval?
How to handle cases where the user cancels the transaction?
What are the recommended security checks for server-side token validation?
Question on documentation:
I'm looking for additional resources on StoreKit External Purchase:
Is there specific documentation for integration with frameworks like React Native?
Are there complete code examples for native implementation?
Where can I find information about testing and debugging best practices?
Additional technical question:
Technical implementation details:
What's the correct way to handle the ExternalPurchase class initialization in React Native native modules?
Are there specific requirements for the URL passed to presentNoticeSheetWithURL?
How should we handle the token in the completion block to ensure it's properly passed back to React Native?
Question on testing workflow:
Testing workflow questions:
What's the recommended testing workflow for External Purchase implementation?
How can we verify the token format and validity before production deployment?
Are there any tools or methods to simulate the complete purchase flow in development?
this error occurred during the StoreKit1 payment process. Could you please tell me the reason?
SKErrorDomain Code=0 "发生未知错误\" UserInfo= {NSLocalizedDescription=发生未知错误,NSUnderlyingError=0x17652ee50 {Error Domain=ASDErrorDomain Code=500"(null)\"Userlnfo={NSUnderlyingError=0x17652d530 {Error Domain=AMSErrorDomain Code=203 "(null)" Userlnfo= {NSUnderlyingError=0x17652c3c0 {Error Domain=AMSErrorDomain
Code=203"(null)\"UserInfo=0x1663e5940(not
displayed)}}}
Hi everyone,
I'm encountering a persistent issue with App Store Connect and hoping someone has seen this before or can advise.
I have an approved in-app purchase (product ID: inspo_credits_10), and everything is correctly configured:
The IAP is Approved and Ready for Sale
The capability is enabled in both the Apple Developer portal and Xcode
My app uses StoreKit correctly (Product.products(for:))
I’ve uploaded multiple builds (latest: version 1.3.8, build 3)
The problem:
When preparing the version (1.3.8) in App Store Connect, the “In-App Purchases” section does not appear at all — so I can’t attach the IAP to the version or submit it for review.
I've tried:
Re-uploading builds
Creating new versions (1.3.9, 1.4.0…)
Re-enabling the IAP capability
Confirming that StoreKit is properly integrated
Waiting multiple days for propagation
Even creating new IAPs
Still, the IAP section doesn’t appear when editing the version.
Apple support responded, but directed me to Developer Technical Support without offering a fix or escalation path.
Has anyone experienced this before — an approved IAP that doesn't show up in App Store Connect’s version editor?
Is there a way to force a refresh or escalate this internally?
Would appreciate any advice or direction!
Topic:
App Store Distribution & Marketing
SubTopic:
General
Tags:
StoreKit
App Store Connect
In-App Purchase
I has sandbox account with Japanese local. When i build app directly to check, price is displayed in Japanese Currency. But when I install app from the Test Flight, price is always displayed in USD Currency.
the issue is appear in iOS 18.5
How can i fix this issue ?
I changed my AppleID password. Now for any app distributed via TestFlight the call to AppTransaction.shared throws "Unable to Complete Request". This only happens for this one ID, and only when distributed via TestFlight. I have tried different apps and devices, all with the same result.