'Guideline 2.1 - Performance - App Completeness' - "...could not be found in the submitted binary."
I have checked with internal and external testers and my devices and simulators, everyone sees the in app purchases but I just had my submitted rejected for the second time with the comment that these in-app none-consumable purchases cannot be found with the submitted binary.
I even attached a slow step by step screen recording for the review reply after the first rejection showing how to reach the purchasable packs by navigating through only 3 buttons:
"How to access the purchase flow:
Launch the app
Tap the bottom-center Settings button (icon: switch.2)
Tap “Customisation gallery”
Scroll to find any pack listed above
Tap the pack price chip
Tap “Buy pack – [price]” to start the StoreKit purchase flow"
I also attached a clear image along with detailed instruction (same as above) for the Review Information. and the second rejection was received today for the same reason.
I'm being guided to the localization 'Developer Action Needed'. I'm not sure what more can be done? I feel like my review replies aren't even looked at.
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
Created
Hello Apple team,
We would like to access the user's available purchases from the keyboard extension.
Making purchases directly from the keyboard is a great benefit, but we assume it is intentionally disabled to prevent abuse or fraudulent purchase attempts.
What we care about the most is determining if the user has an item that contains a discount or a free trial to personalize messaging when we suggest the user go to the app and make a purchase.
We hope you'd consider revising your policy around StoreKit usage.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
Extensions
StoreKit
In-App Purchase
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
We began storing our users' appTransactionID as a quick lookup identifier for purchase history as it is back-dated and consistent between installs and can be signed by Apple.
We've read through both the Storekit documentation and the app transfer documentation, but wanted to verify that a users appTransactionID remains consistent after an app has been transferred from one Apple developer account to another (assuming they have the proper shared secret info)? Basically, would the new developer team be seeing the same appTransactionID our current team sees for an existing user post-transfer?
Topic:
App & System Services
SubTopic:
StoreKit
Greetings fellow devs,
After accepting the Alternative Terms Addendum for Apps in the EU and adding the Storekit External Purchases or Offers capability via App Store Connect in our app identifier, the entitlement showing up in xcode is com.apple.developer.storekit.custom-purchase-link.allowed-regions and has the value 'jp'.
How can we change the value for that entitlement to 'gr'?
We tried changing it in xcode, but we get the error <Provisioning profile "iOS Team Provisioning Profile: [app identifier]" doesn't match the entitlements file's value for the com.apple.developer.storekit.custom-purchase-link.allowed-regions entitlement.>.
In Certificates, Identifiers and Profiles in the developer account there is no way to configure that capability. We sent a request to support and they only gave a link to documentation and to the forum here.
We have a completed every business agreement requested and we have chosen Greece as the organisation region and the app's availability region wherever possible. We haven't found anywhere that Japan would be chosen to explain the entitlement given.
So where can this entitlement about allowed regions be configured?
Xcode version is 16.4 and iOS minimum deployments is 18
Hey y'all,
I'm reaching out because of an observed issue that I am experience both in sandbox and in production environments. This issue does not occur when using the Local StoreKit configurations.
For context, my app only implements auto-renewing subscriptions. I'm trying to track with my own analytics every time a successful purchase is made, whether in the app or externally through Subscription Settings. I'm seeming too many events for just one purchase.
My app is observing Transaction.updates. When I make a purchase with Product.purchase(_:), I successfully handle the purchase result. After about 10-20 seconds, I receive 2-3 new transactions in my Transaction.updates, even though I already handled and finished the Purchase result. This happens on production, where renewals are one week. This also happens in Sandbox, where at minimum renewals are every 3 minutes.
The transactions do not differ in transactionId, revocationDate, expirationDate, nor isUpgraded... so not sure why they're coming in through Transaction.updates if there are no "updates" to be processing.
For purchases made outside the app, I get the same issue. Transaction gets handled in updates several times.
Note that this is not an issue if a subscription renews. I use `Transaction.reason
I want to assume that StoreKit is a perfect API and can do no wrong (I know, a poor assumption but hear me out)... so where am I going wrong?
My current thought is a Swift concurrency issue. This is a contrived example:
// Assume Task is on MainActor
Task(priority: .background) { @MainActor in
for await result in Transaction.updates in {
// We suspend current process,
// so will we go to next item in the `for-await-in` loop?
// Because we didn't finish the first transaction, will we see it again in the updates queue?
await self.handle(result)
}
}
@MainActor
func handle(result) async {
...
await Analytics.sendEvent("purchase_success")
transaction.finish()
}
Hey y'all,
I'm reaching out because of an observed issue that I am experience both in sandbox and in production environments. This issue does not occur when using the Local StoreKit configurations.
For context, my app only implements auto-renewing subscriptions. I'm trying to track with my own analytics every time a successful purchase is made, whether in the app or externally through Subscription Settings. I'm seeming too many events for just one purchase.
My app is observing Transaction.updates. When I make a purchase with Product.purchase(_:), I successfully handle the purchase result. After a few seconds, I receive 2-3 new transactions in my Transaction.updates, even though I already handled and finished the Purchase result.
The transactions seem to have the same transactionId, and values such as revocationDate, expirationDate, and isUpgraded don't seem to change between any of them.
For purchases made outside the app, I get the same issue. Transaction gets handled in updates several times.
Note that this is not an issue if a subscription renews. I use `Transaction.reason
Environment
OS: iOS 26.2 ~ 26.3
SDK: Xcode 16.4 (Target: iOS 17.6)
Framework: StoreKit 2
Environment: Production (Cannot reproduce in Sandbox or Xcode Configuration)
Issue Description
We are encountering a critical purchase failure that occurs exclusively in the Production environment.
When a user who has a "Pending Downgrade" (scheduled for the next renewal date) attempts to re-purchase their current higher-tier product to cancel the downgrade, StoreKit 2 returns an error.
Steps to Reproduce
User is currently on "Product A" (Higher Tier).
User schedules a downgrade to "Product B" (Lower Tier). The status changes to "Pending Downgrade".
User attempts to purchase "Product A" again via Product.purchase().
The system purchase sheet appears, and the user confirms the purchase.
Immediately after authentication, a system alert from StoreKit appears saying: "Cannot process request at this time. Please try again later." (現在リクエストを一時的に処理できません。しばらくしてからもう一度お試しください。)
After dismissing the alert, the app receives StoreKitError code 2 (unknown) with the localized message: "Request could not be completed" (リクエストを完了できません).
Technical Observations
Transaction.currentEntitlements: Does not change.
App Store Server Notifications (V2): No notifications are sent to our server.
Sandbox Behavior: Works perfectly. Re-purchasing Product A successfully cancels the downgrade and the subscription remains at the Higher Tier.
AppStore.sync(): Running a manual sync does not resolve the pending state after the error.
Question
Since we cannot debug production-level logs, we are stuck. Is this a known regression in the StoreKit 2 commerce engine regarding state synchronization for downgrades? Has anyone found a workaround for this specific scenario?
Any insights would be greatly appreciated.
I am developing a mobile application using Flutter and plan to implement in-app subscriptions for both iOS platforms. I would like to request guidance on the following:
Technical Implementation:
Recommended best practices for implementing auto-renewable subscriptions in Flutter apps
StoreKit 2 integration requirements and compatibility considerations
Server-to-server notification setup and endpoint requirements
Testing Procedures:
Sandbox environment configuration and testing workflow
TestFlight testing requirements for subscription features
Recommended testing scenarios before production release
Required Documentation and Accounts:
Complete list of required agreements (Paid Applications Agreement, etc.)
Banking and tax information requirements
Privacy policy and terms of service specifications for subscription apps
App Review guidelines specific to subscription-based apps
Subscription Management:
Grace period implementation requirements
Handling subscription cancellations and refunds
Promotional offers and introductory pricing setup
Could you please provide documentation or direct me to the appropriate resources? Additionally, if there are any specific requirements for Flutter-based applications, I would appreciate that information.
Application Details:
Platform: iOS (Flutter framework)
Subscription Type: Auto-renewable subscriptions
Hello,
My app was rejected on iPad (iPad Air 11-inch M3, iPadOS 26.2.1) with two related issues:
Guideline 2.1 – Performance – App Completeness
“The app exhibited one or more bugs that would negatively impact users.
Bug description: the premium subscription cannot be loaded properly.”
Guideline 3.1.2 – Business – Payments – Subscriptions
“The submission did not include all the required information for apps offering auto-renewable subscriptions.”
I am using StoreKit 2 with SubscriptionStoreView to present the auto-renewable subscription.
During development:
Subscriptions load correctly in the simulator (sandbox).
On real devices, I test without a local StoreKit configuration file to fetch products from App Store Connect.
The subscription UI (title, duration, price) displays correctly when products are returned.
At the time of review, the Paid Apps Agreement was not active.
I suspect this may have caused the subscription products to fail loading on the review device.
Since then:
Paid Apps Agreement is now Active. SubscriptionStoreView should automatically show required metadata.
Because the subscription failed to load on iPad during review, the required information (title, price, duration) was not visible, which likely triggered the 3.1.2 rejection.
Additionally, in TestFlight I sometimes see inconsistent behavior where the app appears but cannot be installed (“App Not Available”).
Also, my app was rejected, but the subscription is still waiting for review.
I would really appreciate guidance on the following:
Am I potentially missing any required configuration that could prevent products from loading in production?
Is there any propagation delay after activating the Paid Apps Agreement that could affect product availability?
If I am overlooking something in configuration or testing, please let me know what I should specifically verify before resubmitting.
Thank you very much for your help.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit
In-App Purchase
TestFlight
Can anyone advise on this? We distributed promotional trial codes for our app Ask Dolly. These 1-month free trials are set to renew and charge users in March 2026.
A segment of users redeemed the promo codes but never created accounts or opened the app. We don't have their contact information to notify them. Our CEO has directed us to prevent these inactive subscriptions from renewing to avoid charging users who never engaged with the service.
We've downloaded the Subscription and Offer Code Redemption reports from App Store Connect, but cannot map Apple's Subscriber IDs to our user database (we only store Transaction IDs). This prevents us from identifying which specific subscriptions to cancel.
What We Need: Assistance preventing renewals for promotional subscriptions where users have had zero app sessions/opens as of the end of February.
These trials will start to renew on March 3, 2026. We need to resolve this before then to avoid charging inactive users.
Can you help us either:
Cancel subscriptions associated with promo codes that show zero app engagement, or
Provide guidance on how to programmatically identify and cancel these subscriptions?
Topic:
App & System Services
SubTopic:
StoreKit
Hi Everyone, Need help 🙌
Could someone help how to test pending purchases in Sandbox accounts ? Can test ask to buy flow ? if yes how, could not find any information about that.
Background:
My app uses a third-party SDK for payments, and it uses Original StoreKit internally for IAP payments. Now I'm getting ready to migrate to StoreKit2, and during the transition, users may use either method to initiate payments, and there's no way to avoid the coexistence of StoreKit2 and Original StoreKit.
Problem:
When a user has an unfinished transaction, if the app is restarted, both StoreKit2 and Original StoreKit will receive a notification of the transaction:
Original StoreKit's '-paymentQueue:updatedTransactions:' method
StoreKit2's 'Transaction.updated' method
resulting in duplicate calls to the shipping API.
My current treatment is to only add '-paymentQueue:updatedTransactions:' to listen for unfinished transactions. Even if the user is using StoreKit2 to initiate the payment, if the transaction is not Finished, it will be fetched via this method after restarting the app to process this transaction.
Is this approach feasible and are there any best practices for this scenario?
To summarize:
Is it feasible to fetch unfinished StoreKit2 transactions via Original StoreKit methods when StoreKit2 coexists with Original StoreKit? Is there a recommended way
I’d like to confirm the expected behavior of StoreKit 2 in the Sandbox environment regarding unfinished consumable transactions across devices.
Scenario:
Device A and Device B are signed in with the same Sandbox Apple ID
A consumable in-app purchase is completed on Device A
The transaction may be verified or unverified, but transaction.finish() is not called
The app is then launched on Device B and listens for Transaction.updates
Question:
In this scenario, is it expected that Device B will or will not receive a callback for this unfinished consumable transaction?
Or is it by design that unfinished consumable transactions are not guaranteed to be delivered across devices, regardless of verification state?
Topic:
App & System Services
SubTopic:
StoreKit
Our app is supposed to be removed from sale on May 31st.
Subscriptions our app is offering will also be removed on May 1st one month before our app removal.
I would like to know if AppStoreServerNotificationV2 EXPIRED event will be sent to a specified endpoint after the removal of these subscriptions.
I think each subscription will be canceled automatically from May 1st to May 31st and it will send EXPIRED event to our server, but is it true?
Thank you in advance.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
Developer Tools
App Store Server Notifications
Hello,
I’m experiencing repeated rejections related to Guideline 2.1 – App Completeness for an iOS app using auto-renewable subscriptions, and I’m struggling to understand what is missing, as the purchase flow works correctly in sandbox and TestFlight.
App setup:
iOS app built with React Native (Expo + react-native-iap)
Auto-renewable subscriptions:
• Monthly: €4.99
• Yearly: €39.99
Paid Apps Agreement accepted
Subscriptions configured and active in App Store Connect
Privacy Policy and Apple Standard EULA included:
• Visible inside the app on the subscription screen
• Added in App Store metadata
What App Review reports:
App Review states they are unable to buy the in-app purchase, resulting in a rejection under Guideline 2.1 (App Completeness).
What works correctly:
getSubscriptions() returns valid products in sandbox
Subscription titles, prices, and durations are displayed in the app UI
requestSubscription() is triggered when tapping the subscribe button
Apple purchase sheet appears and completes successfully in:
• Sandbox testing
• TestFlight (external testers)
What I’ve verified:
No conditional logic blocks purchases in review builds
Purchase button always calls requestSubscription
purchaseUpdatedListener and purchaseErrorListener are correctly registered
No hardcoded prices; prices come from StoreKit
Same behavior on iPhone and iPad
Question:
Is there any known limitation or requirement in the App Review environment for auto-renewable subscriptions that differs from sandbox/TestFlight when using a custom subscription UI (not SubscriptionStoreView)?
If App Review requires a specific implementation detail (StoreKit 2, SubscriptionStoreView, or something else), I would really appreciate clarification, as this is not explicitly stated in the rejection.
Thank you for your help.
I'm on macOS Sequoia Version 15.7.3 (24G419) and using Xcode Version 26.2 (17C52).
In my Xcode project, Transaction.updates and Product.SubscriptionInfo.Status.updates don’t seem to emit updates reliably.
The code below works consistently in a fresh Xcode project using a minimal setup with a local StoreKit Configuration file containing a single auto-renewable subscription.
class InAppPurchaseManager {
static let shared = InAppPurchaseManager()
var transactionTask: Task<Void, Never>?
var subscriptionTask: Task<Void, Never>?
init() {
print("Launched InAppPurchaseManager...")
transactionTask = Task(priority: .background) {
for await result in Transaction.updates {
print("\nReceived transaction update...")
try? await result.payloadValue.finish()
}
}
subscriptionTask = Task(priority: .background) {
for await result in Product.SubscriptionInfo.Status.updates {
print("\nReceived subscription update...")
print("state:", result.state.localizedDescription)
}
}
}
}
I initialise it in:
func applicationDidFinishLaunching(_ aNotification: Notification) {
_ = InAppPurchaseManager.shared
}
I do not build any UI for this test. I open StoreKit Transaction Manager then click Create Transaction → select the product → choose Purchase (Default) → Next → Done. The console shows that it detects the initial purchase, renewals and finishes each transaction.
It also works even if I do not add the In-App Purchase capability.
In my actual project, the initial purchase is detected and finished, but renewals are not detected. Subsequent transactions then appear as unverified, presumably because the updates are not being observed so the transactions are not being finished.
What can I do to make this work reliably in my actual project?
For context, in the actual project:
I have a StoreKit Configuration file that is synced with App Store Connect
The In-App Purchase capability is enabled
The configuration file is selected in the scheme
The products in App Store Connect show “Ready to Submit”
Loading products works:
try await Product.products(for: ...)
Also, I use ProductView for the purchase UI. The first purchase works and is detected and finished, but subsequent renewals are not finished because the updates do not seem to be emitted.
The tutorial only says a notification will be sent, but what happens next..? what should we do about the child account..? are we blocking them..? what happens on the child account?
https://developer.apple.com/documentation/storekit/testing-age-assurance-in-sandbox
Transaction can not finish in OS26.2 TestFlight
Hello everyone,
I’m currently stuck in App Review and would appreciate input from anyone who has dealt with a similar situation.
App setup
iOS app, SwiftUI, StoreKit 2
No user accounts (no login, no username/password, no backend)
No subscriptions
Monetization model:
App was paid before version 1.0.5
Since 1.0.5 the app is free
Unlocking full functionality is done via a non-consumable, one-time IAP (“Pro Unlock”)
Existing users who bought the app when it was paid are automatically granted Pro access
New users get a 24-hour local trial, then must purchase the non-consumable IAP
All state is local / device-based, no server
There is no concept of an account, subscription renewal, or expired subscription in the app.
Rejection from App Review
Apple rejected the app with the following message:
Guideline 2.1 – Information Needed
We are not able to continue our review because we need access to a demo account with an expired subscription to review the entire purchase flow.
Please provide a user name and password for a demo account with expired subscriptions in the App Review Information section of App Store Connect.
This is where I’m confused.
Why this doesn’t seem applicable
The app does not use subscriptions
The app does not have user accounts
The IAP is non-consumable, one-time purchase
Trials are not subscription-based and expire automatically on-device
There is no “expired subscription account” that could exist technically
StoreKit testing is done via sandbox Apple IDs, but those are:
not app-level accounts
not usernames/passwords inside the app
only used in the Apple purchase sheet
Additional complication
Because old paid users are automatically recognized as “Pro” via AppTransaction.originalAppVersion, the Unlock Pro button is hidden once Pro is active.
This means that on some devices (including mine), the purchase sheet never appears anymore because the app already considers the user entitled.
This might be confusing App Review and causing them to assume the app uses subscriptions and gated accounts.
Questions
Has anyone seen App Review request a demo account with expired subscription for an app that uses only non-consumable IAPs?
Is there a correct way to respond other than explicitly explaining that:
there are no accounts
there are no subscriptions
StoreKit sandbox Apple IDs are sufficient?
Would providing a sandbox Apple ID (clearly labeled as such) help, or is that inappropriate since Apple reviewers already have sandbox accounts?
Is this likely just a misclassification by App Review, or is there something in Apple’s guidelines that I’m missing?
What I’ve already tried
Explained the purchase flow step-by-step in App Review notes
Clarified that the Paid Apps Agreement is already accepted
Clarified that Pro access is automatically granted to previous paid users
Verified that the IAP is correctly configured and available in App Store Connect
At this point I’m unsure whether I should:
escalate / push back on the incorrect assumption, or
modify the UI to make the purchase path permanently visible even for entitled users
Any insight from people who have gone through similar review issues would be greatly appreciated.
Thanks in advance.