We are launching a new app with a subscription in-app purchase (IAP).
The Status of the IAP is "Waiting for Review". We want to submit the app to app for review, but the section to select an IAP with the app is not appearing. According to online sources, if we submit a new app for review, without selecting the IAP that goes with it, then the app may be released in the App Store without users being able to purchase the IAP. This actually happened to us years ago and I can't remember how we got around it, but it was painful. It seems strange that Apple would allow this problem to persist for years. Why not just hire an intern to fix it? Maybe because they are too busy running around in circles at the new spaceship headquarters.
Regardless, our IAP has been sitting in "Waiting for Review" status for a while now and I'm concerned it may never be approved.
Any advice would be appreciated.
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
I am unable to sign in to a Sandbox Apple Account, where this issue occurs only via Simulator.
Under Settings > Developer, I tap "Sign In" under Sandbox Apple Account. I enter my account credentials, and after bringing me back to the Developer page, the Sign In button briefly appears as disabled, before being re-enabled, without signing in to the account. (The account credentials are also recognized as correct, as I will receive an alert popup if incorrect.) See screenshots below:
After signing in, Sign In button appears disabled...
... then is re-enabled without actually signing in to the account.
I have now tried setting up multiple sandbox accounts via App Store Connect with various permutations (no confirmation of Apple Account email, confirming Apple Account email, logging in to iCloud and accepting terms of service), running different device simulators, running simulators on different Mac computers... none of which yield a different result.
By contrast, I can sign in to the Sandbox Apple Account without issue on a physical device. The problem occurs only via Simulator.
When my app tries to access a subscription, StoreKit's products(for:) always returns zero results. Similarly, SubscriptionStoreView always shows "Subscription Unavailable" followed by "The subscription is unavailable in the current storefront".
The app is a watch-only app (no iPhone companion app).
The app and the subscription product were each approved in App Store Connect over two weeks ago.
The problem occurs when the app is installed from TestFlight, when the app is installed from the App Store (production), and when run in the Xcode debugger. The only time the app successfully accesses the subscription when simulating it in Xcode with a .storekit file.
How should my app access the subscription?
Repro:
App Store bundle ID: com.toolsay.hoopref
Phone app target (unused) bundle ID: com.toolsay.hoopref
Watch app bundle ID: com.toolsay.hoopref.watchapp
Subscription product ID: com.toolsay.hoopref.pro.annual
Subscription availability: All countries and regions
App Store listing
let products = try await Product.products(for: ["com.toolsay.hoopref.pro.annual"])
products.count is 0.
Hey
We have noticed a change in the retry behavior of Apple Server Notifications webhooks V2 starting around March 12–13, 2026.
Previously, when our webhook endpoint returned an HTTP 400 response, Apple would retry the notification delivery multiple times according to the documented retry policy.
However, beginning around March 12–13, it appears that Apple no longer retries the webhook when a 400 response is returned. The notification is sent only once and no further retry attempts are made.
From our understanding of the documentation, retries should occur when delivery fails, and historically we observed retries even for some 4xx responses.
We would like to confirm:
Has Apple recently changed the retry behavior for Server Notifications?
Are HTTP 4xx responses (specifically 400) now considered terminal failures that will not trigger retries?
Is this change intentional or related to a rollout in the webhook delivery system?
We have called the "Notification History" endpoint for some users who purchased a sub and we are only getting one attempt with the following data in it:
{
attemptDate: 1773469202552, (2026-03-14T06:20:02.552Z)
sendAttemptResult: 'UNSUCCESSFUL_HTTP_RESPONSE_CODE',
}
This was 2 days ago, based on the docs, the user should have a few attempts at least.
This behavior change affects systems that rely on retries to handle temporary validation issues or transient failures.
Thanks!
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
App Store Server Notifications
App Store Server API
Hello,
I’m trying to understand which Apple subscription offer best fits a coupon-like flow in our app.
Our ideal case is a 1-month Pro benefit that users can trigger inside the app:
without entering a code manually
possibly more than once over time
then continue into a normal paid auto-renewable subscription
Ideally, this would work for new, existing, and lapsed users, and if possible, even for users who are already actively subscribed (though that part is not required).
From the docs, I understand that:
Offer Codes require redemption
Promotional Offers are for existing or previously subscribed users
Introductory Offers are for new eligible users
Win-Back Offers are for lapsed subscribers
So my questions are:
Is there any Apple-supported way to do this without manual code entry?
Can the same user receive this kind of 1-month benefit multiple times over time?
Which offer type is the closest fit?
Is this use case partly incompatible with Apple’s subscription system?
Thanks.
Hello,
We are facing an issue with In-App Purchases (subscriptions) in two iOS apps built with React Native + react-native-iap.
Issue
Some users receive the error:
E_CONNECTION_CLOSED
during the purchase flow.
However:
The payment is successfully deducted via the App Store.
The subscription appears in the user's Apple ID subscription list.
But on our side:
The app does not receive the StoreKit transaction callback
No receipt or transaction ID is delivered
Our backend cannot validate the purchase.
Restore Purchases
When affected users try Restore Purchases, StoreKit returns:
No purchases found
even though the subscription is visible in their Apple ID.
Most affected users are from India, and many payments are made via UPI through App Store billing.
Has anyone experienced a case where:
the user is charged
the subscription exists in Apple ID
but StoreKit never returns the transaction or receipt?
Any suggestions on how to recover these transactions would be greatly appreciated.
Thanks!
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit
In-App Purchase
App Store Receipts
Hi,
my app was rejected because IAP were not present in the app.
I followed guidelines more carefully and filled all buisness detail since then.
And now I have:
StoreKit Configuration in XCode is set to None,
Products (subscription + consumable product) are already approved (from the previous review)
Paid Apps Agreement - active
Bank account - active
Tax forms - active
Compliance - active
Problems:
When trying to test it with TestFlight + sandbox account, StoreKit is returning zero products.
When trying to check my products by "initiate transaction" from Sandbox App Store manage dashboard I am getting an error "This item is not available"
I am totally stuck and don't know what to process next. Unfortunately API.
Hello,
I am investigating a case where two different transaction IDs appear to refer to the same purchase, and I would like clarification on whether this behavior is expected.
Additional context
StoreKit version: StoreKit 1 (SKPaymentTransaction)
Environment: Production
Product type: Auto-renewable subscription
Transaction sources
The values are obtained from the following APIs:
transaction_id from SKPaymentTransaction
https://developer.apple.com/documentation/storekit/skpaymentqueue
receipt_data from the App Store receipt
https://developer.apple.com/documentation/foundation/bundle/appstorereceipturl
Observed behavior
After an In-App Purchase completes, the app receives:
a transaction_id from SKPaymentTransaction
the corresponding receipt_data for the purchase
When inspecting the receipt, the transaction_id inside latest_receipt_info differs from the transaction_id received directly from the purchase transaction.
For clarity:
A = transaction_id received from the purchase flow (SKPaymentTransaction)
A' = transaction_id found in receipt_data.latest_receipt_info
The two values are different, but they differ only by 1.
Additional observation
The original_transaction_id for A and A' is identical, which suggests that both transaction IDs belong to the same subscription purchase chain.
Pattern observation on the ID difference
We have observed that the difference between A and A' is consistently exactly 1 (i.e., A' = A + 1) across multiple transactions, not just a single case.
This appears to be a reproducible pattern rather than a coincidence.
This observation raises an additional question (Question 6 below).
API verification
When calling:
GET /inApps/v1/transactions/{transactionId}
Both A and A' return what appears to be the same purchase record.
The response data is effectively identical except for the transactionId field.
However, when calling:
GET /inApps/v2/history/{transactionId}
A does not appear in the transaction history
only A' appears in the history response
Questions
If A does not appear in transaction history, where does this transaction ID originate from?
Why does Get Transaction Info (/inApps/v1/transactions/{transactionId}) return a valid response for A even though it is not present in the transaction history?
Why do A and A' both resolve to what appears to be the same purchase?
In this situation, which transaction ID should be treated as the canonical transaction ID for server-side validation?
Is this difference related to how StoreKit 1 (SKPaymentTransaction) and the App Store Server API represent transactions?
Is the consistent off-by-one difference between the transaction_id from SKPaymentTransaction and the one recorded in latest_receipt_info an intentional behavior of StoreKit 1's internal transaction ID assignment?
Specifically, we are wondering whether StoreKit 1 applies some form of internal offset when delivering the transaction ID to the client, while the App Store server records a different (adjacent) ID in the receipt. If so, is this documented anywhere?
Note
We are currently in the process of migrating to StoreKit 2, but this behavior was observed while investigating our existing StoreKit 1 implementation.
Any clarification would help us better understand the correct transaction model during the migration.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit
In-App Purchase
App Store Receipts
I've added .storeButton(.visible, for:.policies) to my SubscriptionStoreView, and the buttons do appear, but when I tap on them I get a sheet that just says "Terms of Service Unavailable / Somethng went wrong. Try Again.". (similar for Privacy Policy).
Is this expected in development? Will these start working correctly in production? (and, more importantly, in App Review?)
The docs say that these use the values (i.e. URLs) set in App Store Connect, but that I can override those. This is a new app. Is that wrong, do I need to set the URLs explicitly?
Edited to add:
the console reports: Failed to fetch terms of service and privacy policy: Error Domain=NSURLErrorDomain Code=-1011 "(null)"
Hi - Using storekit2 on ios26.2 and using presentOfferCodeRedeemSheet to allow users to leverage Offer Codes.
The codes work (sandbox and production), however on the confirmation view that shows Redeem Special Offer, while my App Icon is properly displayed up top, the associated product subscription image is missing and I see a grey App Store image/icon instead.
I do successfully see the associated subscription and pricing to the right. My subscription product images are already reviewed/approved and have been live for a number of weeks. I see this in Sandbox and Production (with a live customer sending me the phone screenshot).
PS, my product icons/logos all show up successfully during normal checkout in sandbox/production, this only occurs on Offer Code Redemption views.
Topic:
App & System Services
SubTopic:
StoreKit
Hi everyone,
We are currently working on improving our subscription backend integration with Apple’s App Store Server API and StoreKit, and had a few questions around StoreKit 1 vs StoreKit 2 behavior and server-to-server notifications.
Looking for clarification on the following points:
/inApps/v1/subscriptions/{originalTransactionId} response compatibility
Does the App Store Server API endpoint /inApps/v1/subscriptions/{originalTransactionId} return consistent response structures for subscriptions created via StoreKit 1 and StoreKit 2, or are there any differences we should account for when parsing the response?
Transaction format in S2S notifications for StoreKit 1 purchases
If a user initially purchases a subscription using StoreKit 1, and the subscription renews later, what transaction format is sent in server-to-server notifications?
Does Apple still maintain StoreKit 1 style transaction payloads, or
Are they converted into StoreKit 2–style signed transactions?
Validation of signedTransactionInfo and signedRenewalInfo
In App Store Server Notifications V2, the payload includes signedTransactionInfo and signedRenewalInfo.
Is there an official Apple API endpoint that can be used to validate these tokens?
Offer / coupon identification from S2S notifications
Can server-to-server notifications reliably indicate which offer was applied (intro offer, promotional offer, or offer code)?
If yes, which fields in the transaction payload should be used to identify this?
Trial period identification in StoreKit 2
In StoreKit 1, the field is_trial_period was commonly used to detect free trials.
Since this is deprecated in StoreKit 2, which field or transaction property should be used to identify whether a purchase corresponds to a trial period?
Topic:
App & System Services
SubTopic:
StoreKit
In iOS 26.4 beta 4, the receipt returned by StoreKit payments via [[NSBundle mainBundle] appStoreReceiptURL] corresponds to the previous transaction; the content only becomes correct after restarting the app.
Hello,
Can someone please tell me why the unlock button was unresponsive when tapped? The restore button worked.
if let price = store.product?.displayPrice {
Text(price)
.font(.title2.bold())
.padding(.top, 4)
}
Button {
Task {
await store.purchase()
}
} label: {
ZStack {
if store.isLoading {
ProgressView()
.tint(.white)
} else {
Text("paywall.buy")
.font(.headline)
}
}
.frame(maxWidth: .infinity)
.padding()
}
.background(.blue)
.foregroundStyle(.white)
.clipShape(RoundedRectangle(cornerRadius: 14))
.disabled(store.product == nil || store.isLoading)
Button {
Task {
await store.restorePurchases()
}
} label: {
Text("paywall.restore")
}
Topic:
App & System Services
SubTopic:
StoreKit
Hello,
I am currently implementing External Purchase Link and External Purchase Custom Link and am encountering an issue where both
ExternalPurchaseLink.canOpen and ExternalPurchaseCustomLink.isEligible always return false under all test conditions.
I would like to confirm whether my setup is missing any required steps or whether this behavior is expected.
Below are the details of my current environment and configuration:
🔧 1. Development Environment
Xcode: 16.3, 16.4, 26.0 beta 4
Devices:
iPhone running iOS 26.2 beta
iPhone running iOS 16.7.12
macOS 15.5 (real device testing)
Simulator iOS 18.0
Build Type: Local development build using a Developer Provisioning Profile
Sandbox account signed in during testing
🔑 2. Entitlements (Developer site & Xcode)
In Certificates → Identifiers → App ID, both capabilities are enabled:
StoreKit External Purchase
StoreKit External Purchase Link
The .entitlements file in Xcode includes:
com.apple.developer.storekit.external-purchase = YES
com.apple.developer.storekit.external-purchase-link = YES
The Provisioning Profile also contains both entitlements (confirmed via codesign -d --entitlements :-).
📄 3. Info.plist Configuration
Both keys are configured with correct region codes according to documentation:
SKExternalPurchase
SKExternalPurchaseCustomLinkRegions
🌍 4. Test Storefront
Device storefront verified as United States (US) or Portugal (PT) (US = target region for External Purchase Link, PT = EU region)
But despite all the above configuration,
both API calls consistently return false:
ExternalPurchaseLink.canOpen // false
ExternalPurchaseCustomLink.isEligible // false
So I cannot proceed to testing the remaining flow (token retrieval, link opening, etc.)
------ Questions ------
❓ Q1) Local Development Build Limitation
Is it expected behavior that Developer-signed local builds always return
canOpen = false / isEligible = false
for External Purchase Link & Custom Link?
Is there a technical or policy restriction that prevents eligibility in local dev builds?
❓ Q2) App Store Connect Configuration Requirement
Are there mandatory App Store Connect settings (such as external purchase URLs, support URL, disclosures, or country configuration) that must be enabled before eligibility becomes true?
Currently, no External Purchase Link or Custom Link menu is visible in my App Store Connect app settings.
Is this menu only available after certain approvals or under specific conditions?
❓ Q3) TestFlight Requirement
Do External Purchase Link and Custom Link only return eligibility = true on:
TestFlight builds, or
Distribution-signed builds?
Or should eligibility also work on developer builds?
Formal confirmation would be helpful.
❓ Q4) Developer Account Type Limitation
We are using an Individual Developer Account (not Organization).
Can Individual accounts fully request, test, and ship apps using:
External Purchase Link
External Purchase Custom Link
Or are there limitations on account type?
🙏 Request
We have completed all documented setup steps (Entitlements → Provisioning → Info.plist),
but eligibility remains false, blocking feature validation.
Please clarify which of the following is the cause:
Local development builds do not support eligibility
Missing App Store Connect configuration (not visible to us)
Account type restriction
Region rollout or entitlement approval requirement
Any additional setup not documented publicly
Thank you for your assistance.
Hello,
We are facing an issue with In-App Purchases (subscriptions) in two iOS apps built with React Native + react-native-iap.
Issue
Some users receive the error:
E_CONNECTION_CLOSED
during the purchase flow.
However:
The payment is successfully deducted via the App Store.
The subscription appears in the user's Apple ID subscription list.
But on our side:
The app does not receive the StoreKit transaction callback
No receipt or transaction ID is delivered
Our backend cannot validate the purchase.
Restore Purchases
When affected users try Restore Purchases, StoreKit returns:
No purchases found
even though the subscription is visible in their Apple ID.
Most affected users are from India, and many payments are made via UPI through App Store billing.
Has anyone experienced a case where:
*the user is charged *the subscription exists in Apple ID *but StoreKit never returns the transaction or receipt?
Any suggestions on how to recover these transactions would be greatly appreciated.
Thanks!
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit
In-App Purchase
App Store Receipts
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit
In-App Purchase
App Store Receipts
Hi everyone,
I’ve been encountering a recurring issue with the App Store Server API over the past 48 hours, specifically regarding the Get Transaction Info endpoint.
Endpoint: GET /inApps/v1/transactions/{transactionId}
Environment: Production
Error Code: 4040010 (TransactionIdNotFound)
The Issue
When a user completes a purchase in our app, the client-side sends the transactionId to our backend for validation. However, when our server immediately calls the Get Transaction Info API using that ID, it frequently returns a 4040010 error, stating that the transaction ID cannot be found.
Key Observations
Eventual Consistency Delay: If we implement a retry logic and wait for 2 to 5 minutes, the exact same transactionId eventually becomes queryable and returns a valid signedTransactionInfo.
Notifications vs. API: Interestingly, our server receives the App Store Server Notifications V2 (webhook) for these transactions almost instantly. The notifications contain the correct data, but the "Pull" API seems to lag behind the "Push" notification system.
Recent Spikes: This behavior started occurring frequently within the last 2 days. Prior to this, the API was almost always near-instant.
Questions
Has anyone else noticed a spike in 4040010 errors or increased indexing latency in the Production environment recently?
Is there a recommended "grace period" or backoff strategy when querying for a new transactionId? Apple's documentation doesn't explicitly mention an expected delay between a successful purchase and its availability via the Server API.
Any insights or confirmation of similar issues would be greatly appreciated!
Hello,
We are currently testing subscription purchases in the Sandbox environment, and we are seeing an issue that we do not fully understand.
When we attempt a single subscription purchase, multiple purchase signals or transaction events are sometimes delivered from Sandbox for what appears to be just one payment attempt. In some cases this happens twice, and in other cases we have seen it occur as many as five to seven times. The number is inconsistent each time, and we have not been able to identify any clear pattern.
At this point, we are not sure whether this is a known instability or limitation of the Sandbox testing environment, or whether there may be something incorrect in our own implementation or configuration.
Has anyone experienced similar behavior when testing auto-renewable subscriptions in Sandbox? If so, we would really appreciate any guidance on what to check.
Thank you.
Topic:
App & System Services
SubTopic:
StoreKit
Hi everyone,
I’ve been encountering a recurring issue with the App Store Server API over the past 48 hours, specifically regarding the Get Transaction Info endpoint.
Endpoint: GET /inApps/v1/transactions/{transactionId}
Environment: Production
Error Code: 4040010 (TransactionIdNotFound)
The Issue
When a user completes a purchase in our app, the client-side sends the transactionId to our backend for validation. However, when our server immediately calls the Get Transaction Info API using that ID, it frequently returns a 4040010 error, stating that the transaction ID cannot be found.
Key Observations
Eventual Consistency Delay: If we implement a retry logic and wait for 2 to 5 minutes, the exact same transactionId eventually becomes queryable and returns a valid signedTransactionInfo.
Notifications vs. API: Interestingly, our server receives the App Store Server Notifications V2 (webhook) for these transactions almost instantly. The notifications contain the correct data, but the "Pull" API seems to lag behind the "Push" notification system.
Recent Spikes: This behavior started occurring frequently within the last 2 days. Prior to this, the API was almost always near-instant.
Questions
Has anyone else noticed a spike in 4040010 errors or increased indexing latency in the Production environment recently?
Is there a recommended "grace period" or backoff strategy when querying for a new transactionId? Apple's documentation doesn't explicitly mention an expected delay between a successful purchase and its availability via the Server API.
Any insights or confirmation of similar issues would be greatly appreciated!
在iOS26.4中,新的交易完成后[NSBundle mainBundle] appStoreReceiptURL 获取的是历史票据,未给出新的票据
Topic:
App & System Services
SubTopic:
StoreKit