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...
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
Hello, I have 2 subscription group. Each group have different plans and promotional offer. I was set 1 month free promotional offer in all plans. While I subscribe any plan IAP sheet is not showing 1 month free promotional offer. I already used with new sandbox account. How can I get promotional offer in IAP sheet?
Hello,
I would like to ask for your opinion on whether the following in-app purchase (IAP) specifications would comply with the App Store Review Guidelines.
■ App Overview
・The app allows users to create a “Family Group” by inviting other family members to join.
・The app provides brain-training games. The game itself is displayed via WebView.
・All purchases use in-app purchase (IAP) only. No external payments or links are provided.
■ Purchase Types (2 models)
① Group Unlimited Plan
・If one member of a family group purchases this plan, all members of the same group can play the games without limits for a certain period.
・This is based on the app’s own group-sharing mechanism, not Apple’s “Family Sharing.” We will clearly state this in the UI to avoid confusion.
② Ticket System (Consumable)
・One user in the group purchases game-play tickets.
・Other members of the same group can also consume those tickets to play.
・Tickets are only shared and consumed within the app’s family group. They cannot be transferred, resold, or moved outside the app.
■ Points to Confirm
A. For model ①: Is it acceptable under the guidelines to grant access to the entire group when one member purchases the plan (via the app’s own group logic)?
B. For model ②: Is it acceptable to allow consumable tickets to be shared and consumed within the group?
(I understand that Apple’s official “Family Sharing” does not allow sharing of consumables. This would be strictly our own in-app sharing logic.)
If anyone has experience or insights regarding whether such designs are allowed under the guidelines, I would greatly appreciate your advice.
I don't know I keep getting rejected for the same thing. My guy won't tell me what's wrong with it. He just keeps sending me the same screenshot and I just don't see what's wrong with it so here I am can somebody please look at this and tell me what you see do you see what's wrong with this so that I can correct it and submit it for the fifth time and hoping I get rejected.
We are developing an app which has an In App Purchase for subscription, we have the application in tesflight, and the subscription is done through apple developers account in the app store, now we are trying to cancel the subscription, we just keep getting an error message in app store stating "your request is temporarily unable to be processed".
we need to cancel this subscription for us to test our application properly.
any help on this would be appreciated.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
Subscriptions
In-App Purchase
Hi everyone,
I’m trying to submit my first release with In-App Purchases, but I can’t keep the IAP attached to the submission.
Status: Not published yet (first release)
Version: 5.0.0 (multiple builds: (7), (8), etc.)
What happens
I upload a new build and select it for version 5.0.0.
I go to Add for Review and select my newly created IAP (auto-renewable subscriptions).
I submit the version.
When I re-open the submission details, the IAP section is empty (they no longer appear as “Included in this submission”).
The result is a double failure:
App rejection (Guideline 2.1 – “IAP not found in the submitted binary”).
Each IAP is also rejected for lack of a binary in its review context.
It looks like the IAP and the build keep getting detached from each other after I submit. Since this is my first version, I’ve tried changing builds and even editing version metadata, but it still feels like I’m just “editing the first version” rather than creating a fresh link between this binary and these IAP.
What I already tried
Creating the IAP and selecting them during Add for Review.
Ensuring the IAP have complete metadata/localizations and pricing.
Re-submitting using a new build number (5.0.0 (8), etc.).
Checking Monetization → In-App Purchases and Subscriptions; products exist, but after submit they stop appearing under the submission.
(When testing the opposite path) Removing IAP entirely for a non-IAP release — but Review still referenced IAP “linked” on their side.
Questions
What is the exact, canonical sequence to link a new build to newly created IAP so they remain listed under “Included in this submission” after I hit Submit?
For first-time IAP, do I need to press Submit for Review on each IAP product before selecting them in the app submission? Or is selecting them during Add for Review enough?
Which product statuses are required so that IAP do not drop off the submission? (Ready to Submit vs Waiting for Review, etc.)
Can changing the build (or editing version metadata) after attaching IAP cause them to be silently removed from the submission?
Since this app is not yet published, is it advisable to create a new app version (e.g., 5.0.1) to “reset” the linkage, or should a new build under 5.0.0 be sufficient?
Any guidance or a step-by-step checklist to keep IAP attached to the submission would be greatly appreciated. Thanks!
— Victor
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
App Store Connect
In-App Purchase
I have three questions about verify receipt
I use this api (https://buy.itunes.apple.com/verifyReceipt)to verify receipt is success or not. But since last month, this interface has started to return an error(21002). I see this document (https://developer.apple.com/documentation/appstorereceipts/verifyreceipt) say its Deprecated. My question is, is the error suddenly returned recently because the interface has been deprecated or for some other reason? (I haven't modified my code about this recently)
I can not understand this document: (https://developer.apple.com/documentation/appstorereceipts/validating_receipts_on_the_device) Does this mean that in the new version, as long as the app returns a payment success (purchaseDetails.status == PurchaseStatus.purchased), the payment is guaranteed to be successful, and my server does not need to request payment result verification from Apple's server?
I try to use this (https://github.com/apple/app-store-server-library-java) to get TransactionInfo, but I dont konw to get Transaction status to know is success or not.
my java server code :
AppStoreServerAPIClient client = new AppStoreServerAPIClient(encodedKey, keyId, issuerId, bundleId, environment); TransactionInfoResponse response = client.getTransactionInfo(transactionId);
(bug i can note get transaction status, how do i konw this Transaction is success or not)
I am attempting to test non-consumable sandbox purchases, however I am unable to select the "Approve Transaction" option after initiating a purchase. Leaving the transaction in a permanent pending state. I can view the transaction in the transaction manager by navigating to Debug -> Storekit -> Manage Transactions.. but the only available options to select are "Refund Transaction" or "Delete Transaction".
What am I missing about Xcode or my environment that is preventing me from testing this purchase flow?
Some more information about my set up.
I have a .storekit file synced to AppStore Connect with my product Id.
There's a StoreKitTestCertificate.cert saved in the project.
I've tried running the build on my phone as Debug, Release and ReleaseForRunning all with the same behavior after making a purchase.
My phone is logged into a sandbox test user apple account in the developer iOS settings
I’m running into an issue where the com.apple.developer.storekit entitlement is not being included in provisioning profiles, even though my App ID is properly configured for In-App Purchase.
Entitlements file: explicitly includes
<key>com.apple.developer.storekit</key>
<true/>
Capability: In-App Purchase is enabled in the Apple Developer Portal and shows as “Enabled.”
What I’ve tried:
Automatic signing in Xcode → profiles generated, but missing com.apple.developer.storekit
Manual signing → deleted and recreated provisioning profiles multiple times; entitlement still missing.
Waited several hours for possible propagation.
Verified that my in-app purchase products are set up correctly.
Error message:
Provisioning profile "iOS Team Provisioning Profile: zu.inniu" doesn't include the com.apple.developer.storekit entitlement
Question:
Has anyone else encountered this? Is there a step I might be missing to get StoreKit entitlements included in provisioning profiles, or could this be a backend issue that needs escalation through Apple DTS?
This is blocking me from building my app for physical devices, so any guidance would be greatly appreciated.
Thanks in advance!
Topic:
Code Signing
SubTopic:
Certificates, Identifiers & Profiles
Tags:
Entitlements
In-App Purchase
The documentation mentions the following:
Verify your receipt first with the production URL; then verify with the sandbox URL if you receive a 21007 status code. This approach ensures you don’t have to switch between URLs while your app is in testing, in review by App Review, or live in the App Store.
This way, you can use one server environment to handle both Sandbox and Production environments. It is necessary to pass App Review.
However, I'm not manually hitting these URLs - I'm using Apple's libraries.
Specifically, the environment is used in SignedDataVerifier and AppStoreServerAPIClient.
(I can't link to these because, for some reason, the domain apple.github.io is not allowed. The documentation for these is only found there. You can find it quickly by searching these terms and the domain.)
Here is how SignedDataVerifier is being used:
const verifier = new SignedDataVerifier(
appleRootCertificates,
APPLE_ENABLE_ONLINE_CHECKS,
APPLE_ENVIRONMENT,
APPLE_BUNDLE_ID,
APPLE_APP_ID
)
const verifiedNotification: ResponseBodyV2DecodedPayload = await verifier.verifyAndDecodeNotification(signedPayload)
if (!verifiedNotification)
{
// Failure
return
}
Here is how AppStoreServerAPIClient is being used:
const appStoreServerAPIClient = new AppStoreServerAPIClient(
SIGNING_KEY,
APPLE_IAP_KEY_ID,
APPLE_IAP_ISSUER_ID,
APPLE_BUNDLE_ID,
APPLE_ENVIRONMENT
)
const statusResponse: StatusResponse = await appStoreServerAPIClient.getAllSubscriptionStatuses(originalTransactionId, [Status.ACTIVE])
In the source code for SignedDataVerifier.verifyAndDecodeNotification, I can see that it throws a VerificationException(VerificationStatus.INVALID_ENVIRONMENT) error .
So for SignedDataVerifier is it as simple as wrapping my code in a try/catch and checking that the error's status code is 21007? I'm unsure about this because if you scroll to the bottom of the linked source code file, you can see the enumeration VerificationStatus, but it's unclear if this member has a value of 21007.
The source code for AppStoreServerAPIClient only says that it throws an APIException if a response could not be processed, so I'm not too sure about how to handle this one.
We’ve been approved for the Advanced Commerce API and are setting up the generic product identifiers per the guide:
https://developer.apple.com/documentation/advancedcommerceapi/setting-up-your-project-for-advanced-commerce#Set-up-generic-product-identifiers
We have multiple auto-renewable subscriptions (for simplicity: Product 1, Product 2, etc.). We created a new subscription group for Advanced Commerce and are about to add the subscription(s) inside that group.
Should we create one auto-renewable subscription (generic, e.g. subscription.ac) to represent all of our subscriptions, or one generic per product family (e.g., product1.ac, product2.ac, …)? If the answer depends on whether subscribers can hold multiple products simultaneously, please advise which structure supports that (e.g., separate groups).
Reporting identifiers / segmentation: In Sales and Trends and Payments & Financial Reports, which identifier(s) will appear after migration: the legacy StoreKit product_id, the new generic product id, and/or the SKU? If we use a single generic subscription for all products, what’s Apple’s recommended way to segment revenue by product (Product 1 vs. Product 2)? If SKUs don’t surface in these reports, should we prefer multiple generics/groups to preserve report-level segmentation?
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
In-App Purchase
Advanced Commerce API
Hi,
We have a app with some auto-renewing subscription in a group of subscriptions.
When a user upgrade from a subscription to another, the "user receive a refund of the prorated amount of their original subscription" (https://developer.apple.com/app-store/subscriptions/).
How is the prorated calculated ?
Example : subscription to 14,99$ / month. If subscriber upgrade after 10 days, is the refund calculated 10/30 of 14,99$ (so ~5$) ?
Hello,
I’m experiencing an issue with StoreKit 2 when passing a new appAccountToken for each purchase request.
Case-ID: 15948169 (for DTS reference)
Description of the Problem
When initiating a purchase, I generate a new UUID to use as the appAccountToken:
let serverTransactionId = UUID()
let options: Set<Product.PurchaseOption> = [
.appAccountToken(serverTransactionId)
]
let result = try await product.purchase(options: options)
Expected Behavior:
Each new purchase should return the updated appAccountToken that I pass into the purchase options.
Actual Behavior:
The payload response after success always contains the same appAccountToken from the very first transaction. It ignores subsequent UUIDs I pass and keeps reusing the original one.
This causes issues because the same identifier is being reused across multiple transactions, making it difficult to map purchases to the correct user session.
Steps to Reproduce
Generate a fresh UUID using UUID().
Pass it as .appAccountToken when calling purchase().
Complete the transaction in the sandbox environment.
Inspect the payload response → The appAccountToken value is always the same as the first one used, not the newly provided one.
Additional Info
I do have a focused test project that reproduces this issue.
The issue appears specific to appAccountToken persistence across multiple transactions.
Has anyone else experienced this behavior with StoreKit 2? Is this expected (Apple caching the first token) or could this be a bug?
Topic:
Developer Tools & Services
SubTopic:
Xcode
Tags:
Subscriptions
StoreKit
In-App Purchase
App Store Receipts
Dear all,
This is my first post in this forum - and, in fact, my first app, too! I'm glad to be here, and thanks in advance for your help.
I'm looking to offer an app for a one-time payment. I'd also like people to be able to try the app for a week.
It seems that the "Pricing and Availability" section in App Store Connect is not the right place to configure this kind of offer. It does allow me to set a one-time price, but I cannot find a trial-period there (or am I missing something?)
Two different strategies seem possible here:
Using in-app-purchases: make the actual app free, but ask users after a week to buy a non-consumable IAP. The problem with that: I need to verify that the app has been installed for seven days ... even if it has been uninstalled at some point.
Using subscriptions: There is a "free trial" option for subscriptions. But after that free trial, subscriptions are being payed periodically. I'd rather have the user only pay once for lifetime-access.
Some apps seem to use strategy 1 - I believe the "Lap swim" app does. But still it seems like a bit of a hack - is there a more elegant way to achieve this?
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
In-App Purchase
App Store Connect
StoreKit
Subscriptions
I would like to know if it is allowed to offer the user to either unlock the app immediately or partake in a 3-day trial period before making a purchase.
I created 2 IAP non-consumable products; 1 for the immediate [which is at a discount] and for the after trial period ends [this is at a higher cost].
Is this something that Apple allows or is frowned upon?
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?
What is the expected behavior for App Receipts and ASSN v2 notifications when a subscription is set to "Remove from Sale"?
I tried to test this in Sandbox, but the "Remove from Sale" setting in App Store Connect doesn't seem to affect the Sandbox environment.
For existing subscribers, what happens in the receipt? Does auto_renew_status change to 0 and is expiration_intent populated immediately?
Also, which notificationType is sent via ASSN v2?
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
In-App Purchase
App Store Server Notifications
App Store Receipts
Hello,
I am setting up an auto-renewable subscription for my iOS app in App Store Connect.
I would like to set the monthly subscription price to ¥710 (Japanese yen).
From what I understand, Apple requires us to use predefined price tiers for in-app purchases and subscriptions. However, I’m not sure whether subscriptions allow more flexibility than one-time in-app purchases.
👉 My questions are:
Is it possible to set an arbitrary subscription price such as ¥710, or must I pick the closest price tier from Apple’s official subscription price list?
If arbitrary prices are not allowed, is there an official list of available subscription price points for Japan that I can refer to?
Can we set subscription prices in multiples of 10 yen (e.g., ¥700, ¥710, ¥720), or are we strictly limited to the price points Apple provides?
Thank you in advance for your help!
Topic:
Community
SubTopic:
Apple Developers
Tags:
Subscriptions
StoreKit
App Store Connect
In-App Purchase
Now I’m testing in-app purchase for my app but I can’t find how to set up my snadbox account in tvOS.
Acoording to Apple support team, the following menu item should be available in the settings;
Settings > Users and Accounts > Sandbox Account
But it’s not the case for me even I activated develope mode in tvOS already.
Can anyone explain how to set up sandbox account in tvOS or how to activate the menu above?
Thanks in advance.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
tvOS
In-App Purchase
StoreKit
Hi,I am facing the 21002 issue.Have you went through it? If you have resolved it, please dive me a hand.
Below is my code,and I Have tested in sand box environment.
NSURL receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
if (![[NSFileManager defaultManager] fileExistsAtPath:[receiptURL path]]) {
SKReceiptRefreshRequest receiptRefreshRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
receiptRefreshRequest.delegate = self;
[receiptRefreshRequest start];
return;
}
NSData data = [NSData dataWithContentsOfURL:receiptURL];
/ receipt_data/
NSString *receipt_data = [data base64EncodedStringWithOptions:0];
After I test the purchase procedure, use the above receipt-data to verify on the server https://sandbox.itunes.apple.com/verifyReceipt,which always response 21002.I have no idea to deal with it.Thanks.