In-App Purchase

RSS for tag

Offer extra content, digital goods, and features directly within your app using in-app purchases.

Posts under In-App Purchase tag

200 Posts

Post

Replies

Boosts

Views

Activity

Sandbox apple in app purchases not working - Error Domain=AMSErrorDomain Code=305 "Purchase Failed Server canceled the purchase"
<SKPaymentQueue: 0x10629d1b0>: Payment completed with error: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={client-environment-type=Sandbox, storefront-country-code=USA, NSUnderlyingError=0x108f15c80 {Error Domain=AMSErrorDomain Code=305 "Purchase Failed Server canceled the purchase" UserInfo={AMSFailureReason=Server canceled the purchase, AMSURL=https://sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy?guid=00008030-001E19361A12202E, AMSDescription=Purchase Failed, AMSStatusCode=200, AMSServerPayload={ "cancel-purchase-batch" = 1; customerMessage = "Unable to process your request."; dialog = { defaultButton = ok; explanation = "Please try again later.\n\n[Environment: Sandbox]"; initialCheckboxValue = 1; isFree = 1; "m-allowed" = 0; message = "Unable to process your request."; okButtonString = OK; }; failureType = ""; "m-allowed" = 0; metrics = { actionUrl = "sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy"; asnState = 0; dialogId = "MZCommerce.SystemError"; eventType = dialog; message = "Unable to process your re"; mtEventTime = "2025-07-30 07:08:24 Etc/GMT"; mtTopic = "xp_its_main"; options = ( OK ); }; pings = ( ); }, NSDebugDescription=Purchase Failed Server canceled the purchase}}}
3
1
212
Jul ’25
Unauthorized for Advanced Commerce API Purchase
Hi! My product SKU has been approved for Advanced Commerce API. I successfully receive a purchase pop-up with the correct information. However, I am still having issues with completing the purchase. I always receive Unauthorize error when I confirm the purchase (subscription in my case; see the screenshot). I am using the node.js server library to sign the request. I made sure that the account is a valid account enabled for Sandbox. Logs unfortunately don't indicate any further detail. Thanks for your advice! We've been stuck on this for a while now and would appreciate your help. Marek
6
2
227
Jul ’25
Problem Generating Signature for Subscription Offers – Error Code 18
I'm successfully using Apple subscriptions in my app, but I'm encountering SKErrorCodeDomain error 18 when trying to apply a subscription offer. I want apply offer code first time only for subscription. Below are details of what i set in appstore and what i have tested. Subscription Offer Details Offer Type: For the first month Customer Eligibility: New, Existing, and Expired Subscribers Code Status: Active Offer Code Creation Steps: App Store Connect → App → Subscription → Select Subscription Product → Offer Codes → Add → Add Custom Codes Signature Generation for Promotional Offers I'm following Apple's documentation to generate a signature: https://developer.apple.com/documentation/storekit/generating-a-signature-for-promotional-offers I’ve constructed the payload as instructed: appBundleId + '\u2063' + keyIdentifier + '\u2063' + productIdentifier + '\u2063' + offerIdentifier + '\u2063' + appAccountToken + '\u2063' + nonce + '\u2063' + timestamp Keys and Identifiers keyIdentifier, issuerId, and .p8 file are obtained from: App Store Connect → Users and Access → Integrations → In-App Purchase Test user created under: App Store Connect → Users and Access → Sandbox → Test Accounts Logged in with this account on the iPhone What I’ve Tried Verified all values used in the payload are correct Tried both seconds and milliseconds for the timestamp (as per documentation, it should be in milliseconds) Tried setting appAccountToken to: a valid UUID an empty string not setting it at all Used Apple’s sample code to generate a signature: https://developer.apple.com/documentation/storekit/generating-a-promotional-offer-signature-on-the-server Verified the generated signature locally, and it validated successfully: https://developer.apple.com/documentation/storekit/generating-a-signature-for-promotional-offers#Validate-locally-and-encode-the-signature Apple’s sample code to generate a signature Downloaded from const express = require('express'); const router = express.Router(); const crypto = require('crypto'); const ECKey = require('ec-key'); const secp256k1 = require('secp256k1'); const uuidv4 = require('uuid/v4'); const KeyEncoder = require('key-encoder'); const keyEncoder = new KeyEncoder('secp256k1'); const fs = require('fs'); function getKeyID() { return "KEYIDXXXXX"; } router.post('/offer', function(req, res) { const appBundleID = req.body.appBundleID; const productIdentifier = req.body.productIdentifier; const subscriptionOfferID = req.body.offerID; const applicationUsername = req.body.applicationUsername; const nonce = uuidv4(); const currentDate = new Date(); const timestamp = currentDate.getTime(); const keyID = getKeyID(); const payload = appBundleID + '\u2063' + keyID + '\u2063' + productIdentifier + '\u2063' + subscriptionOfferID + '\u2063' + applicationUsername + '\u2063'+ nonce + '\u2063' + timestamp; // Get the PEM-formatted private key string associated with the Key ID. // const keyString = getKeyStringForID(keyID); // Read the .p8 file const keyString = fs.readFileSync('./SubscriptionKey_47J5826J8W.p8', 'utf8'); // Create an Elliptic Curve Digital Signature Algorithm (ECDSA) object using the private key. const key = new ECKey(keyString, 'pem'); // Set up the cryptographic format used to sign the key with the SHA-256 hashing algorithm. const cryptoSign = key.createSign('SHA256'); // Add the payload string to sign. cryptoSign.update(payload); /* The Node.js crypto library creates a DER-formatted binary value signature, and then base-64 encodes it to create the string that you will use in StoreKit. */ const signature = cryptoSign.sign('base64'); /* Check that the signature passes verification by using the ec-key library. The verification process is similar to creating the signature, except it uses 'createVerify' instead of 'createSign', and after updating it with the payload, it uses `verify` to pass in the signature and encoding, instead of `sign` to get the signature. This step is not required, but it's useful to check when implementing your signature code. This helps debug issues with signing before sending transactions to Apple. If verification succeeds, the next recommended testing step is attempting a purchase in the Sandbox environment. */ const verificationResult = key.createVerify('SHA256').update(payload).verify(signature, 'base64'); console.log("Verification result: " + verificationResult) // Send the response. res.setHeader('Content-Type', 'application/json'); res.json({ 'keyID': keyID, 'nonce': nonce, 'timestamp': timestamp, 'signature': signature }); }); module.exports = router; Postman request and response Request URL: http://192.168.1.141:3004/offer Request JSON: { "appBundleID":"com.app.bundleid", "productIdentifier":"subscription.product.id", "offerID":"OFFERCODE1", "applicationUsername":"01234b43791ea309a1c3003412bcdaaa09d39a615c379cc246f5f479760629a1" } Response JSON: { "keyID": "KEYIDXXXXX", "nonce": "f98f2cda-c7a6-492f-9f92-e24a6122c0c9", "timestamp": 1753510571664, "signature": "MEYCIQCnA8UGWhTiCF+F6S55Zl6hpjnm7SC3aAgvmTBmQDnsAgIhAP6xIeRuREyxxx69Ve/qjnONq7pF1cK8TDn82fyePcqz" } Xcode Code func buy(_ product: SKProduct) { let discountOffer = SKPaymentDiscount( identifier: "OFFERCODE1", keyIdentifier: "KEYIDXXXXX", nonce: UUID(uuidString: "f98f2cda-c7a6-492f-9f92-e24a6122c0c9")!, signature: "MEYCIQCnA8UGWhTiCF+F6S55Zl6hpjnm7SC3aAgvmTBmQDnsAgIhAP6xIeRuREyxxx69Ve/qjnONq7pF1cK8TDn82fyePcqz", timestamp: 1753510571664) let payment = SKMutablePayment(product: product) payment.applicationUsername = "01234b43791ea309a1c3003412bcdaaa09d39a615c379cc246f5f479760629a1" payment.paymentDiscount = discountOffer SKPaymentQueue.default().add(payment) } Issue Even following instructions to the documentation and attempting various combinations, the offer keeps failing with SKErrorCodeDomain error 18. Has anyone else experienced this? Any suggestions as to what may be amiss or how it can be corrected?
1
0
74
Jul ’25
Payment completed with error: Error Domain=ASDErrorDomain Code=500
I would like to inquire about an error that has started occurring while debugging AppStore billing. (In sandbox environment) This error occurs after entering a password and completing the purchase process, and in this case, no completion alert appears. The error doesn't seem to depend on the purchase item, sandbox account, or device, and shows unstable behavior - sometimes succeeding and sometimes failing. Additionally, this error started occurring after special debugging where the network was disconnected during the purchase process. Moreover, the same error occurs in the TestFlight version of our already released normal (supposedly) version. I think this might be a sandbox-specific error where the system has temporarily become unstable, but what do you think? If so, how can I resolve this issue? I would appreciate your insights on the cause and appropriate response. Error details below: <SKPaymentQueue: 0x283b3d070>: Payment completed with error: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={NSUnderlyingError=0x28364d770 {Error Domain=AMSErrorDomain Code=305 "Purchase Failed" UserInfo={NSLocalizedDescription=Purchase Failed, AMSStatusCode=200, AMSServerPayload={ "cancel-purchase-batch" = 1; customerMessage = "Unauthorized_message"; failureType = ""; "m-allowed" = 0; pings = ( ); }, NSLocalizedFailureReason=Server canceled the purchase}}, storefront-country-code=JPN, client-environment-type=Sandbox}
1
0
143
Jul ’25
Sandbox apple in app purchases not working
Received error that does not have a corresponding StoreKit Error: Error Domain=AMSErrorDomain Code=305 "Purchase Failed Server canceled the purchase More details: Error Domain=AMSErrorDomain Code=305 "Purchase Failed Server canceled the purchase" UserInfo={AMSFailureReason=Server canceled the purchase, AMSURL=https://sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy?guid=00008110-000A4DC10E51401E, AMSDescription=Purchase Failed, AMSStatusCode=200, AMSServerPayload={ "cancel-purchase-batch" = 1; customerMessage = "Unable to process your request."; dialog = { defaultButton = ok; explanation = "Please try again later.\n\n[Environment: Sandbox]"; initialCheckboxValue = 1; isFree = 1; "m-allowed" = 0; message = "Unable to process your request."; okButtonString = OK; }; failureType = ""; "m-allowed" = 0; metrics = { actionUrl = "sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy"; asnState = 0; dialogId = "MZCommerce.SystemError"; eventType = dialog; message = "Unable to process your re"; mtEventTime = "2025-07-28 12:34:22 Etc/GMT"; mtTopic = "xp_its_main"; options = ( OK ); }; pings = ( ); }, NSDebugDescription=Purchase Failed Server canceled the purchase} Received error that does not have a corresponding StoreKit Error: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={client-environment-type=Sandbox, storefront-country-code=IND, NSUnderlyingError=0x1276116e0 {Error Domain=AMSErrorDomain Code=305 "Purchase Failed Server canceled the purchase" UserInfo={AMSFailureReason=Server canceled the purchase, AMSURL=https://sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy?guid=00008110-000A4DC10E51401E, AMSDescription=Purchase Failed, AMSStatusCode=200, AMSServerPayload={ "cancel-purchase-batch" = 1; customerMessage = "Unable to process your request."; dialog = { defaultButton = ok; explanation = "Please try again later.\n\n[Environment: Sandbox]"; initialCheckboxValue = 1; isFree = 1; "m-allowed" = 0; message = "Unable to process your request."; okButtonString = OK; }; failureType = ""; "m-allowed" = 0; metrics = { actionUrl = "sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy"; asnState = 0; dialogId = "MZCommerce.SystemError"; eventType = dialog; message = "Unable to process your re"; mtEventTime = "2025-07-28 12:34:22 Etc/GMT"; mtTopic = "xp_its_main"; options = ( OK ); }; pings = ( ); }, NSDebugDescription=Purchase Failed Server canceled the purchase}}} Purchase did not return a transaction: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={client-environment-type=Sandbox, storefront-country-code=IND, NSUnderlyingError=0x1276116e0 {Error Domain=AMSErrorDomain Code=305 "Purchase Failed Server canceled the purchase" UserInfo={AMSFailureReason=Server canceled the purchase, AMSURL=https://sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy?guid=00008110-000A4DC10E51401E, AMSDescription=Purchase Failed, AMSStatusCode=200, AMSServerPayload={ "cancel-purchase-batch" = 1; customerMessage = "Unable to process your request."; dialog = { defaultButton = ok; explanation = "Please try again later.\n\n[Environment: Sandbox]"; initialCheckboxValue = 1; isFree = 1; "m-allowed" = 0; message = "Unable to process your request."; okButtonString = OK; }; failureType = ""; "m-allowed" = 0; metrics = { actionUrl = "sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy"; asnState = 0; dialogId = "MZCommerce.SystemError"; eventType = dialog; message = "Unable to process your re"; mtEventTime = "2025-07-28 12:34:22 Etc/GMT"; mtTopic = "xp_its_main"; options = ( OK ); }; pings = ( ); }, NSDebugDescription=Purchase Failed Server canceled the purchase}}}
3
0
187
Jul ’25
Consumable in-app purchases
I implemented consumable in-app purchases in an iPhone app using StoreKit's ProductView(). When I tap the payment button in ProductView(), I am taken to the payment screen and once the payment is completed, the desired code appears to be executed, so there doesn't seem to be a problem, but when I tap the payment button in ProductView() again, the desired code is executed without being taken to the payment screen. So one payment can be used any number of times. I thought I wrote it exactly according to the reference, but will it be okay in a production environment? Is there any code that is necessary?
2
0
210
Jul ’25
In iOS 26 beta3 version, the finishTransaction method is unable to remove transactions from the SKPaymentQueue, causing transactions to remain in the queue even after being processed.
We have some users who have upgraded to iOS 26 beta3. Currently, we observe that when these users make in-app purchases, our code calls [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; method, and we clearly receive the successful removal callback in the delegate method - (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray<SKPaymentTransaction *> *)transactions. However, when users click on products with the same productId again, the method - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions still returns information about previously removed transactions, preventing users from making further in-app purchases.
2
2
454
Jul ’25
Transactions Finish does not work on iOS 26 beta3
On iOS 26 beta 3, after a user purchases an item, initiating a second order for the same product fails to process payment. The system returns the same transaction ID and displays an interface message stating: "You've already purchased this In-App Purchase. It will be restored for free."​​ ​​I’ve tested this – not only did the legacy StoreKit finishTransaction method fail to work, but StoreKit2 finish method also malfunctioned.​​ ​​When will Apple fix this issue? If unresolved, it will prevent a large number of users from making purchases normally, leading to disastrous consequences.​
4
5
484
Jul ’25
Can't restore purchases on some devices
Hi, we have published a flutter app on the App Store offering additional content via one-time in-app purchases. Everything is working as expected when distributing the app via TestFlight but we're reportedly having issues with users not being able to restore purchases on some devices with the app loaded from the Apple App Store. We noticed the issue when some user were unable to unlock the in-app purchases via promotion codes we supplied for marketing reasons. Most of them were able to unlock the purchases using the promotion codes without a problem. Some had to try several times using a new code each time but for some users (on some of their devices) it's not working at all and we can't seem to find the reason for it. Here is one users case in detail: the user tried to unlock our "complete bundle" using a promo code first code did not seem to work, so I provided a new code it seems that both codes were redeemed correctly because both of the show up in the users purchase history in his App Store profile Now, the user is unable to unlock the content inside our app on his iPhone, he is however able to unlock it on its iPad without a problem. Both devices run the same iOS version, same Apple ID and the exact same app version. Even stranger: when using the TestFlight version of the app, again everything is working correctly even on the users iPhone. I took a look at the device logs and here's what I found: This is a snapshot of the users iPad. As you can see products are found and listed correctly storekitd seems to find and return products in receipt with the correct identifier we get the correct information and are able to restore the correct purchase 14:48:17.032895+0200  Runner  flutter: Found id: de.BUNDLEID.01, title: TITLE 1, price: €29.99 14:48:17.032922+0200  Runner  flutter: Found id: de.BUNDLEID.bundle, title: TITLE Gesamtpaket, price: €59.99 14:48:17.032975+0200  Runner  flutter: Found id: de.BUNDLEID.02, title: TITLE 2, price: €29.99 14:48:17.033001+0200  Runner  flutter: Found id: de.BUNDLEID.extension, title: TITLE Plus, price: €9.99 14:48:20.656702+0200  storekitd  [70D5C079]: Found 2 products in receipt with ID de.BUNDLEID.bundle 14:48:20.667793+0200  Runner  flutter: Called purchaseListener (purchaseDetailsList: 1) 14:48:20.667838+0200  Runner  flutter: Purchase restored 14:48:20.667869+0200  Runner  flutter: Unlock permission TITLE_1 14:48:20.667892+0200  Runner  flutter: Update TITLE_1 with true 14:48:20.672199+0200  Runner  flutter: Unlock permission TITLE_2 14:48:20.672243+0200  Runner  flutter: Update TITLE_2 with true 14:48:20.677849+0200  Runner  flutter: Unlock permission TITLE_3 14:48:20.677897+0200  Runner  flutter: Update TITLE_3 with true 14:48:20.679079+0200  Runner  flutter: Calling completePurchase... Same exact behavior can be observed on the users iPhone when running the TestFlight version of the app. However, running the app from the Apple App Store on the users iPhone (same Apple ID, same OS and app version), the log looks like this: ​14:23:26.150484+0200 Runner flutter: Found id: de.BUNDLEID.bundle, title: TITLE Gesamtpaket, price: €59.99 14:23:26.150513+0200 Runner flutter: Found id: de.BUNDLEID.02, title: TITLE 2, price: €29.99 14:23:26.150619+0200 Runner flutter: Found id: de.BUDNLEID.extension, title: TITLE Plus, price: €9.99 14:23:26.150657+0200 Runner flutter: Found id: de.BUNDLEID.01, title: TITLE 1, price: €29.99 14:23:27.125353+0200 dasd com.apple.icloud.searchpartyd.ProductInfoManager:C25423:[ (name: Thundering Herd Policy, policyWeight: 14:23:27.376336+0200 storekitd [Client] (Runner) Initialized with server Production bundle ID de.ds-infocenter.guk and request bundl 14:23:27.390026+0200 storekitd AMSURRequestEncoder: (7BA6012D] Encoding request for URL: https://mzstorekit.itunes.apple.com/inApps/ 14:23:27.984831+0200 storekitd [7BA6012D]: Found 2 products in receipt with ID de.BUNDLEID.bundle 14:23:27.990235+0200 Runner flutter: Called purchaseListener (purchaseDetailsList: 0) 14:23:27.990271+0200 Runner flutter: Purchase details list is empty! StoreKit seems to return the same exact products but for some reason the purchaseDetails list seems to be empty this time. Here is the code responsible for restoring the purchases. Nothing fancy going on here if you ask me. @override void initState() { super.initState(); db = context.read<Database>(); inAppPurchase = InAppPurchase.instance; inAppPurchase.purchaseStream.listen( purchaseListener, onError: (error) { print('Purchase stream error: $error'); showErrorDialog(); }, cancelOnError: true, ); queryProductInformation().then((value) { if (value == null) { print('value in queryProductInformation is null!'); updateProcessing(false); return; } setState(() { for (var details in value.productDetails) { products[details.id] = details; } }); updateProcessing(false); }); } Future<void> restorePurchases() async { updateProcessing(true); await inAppPurchase.restorePurchases(); } void purchaseListener(List<PurchaseDetails> purchaseDetailsList) async { print( 'Called purchaseListener (purchaseDetailsList: ${purchaseDetailsList.length})'); if (purchaseDetailsList.isEmpty) { print('Purchase details list is empty!'); updateProcessing(false); return; } for (var purchaseDetails in purchaseDetailsList) { switch (purchaseDetails.status) { case PurchaseStatus.purchased: print('Purchase successful: ${purchaseDetails.productID}'); completePurchase(purchaseDetails.productID); break; case PurchaseStatus.canceled: print('Purchase was canceled'); updateProcessing(false); break; case PurchaseStatus.restored: print('Purchase restored'); completePurchase(purchaseDetails.productID); break; case PurchaseStatus.pending: print('Purchase pending'); break; case PurchaseStatus.error: print('Purchase error'); showErrorDialog(); break; } print('Calling completePurchase...'); await inAppPurchase.completePurchase(purchaseDetails); } } Could this be an issue on Apples API or flutters in_app_purchase package?
0
0
131
Jul ’25
交易无法结束 (Transactions Unable to Finish)
有一个用户反馈7月8日充值了3笔后一直无法发起新的购买,总是提示已经购买。我们查了是之前的交易无法结束,我们使用StoreKit2,已经调用await transaction.finish()成功结束交易了,但是每次发起新支付时,Transaction.unfinished还会返回之前已完成的交易信息。 是设备或AppleID的问题么?用户尝试了重启设备、重新登录AppleID都没用。有什么办法解决呢? 用户无法结束的苹果交易id为:200002703899379、200002703900716、200002703902023。 A user reported that after making 3 purchases on July 8th, they have been unable to initiate new purchases, always receiving a prompt that the item has already been purchased. Upon investigation, we found that the previous transactions couldn't be finalized. We use StoreKit2 and have successfully called await transaction.finish() to end the transactions. However, every time a new payment is initiated, Transaction.unfinished still returns information about the previously completed transactions. Could this be an issue with the device or Apple ID? The user has tried restarting the device and re-logging into their Apple ID, but these attempts were unsuccessful. Is there any way to resolve this? The Apple transaction IDs that the user is unable to finalize are: 200002703899379, 200002703900716, 200002703902023.
5
6
965
Jul ’25
In-App Purchases vs Subscriptions
The question is related to getting rejected by Apple when the app does only have Subscriptions but no In-App Purchases. My understanding is that an in-app purchase is consumable or non-consumable as that's how the UI on appstoreconnect shows it. My app has 3 tier subscription, paid monthly, and that's it. But "We are unable to complete the review of the app because one or more of the in-app purchase products have not been submitted for review." Which I have none?
3
0
123
Jul ’25
App Review Rejection for Guidelines 3.1.1
Hi all, Our app has been rejected several times without any clear explanation of what we need to do. The latest rejection reason is as follows: The app accesses digital content purchased outside the app, such as Tracker data plans, but that content isn't available to purchase using in-app purchase. Apps must use in-app purchase to unlock features or functionality within the app. Apps on the United States storefront may include buttons, external links, or other calls to action to direct users to payment mechanisms other than in-app purchase. Next Steps The paid digital content, services, or subscriptions included in or accessed by your app must be available for purchase in the app using only in-app purchase. As noted above, apps on the United States storefront may include buttons, external links, or other calls to action to payment mechanisms other than in-app purchase. To learn more about the recent changes to the App Review Guidelines, see the News post on Apple Developer. We plan to implement payments outside of IAP, and here is the business scenario of our app: Our app is designed to control an external hardware device. However, the device has a built-in SIM card, so to use the device, a data plan must be activated for it to function properly. These data plans are used to pay mobile network operators. Different data plans incur different fees and activate different hardware features of the device. In addition, since the hardware device will only be linked to the app after successful activation, the control buttons in the app for managing the hardware remain disabled until activation is complete. Therefore, we believe using non-IAP payments is justified under Guideline 3.1.4 – Hardware-Specific Content: I have repeatedly explained these points to the App Review team, but they still rejected the submission. I have asked multiple times which specific details are considered violations of 3.1.1, but they have not provided any concrete explanation. They also have not clarified whether 3.1.4 is deemed inapplicable in our case. Therefore, I am reaching out here for help. Thank you very much.
2
0
96
Jul ’25
SKErrorDomain Code 2 Problem
We are facing a serious issues with in app purchases in our app. We offer 3 IAP: auto-renewable subscription 1W, auto-renewable subscription 1Y, non-consumable one-time purchase (LifeTime access) In our case 90-95% of transactions fail and we mostly get SKError code=2 . Sometime purchase fails several times for the same user so it’s very hard to believe that user intentionally cancels transaction for the same product 4 or even 5 times in a row. It happens regardless iOS version, device model, our app version. We've checked multiple threads with the same issue but coudn't find any solution. We do not offer any promotions, product identifiers are valid... Some users are able to make a purchases without any issues.
1
0
221
Jul ’25
Apple Subscriptions - Coupons/Offer codes
We are trying to develop a coupon/offer code module where our app users can avail a free trail offer for 2 months period after applying the code. We already had a subscription module with monthly & yearly subscriptions with 7 day free trial period. Now, we want to implement a offer/coupon module, where, a user can either select monthly or yearly subscription, and upon entering the offer/coupon code, they will get 2 months free trial (or) a discount on the chosen subscription. (this will overwrite the existing 7 day free trial). We are confused on choosing the type of “offer/coupon” from AppStore connect. In App Store connect, we have introductory offers, promotional offer & Offer codes. Based on our requirements, we have done research and found that we cannot implement the offer code & promotional codes in the develop environment as there is no possibility to test in Sandbox environment. We observed that we need to push the app to App store and upon approval, we need to implement “offer/coupon” module. Can some one please suggest or guide us on choosing the best solution for our requirement? Thanks in advance.
1
0
99
Jul ’25
"In-App Purchases are not allowed" Error Persists After All Troubleshooting Steps
Hello, I am consistently receiving the error message "In-app purchases are not allowed on this device" whenever I try to make an in-app purchase on my iOS device. Despite following all the recommended solutions I could find online, the issue remains unresolved. Here is a list of the steps I have already taken: Checked Screen Time Settings: I navigated to Settings > Screen Time > Content & Privacy Restrictions > iTunes & App Store Purchases. I have confirmed that "In-App Purchases" is set to "Allow." I have also tried toggling this setting off and on again. Signed Out & In of Apple ID: I signed out of my Apple ID via Settings > [Your Name] > Media & Purchases, restarted the device, and then signed back in. Restarted the Device: I have force-restarted my device multiple times. Updated iOS: I have ensured my device is running the latest version of iOS (checked via Settings > General > Software Update). Verified Payment Method: I have confirmed that my payment method on file is valid and up-to-date. Created a New Sandbox Account: I also created a new Sandbox Tester account in App Store Connect and tested with it, but the result was the same. Device Information: Device Model: iPhone 15, iPhone 13 iOS Version: iOS 17.5, iOS 18 Even after performing all of these steps, the problem persists. Has anyone else encountered such a stubborn issue, or does anyone have a different solution I could try? Thank you in advance for your help.
0
0
186
Jul ’25
integrating In-App Purchases on PWA.
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.
0
0
121
Jul ’25
App Store Policy Inquiry: Selling Third-Party Digital Goods via Wallet App
Hello, I am seeking clarification regarding App Store policy requirements for In-App Purchases (IAP) in the following scenario: We are developing a wallet-based super app that allows users to access third-party storefronts (mini-apps) from within our app via embedded WebViews or similar in-app experiences. These storefronts are web-based and branded by external merchant partners. In this model: The mini-app storefront is embedded within our wallet app, but technically hosted externally by the merchant. The user browses and selects digital goods (e.g., in-game currency, subscription vouchers, virtual items) from the merchant’s mini-app. When the user proceeds to purchase, the payment is processed using a saved payment method from the wallet app, not through the App Store’s IAP system. The digital goods are for use in a separate third-party app, not within the wallet app itself. The wallet app does not directly fulfill or deliver the purchased digital goods. We would like to confirm whether this flow is subject to IAP policy enforcement, or whether using our own wallet payment method is permitted in this context, given that: The purchase is initiated within our app, The goods are digital but are fulfilled in a third-party service or app, And the wallet provider is not the developer of the destination app. We are happy to provide more details or a flow diagram if needed. Thank you
1
0
172
Jul ’25
About Guideline 2.1 - Performance in-app purchase functionality is not present
Over two months ago, one of my apps (My desktop web) was rejected during its first submission due to 2.1 - App Completeness. The reviewer said that the in-app purchase information was not visible, and that the purchase button showed “null(null)”. However, during both Xcode debugging and TestFlight testing, I was able to see all the in-app purchase information correctly. After multiple rounds of communication with the reviewer, the app was finally approved — although I never figured out why. It might be because I submitted the in-app purchase for review first, and then submitted the app itself. In any case, it was eventually approved. Now, I’m facing the exact same issue with my new app. The in-app purchase code is exactly the same (except for the Product IDs), but again, the reviewer cannot see the product information. The relevant line of code is very straightforward — I can successfully retrieve one product, but the reviewer sees zero: self.products = try await Product.products(for: [productId]) I’ve already contacted DTS, and they said: “You should make sure that StoreKit 2 effectively returns the display price and name of your product object and that these values still exist when you are about to display them.” Yes, I’ve verified that — I can see the in-app purchase information. But the reviewer cannot. I even scheduled a call and spoke with a reviewer based in San Jose, California. She confirmed that everything looks normal from the submission process side, and suggested I either check the app’s implementation again or continue working with DTS. One more thing I noticed: throughout the entire review process, the in-app purchase product always remains in the “Waiting for Review” state, no matter how the app's status changes. The reviewer said that’s expected behavior. At this point, I honestly don’t know what’s wrong anymore — I’m completely overwhelmed. Everything works perfectly in both Xcode and TestFlight, and I have no idea what else I can do to test or verify it. Xcode and TestFlight screenshot: Reviewer screenshot: Appstore connect:
13
0
462
Jul ’25
in-app purchases
I implemented consumable in-app purchases in an iPhone app using ProductView(). When I tap the payment button in ProductView(), I am taken to the payment screen and once the payment is completed the next code seems to be executed, so there doesn't seem to be a problem, but if I tap the payment button in ProductView() again, the next code is executed without taking me to the payment screen. This means that a single payment can be made multiple times. Can someone help? ProductView(id: "geminiOneMatch") .productViewStyle(.compact) .padding() .onInAppPurchaseCompletion { product, result in if case .success(.success(_)) = result { // 課金が成功した場合の処理 gemini.addOneMatch(amount: 20) popUpVM.geminiOneMatchPopUp = false dataManageVM.generateRespons(locale: locale) } }
0
0
222
Jul ’25