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...
In-App Purchase
RSS for tagOffer extra content, digital goods, and features directly within your app using in-app purchases.
Posts under In-App Purchase tag
200 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I tried to apply a promotional offer to a subscribed user.
When I tested it in the Sandbox environment, it did not show the promotional payment popup but returned a “restored” status.
However, when I tested it in the Xcode environment, it correctly displayed the payment popup, but after I tapped the Subscribe button, it showed an “Unable to Purchase” popup like this:
And in the console I could see this error:
Received error that does not have a corresponding StoreKit Error: Error Domain=AMSErrorDomain Code=305 "Server Error The server encountered an error" UserInfo={AMSURL=http://localhost:56862/WebObjects/MZBuy.woa/wa/inAppBuy, AMSDescription=Server Error, NSDebugDescription=Server Error The server encountered an error, AMSServerErrorCode=3903, AMSStatusCode=200, AMSServerPayload={
"cancel-purchase-batch" = 1;
dialog = {
defaultButton = ok;
explanation = "Contact the developer for more information.\n\n[Environment: Xcode]";
initialCheckboxValue = 1;
"m-allowed" = 0;
message = "Unable to Purchase";
okButtonString = OK;
};
dsid = 17322632127;
failureType = 3903;
jingleAction = inAppBuy;
jingleDocType = inAppSuccess;
pings = (
);
}, AMSFailureReason=The server encountered an error}
Could someone help me resolve this issue? I’ve been struggling with it for two days and feeling exhausted...
Hello everyone, I achieved my MacOs app and distributed for "App Store Connect" and I already have setup the Product In App Purchase in the App Store connect, and I even tested the purchase flow using the local .storekit file using the "Edit Schema". And now, when I remove the edit scema's storekit file and archieved the app and used the Internal testing and installed the app using Testflight, I see that the product is not showing, an empty product array is being returned and there is no option to purchase.
I don't want to sumit the full app until I test the StoreKit integration in real test
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
StoreKit
App Store Connect
In-App Purchase
TestFlight
SKStorefront.countryCode always returns "US" in TestFlight and sandbox,
even when sandbox Apple ID is set to a different country.
Is this expected behavior?
Is SKStorefront guaranteed to return the correct storefront
only for production App Store builds?
Topic:
Developer Tools & Services
SubTopic:
Apple Developer Program
Tags:
StoreKit Test
StoreKit
In-App Purchase
TestFlight
Here are some tips from App Review for a smooth review experience. We’ve split them into two categories: Before You Submit and After You Submit. We’ve also made an easy-to-follow Submission Guide you can save and reference at any point on your App Store journey.
Before You Submit Tips
Enable a complete review.
Make sure you’ve provided demo accounts or implemented an account demonstration mode before you submit. We’ll need to review the entire app experience, both with and without an account.
Provide up-to-date demo account login credentials in the App Review Information section on the app version page in App Store Connect.
If your app has multiple account types (such as admin and general users), use the Notes field to provide additional demo account credentials for each account type.
If your app requires an authentication code in addition to the login credentials, provide the code in advance in the Notes field. Otherwise, a call may be required to complete the review.
Apps that handle sensitive user information, or operate in highly regulated industries, can implement demonstration modes that exhibit full features and functionality while using demonstration data.
Use the Notes field in App Store Connect to provide information to App Review.
The App Review Information section of App Store Connect includes a Notes field. Provide any information that could be relevant to your submission’s review:
Submitting a new app? Tell us about your app's concept, business model, and if your app is designed to only operate in certain locations.
Submitting an update? Tell us about what’s changed and where to locate significant new content or features.
Connecting to hardware? Attach a video, not a screen recording, that shows both the hardware and the app running on a physical Apple device as they pair and interact.
Test your app on physical devices before submitting for review. Use TestFlight to distribute your app for beta testing.
App Review evaluates apps the way your users will use them: installed on real devices and connected to networks with real-world conditions. Make sure your pre-submission testing includes running the app on each device platform where it could be used. Users expect the app to function on all the devices where it’s available.
TestFlight will help you do quality assurance and beta testing on real devices. Share your beta app with internal testers on your Apple Developer Program account or to external users via an email invite or public link.
Configure In-App Purchases for review in the sandbox environment.
App Review assesses In-App Purchases in the same sandbox environment Apple provides for testing them. The sandbox lets us use real product data and server-to-server transactions, without incurring any financial charges.
Take these steps to prepare your In-App Purchases for review:
Accept the Paid Applications Agreement in App Store Connect.
Submit the In-App Purchases in App Store Connect that you’d like reviewed.
Follow the steps in TN3186: Troubleshooting In-App Purchases availability in the sandbox if your app fails to display your In-App Purchases.
Note: In-App Purchases don’t need prior approval from App Review to function in review.
Join a Meet with Apple event if you need assistance before you submit for review.
Request an App Review appointment through Meet with Apple to chat with an App Review expert about how to prepare for review, ask questions about specific guidelines, and discuss other topics related to the review process. Appointments are subject to availability during your local business hours on Tuesdays and Thursdays.
After You Submit Tips
Contact App Review if you need assistance with an ongoing submission.
If your submission doesn’t pass review and you have questions, contact App Review directly by clicking Reply to App Review in App Store Connect. You’ll receive a reply from a review specialist who’s familiar with your app.
You can also use the Reply to App Review message window to request a call with an Apple representative. Include your preferred time and language for the call and we’ll do our best to accommodate your requests.
Use the Bug Fix Submissions process to quickly deliver bug fixes and resolve other issues on the next submission.
If an update includes bug fixes and is rejected, you will be given the option to resolve the issues on your next submission, as long as there are no legal or safety concerns. App Review will let you know if your submission is eligible by including this note at the top of the rejection message:
Bug Fix Submissions
The issues we've identified below are eligible to be resolved on your next update.
To accept this offer, simply reply to the rejection message in App Store Connect and let App Review know you’ll resolve the issues on the next submission.
Share ideas with Apple about how to improve or clarify the App Review Guidelines by submitting guideline feedback.
Just as the App Store is always changing and improving to keep up with the needs of customers, the App Review Guidelines may be revised to provide new and updated guidance. If you have ideas for improving or clarifying our requirements you can suggest guideline changes.
If your submission was rejected but you believe it follows the App Review Guidelines, consider submitting an appeal to the App Review Board.
If your submission didn’t pass review but you have reason to believe it follows the App Review Guidelines, you can submit an appeal to the App Review Board. You can also file an appeal if you think we misunderstood your app or the review was unfair. The App Review Board will contact you as soon as they complete their investigation.
Topic:
App Store Distribution & Marketing
SubTopic:
App Review
Tags:
App Review
App Store Connect
In-App Purchase
TestFlight
Hello,
My app uses auto-renewable subscriptions.
I submitted an update and at first the subscription products appeared properly under the monetization section in App Store Connect.
However, after resubmitting the binary for review, the subscription product attachment disappeared, and now it is not possible to re-attach them.
Even sandbox testing cannot retrieve the subscription identifiers anymore, because the monetization section no longer shows the products.
Questions:
Why did the subscription products disappear after a resubmission?
How can I re-attach subscription products to the new version?
Do I need to remove the current version submission to make subscriptions appear again?
Does App Review need to finish processing subscription approval separately?
Notes:
The first version binary showed subscription products.
After internal rejection and resubmission, they disappeared.
Using StoreKit 2 restore flow in production code.
Sandbox accounts cannot fetch product identifiers.
Any guidance would be appreciated.
Thanks.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
Subscriptions
StoreKit
App Store Connect
In-App Purchase
I´m tring to integrate InApp push provisioning but when I send the information from the issuer to SDK to add my debit card to wallet I saw this error: PKPassKitErrorDomain Code 2 error
Looking in the forum I found how to see part of the logs to get more detail on the error and I found:
POST https://pr-pod9-smp-device.apple.com:443/broker/v4/devices/04131B65D01590022288082867404947F3CCA674C3D41F3C/cards/683986c983984251b9aecfc8ff51d88a/enable
'Error Domain=PKPaymentWebServiceErrorDomain Code=0 "Error inesperado." UserInfo={PKErrorHTTPResponseStatusCodeKey=500, NSLocalizedDescription=Error inesperado.
Topic:
Developer Tools & Services
SubTopic:
Developer Forums
Tags:
Wallet
Entitlements
In-App Purchase
Provisioning Profiles
I am implementing In App Purchase and integrating App Store Server Notifications version 2.
I am able to receive the JWSSignedPayload from Apple. The payload is Base64 encoded and contains header, payload, and signature. The documentation clearly explains how to decode the payload and extract claims such as notificationType and data.
What is unclear is how to verify the JWS signature itself.
I could not find concrete documentation that explains:
Which Apple public key or certificate should be used for verification
How to retrieve or rotate the key used to sign the payload
The exact steps required to validate the JWS signature before trusting the payload
Signature verification is critical for security, and simply decoding the claims without validation is not sufficient.
I am looking for official guidance or a recommended approach to verify the JWSSignedPayload signature for App Store Server Notifications v2.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
StoreKit
App Store Connect
In-App Purchase
App Store Server API
Hello,
I’m integrating promotional offers for auto-renewable subscriptions using StoreKit 2.
The offer is displayed correctly, the Apple purchase sheet appears, and I can start the payment flow. The sheet shows the correct discounted price and the end date of the offer. However, after confirming the purchase, an alert appears saying “Unable to Purchase - Contact the developer for more information”
When dismissing the alert, Xcode logs the following:
Purchase did not return a transaction:
Error Domain=ASDServerErrorDomain Code=3902
"No se ha podido realizar la compra"
UserInfo={
NSLocalizedFailureReason=No se ha podido realizar la compra,
client-environment-type=Sandbox,
AMSServerErrorCode=3902,
storefront-country-code=ESP
}
Test environment:
App installed from Xcode on a real iPhone
Logged in with a Sandbox Apple ID
Using StoreKit 2
Promotional offer applied using:
Product.PurchaseOption.promotionalOffer(_:compactJWS:)
On the server side, I generate the promotional offer signature exactly as described in Apple’s documentation:
https://developer.apple.com/documentation/storekit/generating-a-signature-for-promotional-offers
The signature is generated using a Subscription Key
Signed with ECDSA + SHA256
Uses the correct invisible separator (U+2063)
The signature is validated locally using the derived public key and verifies correctly
The sandbox user has had previous subscriptions, which is why this promotional offer is eligible and shown.
Given that:
The offer is displayed correctly
The purchase sheet shows the discounted price and duration
The signature validates locally
The error occurs only after confirming the purchase
My question is:
Is this a known limitation or issue with promotional offers in the Sandbox environment?
Should promotional offers be tested exclusively via TestFlight instead of Sandbox?
Any clarification would be greatly appreciated.
Thank you!
Hi,
at first I submitted an app where you asked for a way to review everything while you mentioned a demo mode would be fine. I added a demo mode and submitted the app together with in-app purchases. Now you are asking for an actual API token for an external service which I cannot provide. I responded with the info about the demo mode. The next review was rejected because the in-app purchases are kind of lost. I cannot map them.
Next re-submit was rejected because the in-app purchases are missing.
The in-app purchases are stuck in a waiting status.
Please do whatever you need to do to either release the in-app and let me map them again or map them yourself.
Regards,
Vitali
I experienced a severe backend session handling error where the payment gateway used a wrong billing token, despite the frontend UI explicitly displaying the current user's details. This resulted in an accidental renewal of a different developer account.
The Setup You opened the Developer App and logged in as ____. You filled in your details correctly (Name: AB, Last Name: CD). The screen confirmed this: "You are paying for ____."
The Action You pressed the Enroll/Pay button. You approved the payment with your card/UPI.
The Invisible Switch (The Bug) At the exact moment you clicked "Pay," the Apple App didn't look at the screen you were seeing. Instead, it looked deep into your phone’s history and said: "Wait, I know this phone! This phone belongs to an old account that already has a membership. I'll just renew that one."
The Result The system took your money and sent it to the Old Account it remembered from history, completely ignoring the New Account (____) that was right there on the screen.
The Outcome
New Account (____): Still says "Pending" because it never got the money.
Old Account: Got renewed instantly because the system prioritized the "device history" over the "logged-in user."
It was a bait-and-switch by the app. You clicked "Pay" for AB, but the wire connected to Old Friend.
Hi,
I have an "Apple Watch Only" app that you can download for free and conduct a 7 day trial. After that, there is an IAP to unlock a lifetime license.
For the life of me I can't find out how the process of redeeming promo codes for the IAP should work. Once generated, people try to redeem them in the AppStore (on their phone), but then they end up in a hanging process saying it's reinstalling the app to redeem the offer. But then nothing happens. Also running "Restore Purchase" within the app to pickup any maybe by now activated license is not working.
Why does it even want to reinstall the (free) app? This doesn't sound right. Does anyone have IAP for a watch-only app and can shed some light on the promo code topic?
Topic:
App Store Distribution & Marketing
SubTopic:
General
Tags:
App Store
In-App Purchase
App Store Server Library
Hi,
I am trying to get an app approved. In app purchases say that I need to fix something without saying what needs fixing. I can't add the in-app purchases to the app review and that one does not pass because there are in-app purchases missing.
How can I fix this issue? I assume that during review someone could just write whats missing but obviously they won't.
The message I received said:
One or more of your In-App Purchases has been returned for the following app:
Literally nothing else.
Regards,
There is a project that has been running online for years. A few months ago, a player reported that after making their first successful IAP at a specific purchase point, any subsequent attempts to purchase the same item do not trigger the payment window. Instead, they get the error:"This in-app purchase has already been bought".After contacting Apple Support once, the player was able to make a payment, but the issue reappeared on the next attempt. So far, this is the only user reporting the problem, other people can purchase normally.
Question1:
Here’s what I’ve tried:
I reviewed the code and ensured that TransactionObserveris correctly called.
I’ve also added **[[SKPaymentQueue defaultQueue] finishTransaction:transaction]**in all possible places, but the issue persists.
According to the logs, after the user’s first purchase, every subsequent IAP attempt returns the same receipt from the initial successful transaction, even though I’m certain finishTransactionis being called. It seems like this method isn’t having the intended effect.
Question2:
I asked the player to manually trigger the Restore Purchases button by calling [[SKPaymentQueue defaultQueue] restoreCompletedTransactions].
the restoreCompletedTransactionsFailedWithErrorcallback returned the following error:
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made."
The player has already checked their device time and tried switching between Wi-Fi and 4G, but the error remains. Is this SSL error related to the "already bought" error? Note that this SSL issue occurred during a separate restore process, not during a purchase attempt.
Question: 3:
I noticed that I’m not calling finishTransaction inside the restoreCompletedTransactionsFailedWithErrorcallback. Should I add it there?
Purchase Logs:
The player clicked "Restore Purchases" and then attempted another purchase. The purchase flow appears normal, but the IAP returns an old, already-used receipt.
[2025-12-10 17:41:38:995] Restore transaction failed: Error > Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a > secure connection to the server cannot be made."
[2025-12-10 17:41:40:010] Restore transaction failed: Error > Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a > secure connection to the server cannot be made."
[2025-12-10 17:41:42:011] buy method called... productID: > huoxiancj_648 orderID: 22674511
[2025-12-10 17:41:42:107] ----Log Observers ID----
[2025-12-10 17:41:42:108] ObserverID: 0x109968890
[2025-12-10 17:41:42:108] Processing unfinished transactions...
[2025-12-10 17:41:42:108] Finished processing unfinished > transactions.
[2025-12-10 17:41:42:108] Allowing in-app purchase...
[2025-12-10 17:41:42:215] Requesting product info...
[2025-12-10 17:41:42:989] productsRequest didReceiveResponse:
[2025-12-10 17:41:43:066] Invalid Product ID: (
[2025-12-10 17:41:43:066] Purchase quantity: 1
[2025-12-10 17:41:43:066] Product info:
[2025-12-10 17:41:43:067] Price: 648
[2025-12-10 17:41:43:067] Product ID: huoxiancj_648
[2025-12-10 17:41:43:067] Validating product info...
[2025-12-10 17:41:43:067] Sending payment request...
[2025-12-10 17:41:43:067] requestDidFinish
[2025-12-10 17:41:43:132] paymentQueue updatedTransactions.
[2025-12-10 17:41:43:133] updatedTransactions case > SKPaymentTransactionStatePurchasing
[2025-12-10 17:41:43:208] [payment.applicationUsername] > userid=50306496 appid=1045 instid=12844 reserve=xxxx > productID=22674511
[2025-12-10 17:43:16:008] paymentQueue updatedTransactions.
[2025-12-10 17:43:16:008] updatedTransactions case > SKPaymentTransactionStatePurchased
[2025-12-10 17:43:16:008] productIdentifier= huoxiancj_648
[2025-12-10 17:43:16:113] Sending receipt to server for validation.
[2025-12-10 17:43:16:113] Transaction completed.
Any help or suggestions would be greatly appreciated! Thanks in advance.
Dear Reviewers/Apple Team/Community,
We have trying to submit our app continuously for review and being rejected continuously by Apple. Our app works perfectly fine in TestFlight using the same ID apple is using. We have also provided recorded video of the testing in TestFlight to Apple reviewer. However, despite our requests below things are not done:
Before testing the in-app purchase subscription are not being approved, despite us requesting the same every time during submissions.
At times we are getting snapshots under error category, where everything is correct even from Apple testing.
We have no other way but to explain, give snapshots, give videos to Apple to help them understand how to test the app.
We have requested the reviewers multiple times for a call, but we got a call only 1 time.
We are not sure what is the way we can get to talk with the reviewer and understand from them the issue they are facing.
Can anyone please help us out? Below is one example, it was given it us under error category, where even with apple standard, the purchase is successful.
Can someone help us out plz.
Topic:
App Store Distribution & Marketing
SubTopic:
App Review
Tags:
Subscriptions
App Store Connect
In-App Purchase
App Store Receipts
Dear Apple Support,
I am writing to report a payment issue with my App Store Connect developer account.
The latest payment is marked as "Paid" in the Payments and Financial Reports section, but as of today, more than 3 business days have passed and the funds have not yet arrived in my bank account.
I have double-checked that my banking information is accurate and up to date. I would appreciate it if you could investigate this issue and provide further clarification on the current status of the payment.
Thank you in advance for your support.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
App Store Connect
In-App Purchase
Developer Program
I'm experiencing an issue where monthly and family monthly subscriptions fail immediately with "purchase cancelled" in TestFlight, while yearly and family yearly subscriptions work correctly.
Setup:
All 4 products in same subscription group
All show "Ready to Submit" status
Using react-native-iap with StoreKit 2
Testing in TestFlight sandbox
The Problem:
Yearly subscriptions work fine
Monthly subscriptions fail immediately with E_USER_CANCELLED (no dialog appears, user didn't cancel)
What I've verified:
No active subscriptions (getAvailablePurchases() returns empty)
No pending transactions
Same subscription group for all products
Product IDs match App Store Connect
Code is identical for all products
Error: E_USER_CANCELLED fires immediately when calling requestPurchase() for monthly products, but yearly products proceed normally.
Questions:
Why would monthly fail while yearly works (same group, same config)?
Could this be sandbox state corruption for monthly products?
Should I delete/recreate the monthly products?
Any insights would be appreciated!
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
Subscriptions
StoreKit
In-App Purchase
TestFlight
会员等级进行升级?需要按天计算费用,像爱奇艺这样是怎么做的?
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
StoreKit
In-App Purchase
App Store Server API
Advanced Commerce API
Hi there! Whenever I try to add a new Offer Code for my app's subscription, I get an unknown error. When I get to the last step of the "Create Offer for Codes" flow, I get an error that error reads "An error has occurred. Try again later." I have been getting this same error for over a week now, so any help figuring out how to add new offer codes would be greatly appreciated!
As a developer I have a question I would like cleared up. We offer two tiers of annual subscriptions in our apps. These subscriptions are under the same subscription group in App Store connect. My question is, if a user purchases tier 1 of the annual subscription for $10.00, and uses it for 6 months; then chooses to upgrade to tier 2 which costs $20.00 per year. Would the user be pro-rated the difference in price i.e. charge only another $10.00 at the time of the upgrade., or are they charged $20.00 and then refunded the difference in their remaining lower tier subscription? I keep finding inconsistent answers across the Apple community forums on this.