Hi everyone,
I’m seeing a strange behavior with StoreKit 2 and I’d like to know if anyone else experienced this.
My subscription group “ROTA Premium” (Monthly + Annual) is currently Waiting for Review in App Store Connect.
What works
In Xcode’s StoreKit sandbox, everything loads correctly:
Products appear
Trial starts
Purchases work
What doesn’t work
In TestFlight and App Review, StoreKit 2 returns zero products, so my paywall shows:
“No subscription options found.”
There are:
No geo restrictions
No backend
No VPN/IP filtering
Paid Apps Agreement is accepted
App Review said the device was online, but couldn’t give technical help.
My question
Has anyone seen StoreKit 2 fail to load subscription products when the subscription group is still in Waiting for Review?
Do subscription groups need to be reviewed together with the app version for StoreKit 2 to return them in TestFlight/App Review?
Any advice would be appreciated!
Thanks.
StoreKit
RSS for tagSupport in-app purchases and interactions with the App Store using StoreKit.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hi! I’m new in programming apps for Apple Store and I’m creating my first app. I already send my for review but I get an answer of problems with the subs flow. If there’s anyone who can help me fix this problem and implement my subscriptions in my app and test it out I would be thankful, I want the flow work like in the image!
Hi,
Using StoreKit 2 with App Store Server notifications like so:
User selects a purchase
App calls Product.purchase()
If successful, App Store notifies our backend with the transaction details, importantly with a UUID for the transaction ID.
This works fine, but when I try to test contingent pricing via the handy StoreKit config Transaction Manager in Xcode by creating a PurchaseIntent if I then complete the purchase in the app the Transaction ID is sequential, (0 for the first, 1 for the second etc), which doesn't work for us as the backend might already have that ID stored so the purchase never completes.
If I disable the config file it works fine, but then I can't use the Transaction Manager debug tool. Is there a way to override the ID of a custom transaction that's created via the StoreKit configuration?
Thanks
We have a user that has an active subscription according to the appstore in our product but it is registering as expired. Hitting the subscribe button in the SwiftUI SK2 dialog does nothing, meaning, nothing happens.
Any ideas?
Topic:
App & System Services
SubTopic:
StoreKit
In our app we are running into a few issues with pending purchases staying on receipt indefinitely.
These are consumable purchases where we received the purchase succeeded from apple but then something went wrong on our servers to validate and confirm the purchase.
At this point the purchase stays on the apple receipt indefinitely or until we confirm it.
The problem is there are lots of scenarios where we can't confirm purchases anymore (like a game world expired/banned player/etc). So there's a few things I'd like to know to see how this could be handle correctly.
1- Was the user already charged, and if yes would they ever be refunded if the purchase is not confirmed (some sort of expiry)?
2- Is there a way to cancel this sort of pending transaction directly from the app or backend?
3- If one of these users asked for a refund from apple would this clear the purchase from the receipt?
Any information would be greatI couldn't find a lot of info on this topic.
Topic:
App & System Services
SubTopic:
StoreKit
Hello! I am trying to get my app set up to support external payments. The snag I am hitting at the moment is it seems that relevant pages are not accessible?
There is this old EU doc
https://developer.apple.com/support/apps-using-alternative-payment-providers-in-the-eu/
But the more updated US doc titled "Distributing apps in the U.S. that provide an external purchase link - Support" is not available where it should be https://developer.apple.com/support/storekit-external-entitlement-us/
In addition the link for requesting the entitlement seems to be broken
https://developer.apple.com/contact/request/storekit-external-entitlement-us/
Any idea how one can access these? Perhaps this is just a temporary error?
Our app cannot retrieve in-app purchase products from the App Store. We're getting a "storekit_no_response" error when attempting to fetch product information, despite having all products properly configured in App Store Connect.
Error: IAPError(code: storekit_no_response, source: app_store, message: StoreKit: Failed to get response from platform., details: null)
Verified product IDs match exactly what's in App Store Connect
Confirmed we're using a Sandbox Test Account
Checked that In-App Purchase capability is enabled
Waited over 24 hours for product availability
Tried multiple product ID formats
This issue is preventing us from implementing subscription functionality in our app. We need assistance determining why StoreKit isn't responding to our product queries.
Thank you for your help.
Topic:
App & System Services
SubTopic:
StoreKit
Hi Team,
I’ve successfully implemented the subscription flow for my app. However, I’m currently facing challenges related to testing the cancellation behavior for auto-renewable subscriptions.
Specifically:
I’m unable to locate the correct payload structure for the following test endpoint:
https://api.storekit-sandbox.itunes.apple.com/inApps/v1/notifications/test
I’m also unclear on how to simulate or complete the full lifecycle of a subscription (including cancellation) using Apple’s sandbox environment or APIs.
Could you please guide me on how to:
Retrieve or construct the proper payload for the test notification API?
Simulate a cancellation flow end-to-end in the sandbox for auto-renewable subscriptions?
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
StoreKit Test
StoreKit
App Store Server Notifications
I am testing a consumable in-app purchase in the StoreKit sandbox and I am seeing behavior that does not seem correct on repeat purchase attempts.
Product details
Product ID: album.credit.v2
Type: Consumable
Test environment: iOS device + StoreKit sandbox
Purchase flow triggered from my Flutter app using Apple IAP
What happens
First purchase attempt works
My backend receives the confirmation
The album is granted correctly
On the second purchase attempt of the same consumable, I do not get a normal new purchase flow
Instead, StoreKit returns the product as restored
My app then cancels the attempt because a restored transaction arrived during checkout
Expected behavior
Because this product is a consumable, each purchase attempt should behave like a new purchase and allow the user to buy it again.
Actual behavior
On the second attempt, the transaction update comes back as restored instead of a new successful consumable purchase.
Relevant logs
First successful purchase:
[ProPurchasePage] ✅ Pay tapped. starting=false iap=true albumProd=album.credit.v2 proProd=pro.monthly
[IAP] update: id=album.credit.v2 status=PurchaseStatus.restored pendingComplete=false err=null
[IAP] expected=album.credit.v2 starting=true appleFlow=true
[ProPurchasePage] album credit success status=PurchaseStatus.restored receiptLen=5334
[AppleIapService] Sending Apple IAP confirmation for albumId=ariie_west_pretty_girl_summer, buyerUid=PYjgu9TMCieCVDLIdTuawY5k4Ay2
[AppleIapService] appleIapConfirm response status: 200
[AppleIapService] appleIapConfirm applied for albumId=ariie_west_pretty_girl_summer buyerUid=PYjgu9TMCieCVDLIdTuawY5k4Ay2
After that, the purchase is written correctly on my side:
"libraryAlbums": [
{
"AlbumId": "ariie_west_pretty_girl_summer",
"paid": true,
"Quantity": 1
}
]
Second and later attempts:
[ProPurchasePage] ✅ Pay tapped. starting=false iap=true albumProd=album.credit.v2 proProd=pro.monthly
[ProPurchasePage] buyConsumable (album.credit.v2) returned: true
[IAP] update: id=album.credit.v2 status=PurchaseStatus.restored pendingComplete=false err=null
[IAP] expected=album.credit.v2 starting=true appleFlow=true
[IAP] restored arrived during album checkout — cancelling attempt
Question
Is this expected StoreKit sandbox behavior for a consumable, or does this suggest:
a StoreKit sandbox issue,
a problem with how the product is configured in App Store Connect,
or a transaction-handling issue in the app/plugin layer?
Also, is there any Apple-recommended handling for repeated consumable purchases when sandbox keeps surfacing a restored status?
Topic:
App & System Services
SubTopic:
StoreKit
アプリ内課金を実装しようとしていますが、サーバサイドのセキュリティに関してについて質問です。
StoreKit2を使えばアプリとApp Store Connect間のレシート検証は不要だが、
購入情報をサーバーで管理する場合は
アプリからサーバーに購入情報を渡す際にレシート検証する必要があると考えるがその認識であっているか教えていただきたいです。
I have created a Python app and built it with pyinstaller and codesigned everything. Now I want to Sandbox test it. In my appstore connect account i have created a subscriptions id. I read that if I am logged out from the AppStore and have codesigned my .app file with a Developer Certificate i should be able to run the app on my local mac and when i click on the "Buy" button it should connect to my app store connect setup. I have implemented StoreKit in my app and use a storekit_bridge to combine the .swift code with my python app.
However when i run the app. I get this: "25-07-24 21:01:12,557 - FEC - WARNING - StoreKit: fetchProducts returned empty result
2025-07-24 21:01:12,557 - FEC - INFO - StoreKit fetch_products returned: {"products": []}
2025-07-24 21:01:12,557 - FEC - ERROR - StoreKit: Failed to parse product info: No products returned from JSON"
And no login screen appears where I should be able to enter my Sandbox email adress and password.
Anyone here who has experience with a Python app combined with In App Purchases? Hope someone can help me out with this.
We offer a 3-day free trial, and our paywall clearly states that users will be charged after the trial ends.
However, some users request refunds after the charge - even after fully using our app for days or even weeks. In some cases, refunds are approved despite the users having consumed our AI processing services for up to a month.
Since our app relies on backend AI processing, each user session incurs a real cost. To prevent losses, we utilize RevenueCat’s CONSUMPTION_REQUEST system and have set our refundPreference to: "2. You prefer that Apple declines the refund".
Until recently, Apple typically respected this preference, and 90% of refund requests were declined as intended.
However, starting about a week ago, we observed a sudden reversal: Apple is now approving around 90% of refund requests, despite our refund preference. As a result, we are operating at a loss and have had to halt both our marketing campaigns and our 3-day free trial.
We’re trying to understand whether this shift is due to a change in Apple’s refund policy, or if we need to handle CONSUMPTION_REQUEST differently on our end.
Has anyone else experienced similar changes? Any insights would be greatly appreciated.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit
App Store Server Notifications
App Store Server Library
Where the problem occurs:
In-app purchase
Non-ApplePay
Non-local authentication login
Environment where the problem occurs:
Sandbox environment (Development environment, TestFlight environment)
Problem handling process:
Open page A in the app and purchase product B (auto-renewable subscription) on that page.
User authentication is required to purchase product B.
During the authentication process, the user needs to enter the Apple account and Apple account password.
After completing the authentication, complete the purchase of product B.
Problem in step 3:
Why is FaceID or TouchID not used for authentication?
Note: Face ID and Password -> iTunes Store and App Store -> Status is Enabled
We are using consumable in-app purchases. Starting from May 27th, we began receiving refund callbacks with the notificationType set to ONE_TIME_CHARGE immediately after users successfully completed a payment.
{
"notificationType": "ONE_TIME_CHARGE",
"signedPayload": "..."
}
During this period, we did not make any changes to our App release or server-side purchase handling logic.
Could this issue result in actual refunds being processed? What steps should we take to resolve this issue?
We also noticed in your changelog that a new notification type ONE_TIME_CHARGE has been introduced.
Can we safely ignore callbacks with the ONE_TIME_CHARGE notification type without affecting refund processing or user experience?
Topic:
App & System Services
SubTopic:
StoreKit
I set up a sandbox account to test in-app purchases in my development app. I went to settings > dev > sandbox accounts and updated my login in the app store. But I received a 'block'; I can no longer download new versions or anything from the store. I've already removed the sandbox account, and even using my real Apple ID, I can't use the functions.
Topic:
App & System Services
SubTopic:
StoreKit
I'm encountering an issue with the App Store Server API where the appAccountToken is not preserved when users migrate their Apple ID email addresses. I've submitted
Feedback Assistant ticket FB18709241 but wanted to check if anyone else has experienced this and get community input on best practices.
The Issue
When a user migrates their Apple ID from one email to another (e.g., from olduser@example.com to newuser@icloud.com), the App Store creates a new subscription
transaction with a different originalTransactionId, but the appAccountToken is not carried forward from the original transaction.
What I'm Seeing
note: these values are fake
When querying /inApps/v1/subscriptions/{originalTransactionId} with the either post-migration transaction ID or the pre-migration transaction ID, the API returns both transactions:
Pre-migration transaction (status: 2 - inactive):
originalTransactionId: "12345678910111"
Contains: "appAccountToken": "abc123-def456-ghi789"
Post-migration transaction (status: 1 - active):
originalTransactionId: "67891011121314"
Missing: appAccountToken entirely
The Problem
The appAccountToken is our only way to link App Store subscriptions to user accounts. Without it on the new transaction:
Users lose access to premium features despite having valid subscriptions
Server-side renewal notifications can't be matched to user accounts
Manual support intervention is required for each affected user
Questions for the Community
Has anyone else encountered this issue with Apple ID migrations?
What's the recommended approach for handling this scenario?
Is there an alternative mechanism to maintain the subscription-to-user linkage across migrations?
Questions for Apple Engineers
Is this the expected behavior, or should the appAccountToken be preserved?
Are there any planned improvements to handle this migration scenario?
What's the best practice for developers to handle this case?
Interestingly, both the old and new transaction IDs return the same JSON response from the App Store Server API, suggesting Apple maintains internal linkage between
these transactions, but the appAccountToken isn't carried forward to the active transaction.
Any insights or similar experiences would be greatly appreciated!
Thank you!!
Feedback Assistant: FB18709241
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
StoreKit
App Store Server Notifications
App Store Server API
I want to test the "Remove from Sale" scenario in Sandbox. I set my subscription to "Remove from Sale" for all territories in App Store Connect, but I can still make new purchases and auto-renewals continue in the Sandbox environment.
Is this a known limitation? Or is there a specific way to make this work for testing?
If it can't be tested, I'd like to know the expected production behavior. What changes occur in the App Receipt and what App Store Server Notification is sent?
In the app we're distributing, we've identified a user where the Get All Subscription Statuses API returns two original transaction IDs in the data response. This user has gone through cancellations and re-subscriptions since their initial purchase.
Meanwhile, despite maintaining a continuous subscription, a notification suddenly arrives on the renewal date with original_transaction_id2.
+---------------------------+---------------------------+---------------------+
| original_transaction_id | notification_type | subtype |
+---------------------------+---------------------------+---------------------+
| original_transaction_id1 | SUBSCRIBED | INITIAL_BUY |
~ Repeated cancellations and re-subscriptions ~
| original_transaction_id1 | SUBSCRIBED | RESUBSCRIBE |
| original_transaction_id2 | SUBSCRIBED | INITIAL_BUY |
+---------------------------+---------------------------+---------------------+
Although it can be inferred from the interface definition of the API itself that multiple original transaction IDs may be returned, what causes multiple original transaction IDs to be returned?
Furthermore, is it possible to reproduce the case where multiple original transaction IDs are returned in the sandbox environment provided by Apple?
As for this app, it:
Uses subscriptions through in-app purchases.
Does not offer upgrades, downgrades, or crossgrades, having only one product.
Has never undergone price increases or decreases.
Is distributed exclusively in Japan.
Topic:
App & System Services
SubTopic:
StoreKit
Hi everyone.
I'm trying to use https://developer.apple.com/documentation/appstoreserverapi/get-transaction-info to retrieve order information. How can I get the refund status of an order through this API? Also, Apple's webhook notification for refunds includes fields like revocationReason and revocationType. Can these be retrieved through the API? I've noticed that some refund orders have these fields when retrieved using get-transaction-info api, but others don't. I don't know the reason for these differences. Could you please explain?
Thank you very much.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
App Store Server Notifications
App Store Server API
I am trying to launch a PWA as an application on App Store, and got rejected cause of In-App Purchases. Application is about content generation and selling subscriptions for premium content. So thats why needed to implement In-App Purchases.
I have created wrapper via PWABuilder. And it is looking great so far, now my question is about How can I implement In-App Purchases in the bundle which is already created.
Any suggestions will be appreciated.
More clarification:-
I have that product running on Web right now, we have integrated Stripe for payment handling for subscriptions. If there is nothing we can do for In-App Purchases then we have to make purchases on website and then user will be able to experience the changes. We tried that, but then we got rejected for showing locked premium content on user's feed. Also can't show any CTA or Subscribe text or button.