Currently, I have an app running locally on my computer, and there is also a web app. To create an account, users need to pay through the web app, which handles the payment process smoothly. My question is: Do I need to implement In-App Purchases (IAP) if the payment is only for account creation?
Let me elaborate on my question. I know the typical answer is yes, but what if users in the mobile app cannot create an account or pay within the app itself? Instead, account creation is only possible via the web app, and only users who have paid outside the mobile platform can access and join the mobile app. This approach is similar to what Netflix and Spotify do – they do not allow account creation inside their mobile apps and do not provide any redirects or buttons indicating alternative payment methods (they do not have IAP).
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
If a user applies for and is approved for a subscription refund by Apple, we understand that the developer can receive a server notification of "REFUND."
However, this notification doesn't include the refund amount.
Therefore, we thought about linking the refund amount information output in the financial report "All Countries or Regions (Detailed)" with individual end-user transaction information.
However, it seems that this report doesn't have a transaction ID, and the records appear to be aggregated daily.
Is there any way we can find out how much was refunded to which user for individual refunds?
If a user applies for a subscription refund from Apple, are there cases where only a part of the plan, rather than the full amount, is refunded?
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit Test
StoreKit
App Sandbox
In an application feature where users can purchase resources to enhance the exposure, visibility, or engagement of specific content (such as boosting videos, posts, or other user-generated content), the price needs to adjust dynamically based on the user-selected budget. How can this type of In-App Purchase flow be implemented in iOS Swift?
Also checked link for tax category: https://developer.apple.com/help/app-store-connect/manage-app-information/set-a-tax-category
Hello everyone,
I want to set up subscriptions but I'm having problems testing them.
Indeed, when I use the storekit file to view the subscriptions it works, I see the subscriptions and I can subscribe in XCODE mode.
However, I'd like to go further and test with server notifications. So I removed the storekit file from the scheme, but I can't retrieve the products.
The application doesn't retrieve any products.. I've been stuck on it for 2 weeks... I checked the contracts and put in all the information last Friday and everything is validated.
I tested it in testflight mode, and it doesn't recognize any products!
Just so you know, I use the original API for maximum compatibility.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
App Store
StoreKit
In-App Purchase
App Store Receipts
Hi,
I have 6 subscriptions in a subscription group. Each subscription has 2 active promotional offers configured. One is with a 25% offer for a month and another one is a 50% offer for a month.
My doubt is, can users access both promotional offers in a single subscription? Not at a time
First 25% offer and then 50% offer
I am working on a paywall, and SubscriptionStoreView seems to work just fine when using the XCode environment but goes bonkers when using Sandbox. Specfically, after making a subscription, I don't get the "Your plan" flag, and the subscription buttons fail to do anything. Hitting one of those the app just sits there....mocking me with its silence.
"Clear purchase history" does nothing when done either the iPhone or the Sandbox account page on the website. Nor does the subscription seem to expire after the expiration time of 3 minutes that I am using.
Anyone else see this? is this similar to the TestFlight issues people had a year ago?
Topic:
App & System Services
SubTopic:
StoreKit
Hi everyone,
I’m currently integrating auto-renewable subscriptions in my React Native app, and I’m encountering an issue with the StoreKit2 API.
What Works
I’ve successfully implemented in-app purchases, and I can purchase auto-renewable subscriptions without any issues. After the purchase, I’m receiving the following transaction details:
``{
"originalTransactionDateIOS": 1732733802000,
"originalTransactionIdentifierIOS": "2000007891139879",
"productId": "product.id",
"transactionDate": 1732748202000,
"transactionId": "2000007935522994",
"transactionReceipt": "xxxxxxxxxxxxCwIBAwIBAQ"
}``
The Problem
When I send the transactionId to my server and call either getTransactionHistory or getTransactionInfo using the App Store Server API, I always receive an empty array as the response.
Additionally, I’ve tried testing with StoreKit Testing in Xcode, but I consistently get 0 as the transactionId, which makes it impossible to verify the transactions.
Here’s what I’ve done so far:
I’m using a sandbox account for testing.
The subscription purchase flow works, and the transactionId is successfully retrieved in the app.
I’ve double-checked that the transactionId sent to the server matches the one from the app.
Thanks in advance!
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
StoreKit Test
App Store Server API
Starting a few months ago, we noticed that we are receiving sign-ups to our application using Sandbox accounts. These accounts were not created by us, and certainly do not show up under Sandbox users on App Store Connect.
When we setup In App Payment, our server side validation followed the guidance to always allow sandbox receipts (see https://developer.apple.com/documentation/appstorereceipts/verifyreceipt).
I think we assumed that only Sandbox users that we setup in App Store connect would be allowed to be used with our app. Another assumption was that Apple reviewers could create Sandbox accounts to use to test our IAP sign-up during app review.
How are other developers preventing fraudulent sign-ups from sandbox accounts? Has something changed with In App Payments this year related to sandbox accounts?
I’m trying to get approval for an update to my app to transition from paid model to IAP subscription. This is my first time submitting an app with IAP. This is my current state:
App submission shows rejected
IAP subscriptions show "Development action needed"
Localization (for all subscription plans) was showing "Rejected"; I updated (only) the review notes for each subscription plan, and now the status for the localization of each subscription is "Prepare for submission" (the status for each subscription is still "Development action needed")
I'm at a loss for what needs to be done, and in what order. Sandbox testing has been working fine all along.
1 - I noticed my submitted binary was missing the "In-App Purchase" capability in Xcode (under target capabilities). Could this be the reason? Is this even needed? I am surprised that weeks of sandbox testing without the IAP capability added in Xcode has been working fine.
2- I seem to be in a chicken and egg situation,
Do I need to submit localizations first for review and how? Do I need to submit the subscriptions first for review and how?
It seems modified/new localizations need approved subscriptions, and new/modified subscriptions need an approved app with IAP support first, is this correct understanding?
As I mentioned, in the current state, I can see the app working fine with sandbox testing
Appreciate any help with step-by-step instructions to get past the review.
Topic:
App & System Services
SubTopic:
StoreKit
I'm developing storekitV2, my app is providing the way to refund some product, and I use method below.
func beginRefundRequest(in scene: UIWindowScene) async throws -> Transaction.RefundRequestStatus
however when i call the method, the modal view presented but the view shows error with message 'cannot connect'. when I select retry button, something done with indicator and get same result.
how can I solve this problem?
I'm developing StoreKitV2 and my app provides in-app management of subscription. so I use AppStore.showManageSubscriptions method.
@MainActor
static func showManageSubscriptions(in scene: UIWindowScene, subscriptionGroupID: String) async throws
the document(https://developer.apple.com/documentation/storekit/appstore/showmanagesubscriptions(in:subscriptiongroupid:)) says
"Presents the App Store sheet for managing subscriptions for a subscription group." but actually It shows the list of subscription groups.
I wanna show the list of subscription options(products) of certain subscription group directly.
how can I??
Hi! Could you please clarify when and why the subscription auto-renewal rate in TestFlight was changed to a daily cycle? Now, the subscription lasts for 6 days! This is causing significant issues in testing. Previously, the 5-minute auto-renewal for weekly subscriptions was an excellent solution.
Is there a way to adjust the auto-renewal timing for an account in TestFlight?
Documentation link: https://developer.apple.com/help/app-store-connect/test-a-beta-version/subscription-renewal-rate-in-testflight.
Thank you for your clarification!
Hi, I have deployed my app on Test Flight, I have two subscriptions, monthly and yearly. User can have one of them at a time and upgrade, downgrade to the other. Upgrade, downgrade, cancel from the Apple Settings worked fine in the sandbox environment when testing locally. Now when I have deployed the app on TestFlight, I was able to purchase the subscription successfully from my app. Now when I want to cancel my subscription from the Apple Settings it gives me the following error after confirming cancellation, 'Your request is temporarily unable to be processed. Please try again later.' Also the other subscription offer (yearly) is also not shown to which I could upgrade, even though in the sandbox I was able to upgrade downgrade from the settings. Another thing I have noticed is that the app Icon or name is not shown anywhere in settings with the subscription. Instead of app icon only empty square is shown. Even though app icon shows fine everywhere else.
Can someone please help me figure out this issue?
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
In-App Purchase
TestFlight
App Store Server API
i m integrate App Store Server Notifications for External Purchase Server API
The documentation says:
For external purchase tokens that are unreported after 10 days, Apple sends a server notification to your server
https://developer.apple.com/documentation/externalpurchaseserverapi#Receive-notifications-for-unreported-tokens
I have a doubt.
After I'm generating an external purchase token (sandbox), apple notify me 4 times in next 2-3h, even they say, they will notify me after 10 days for unreported tokens.
Mention: Response for notification call was 200
token_create: 13:18
notification_1: 13:58
notification_2: 14:38
notification_3: 15:08
notificaiton_4: 15:38
"notificationType": "EXTERNAL_PURCHASE_TOKEN",
"subtype": "UNREPORTED",
I have no clue what's happening
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
App Store Server Notifications
App Store Server API
Hello, I've been trying to get the sandbox environment working for in-app purchases, but so far, no luck. I can use a storekit config file to simulate purchases just fine. The item is a single consumable product.
I've checked that my product ID matches, followed the advice tendered to other forum users, created a sandbox user, all to no avail.
I've signed into the app store using my sandbox account on one phone - I can't get the "Sandbox User" option to appear on the second after attempting to make a purchase (per https://developer.apple.com/documentation/storekit/testing-in-app-purchases-with-sandbox ).
What I'm wondering is, do I need to get the in-app-purchase approved/released through App Review before I can even perform testing or something? I've signed all agreements, set up our banking information, everything seems to be in order, but I just cannot get the StoreKIt products call to return anything. ( let products = try await Product.products(for: productId) )
Is there anything else I can check? I've also checked everything here: https://forums.developer.apple.com/forums/thread/652077
Thanks!
Hi everyone,
I'm encountering an issue with StoreKit 2 and subscriptions that I hope someone can help clarify.
Here's the scenario:
A user purchases a subscription.
The user cancels the subscription in their Apple ID settings (it remains active until the end of the billing period).
While the subscription is still active, the user reopens the app and tries to repurchase the same subscription.
The problem:
The purchase() method start well a new billing flow, but once confirmed throws a StoreKitError.unknown.
Despite this error, the subscription gets re-enabled and appears active again in the currentEntitlements.
So my question is why the purchase method throw an error and how to deal with this case ?
I precise I'm currently only working in sandbox, maybe the behavior is different in production (but even in that case there is still a bug in Sandbox that should not happen).
Also in that case the Apple Server Notification API send the webhook with type DID_CHANGE_RENEWAL_STATUS (and subtype AUTO_RENEW_ENABLED), which is expected.
Thanks for help,
Gregoire.
My App payment encountered a unkonw((StoreKit.StoreKitError) error = unknown) error in iOS18.2, then the lldb log "Could not find a visible window in the scene for *** purchase."."***" is purchase product id.
Why does this error occur, and how can I fix it?
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.
Payment completed with error: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={client-environment-type=Sandbox, storefront-country-code=USA, NSUnderlyingError=0x2828a5950 {Error Domain=AMSErrorDomain Code=305 "Purchase Failed" UserInfo={NSLocalizedDescription=Purchase Failed, AMSURL=https://sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy?guid=00008030-000164513691402E, AMSStatusCode=200, AMSServerPayload={
"cancel-purchase-batch" = 1;
customerMessage = "Bad Gateway_message";
failureType = "";
"m-allowed" = 0;
pings = (
);
}, NSLocalizedFailureReason=Server canceled the purchase}}}
Topic:
App & System Services
SubTopic:
StoreKit
A user made an in-app purchase on December 15th at around 4:00 PM Japan Standard Time (JST). However, the confirmation email sent after the purchase shows the receipt date as December 14th.
What could be causing this discrepancy in the date?
The app store's primary language is set to English.
The server region is singapore.
Topic:
App & System Services
SubTopic:
StoreKit