Subscriptions

RSS for tag

Give users access to content, services, or premium features in your app on an ongoing basis with subscriptions, a type of in-app purchase.

Posts under Subscriptions tag

200 Posts
Sort by:

Post

Replies

Boosts

Views

Activity

Cannot Receive `EXPIRED` Notifications from App Store Server Notifications V2
Hello, I am currently implementing server-side handling for in-app subscription payments and using App Store Server Notifications V2 to receive notifications with a TestFlight account. However, I am not receiving EXPIRED notifications, although I am successfully receiving other notifications such as SUBSCRIBED, DID_RENEW, and DID_CHANGE_RENEWAL_PREF. Here are some details of my observations: Until a certain point, I was receiving EXPIRED notifications without any issues, but they stopped coming in after that point. Each subscription renews every 3 minutes in TestFlight account, and I receive DID_RENEW notifications 7 to 12 times. According to the official documentation, the subscriptions should renew up to 12 times, but I am not receiving exactly 12 DID_RENEW notifications. This inconsistency might be related to the issue. Other notifications (SUBSCRIBED, DID_RENEW, DID_CHANGE_RENEWAL_PREF) are received without any issues. Could anyone provide insight into why this might be happening and suggest any alternative methods to handle subscription expirations in case the EXPIRED notifications are not reliable? Thank you for your assistance. Relevant Official Documentation App Store Server Notifications V2 App Store Server Notifications V2_notificationType Testing in-app purchases with sandbox Current Server Implementation Below is the Kotlin Spring Boot server code currently implemented for handling App Store Server Notifications V2: @RestController class ProductIosController( private val productIosService: ProductIosService, private val appStoreNotificationService: AppStoreNotificationService, ) : BaseController { @PostMapping("/api/v1/ios-products/app-store-notifications-v2") fun handleNotification(@RequestBody @Valid notification: AppStoreNotificationRequest): CustomResponse { appStoreNotificationService.processNotification(notification) return CustomResponse.ok() } } @Service class AppStoreNotificationService( @Qualifier("appStoreClient") private val appStoreServerAPIClient: AppStoreServerAPIClient, @Qualifier("signedVerifier") private val signedDataVerifier: SignedDataVerifier, ) { @Transactional fun processNotification(notification: AppStoreNotificationRequest) { logger.info("signedPayload: ${notification.signedPayload}") val decodedPayload = verifyAndDecodeSignedPayload(notification.signedPayload) val notificationType = decodedPayload.notificationType val signedTransactionInfo = decodedPayload.data.signedTransactionInfo val transaction = signedDataVerifier.verifyAndDecodeTransaction(signedTransactionInfo) val (user, product) = fetchUserAndProduct(transaction) when (notificationType) { SUBSCRIBED -> processSubscriptionPurchase(user, product, decodedPayload, transaction) DID_CHANGE_RENEWAL_PREF -> processSubscriptionGradeChange(user, product, decodedPayload, transaction) DID_CHANGE_RENEWAL_STATUS -> processRenewalStatusChange(transaction) OFFER_REDEEMED -> processOfferRedeemed(transaction) DID_RENEW -> processSubscriptionRenewal(user, product, decodedPayload, transaction) EXPIRED -> processSubscriptionExpiration(user, product) DID_FAIL_TO_RENEW -> processFailedRenewal(transaction) GRACE_PERIOD_EXPIRED -> processSubscriptionGracePeriodExpiration(transaction) PRICE_INCREASE -> processPriceIncrease(transaction) REFUND -> processSubscriptionRefund(transaction) REFUND_DECLINED -> processRefundDeclined(transaction) CONSUMPTION_REQUEST -> processConsumptionRequest(transaction) RENEWAL_EXTENDED -> processRenewalExtension(transaction) REVOKE -> processSubscriptionRevocation(transaction) TEST -> processTestNotification(transaction) RENEWAL_EXTENSION -> processRenewalExtension(transaction) REFUND_REVERSED -> processRefundReversed(transaction) EXTERNAL_PURCHASE_TOKEN -> processExternalPurchaseToken(transaction) else -> logger.warn("Unsupported notification type: ${notificationType.value}") } }
1
0
80
8h
Restrict In-app purchase offering based on location
I'm developing an application where user can access contents based on In-app purchase subscription.As per the app requirement I want to restrict user from accessing the content when they try to access from a different country. Example: Being a user I brought subscription while I was in India by paying lets say 10$ instead of actual 20$ (50% discount for India users). Lets say I am travelling to other country and in order to use the content user now has to pay the remaining 10$. As per apple's policy is this allowed? , if yes, then how to achieve this.
2
0
63
2s
Apply increased price to existing subscribers
Hi, We previously scheduled a price change (which did NOT affect existing subscribers) however months later, we have now made a decision to apply the increase to all subscribers. As the price has not increased, I only see the option to preserve and isn't obvious if this has any effect on those grandfathered in the lower price. Can anyone confirm or must I increase the price again?
1
0
60
1d
How to obtain valid subscription information in the App?
I have an APP with its own user system. I configured subscriptions in the Apple Store and divided them into levels 1 and 2. User logs in to the App Store with apple id A, then logs in to my APP with account A1 and subscribes to level 1 subscription. At this time, he switches to the App Store, switches apple id to B, then returns to my APP (the APP user is still A1 at this time), finds the previous subscription and upgrades it. At this time, apple ids A and B will be charged for subscription at the same time. I need to restrict this operation. My solution is to obtain the user's current valid subscription from the App Store when upgrading. If it cannot be obtained, the user is prohibited from upgrading. However, I only found "Restoring purchased products" from Apple's documentation. This document only explains how to restore completed transactions and cannot be called frequently. Are there any other solutions or APIs?
0
0
49
2d
Canceled 3.1.2 Subscriptions
Hello Could you please tell me what's wrong? I am publishing my application for the first time. I have already put Terms of Use in the application settings. What is missing? Guideline 3.1.2 - Business - Payments - Subscriptions 3.1.2(c) Subscription Information Before asking a customer to subscribe, you should clearly describe what the user will get for the price. How many issues per month? How much cloud storage? What kind of access to your service? Ensure you clearly communicate the requirements described in Schedule 2 of the Apple Developer Program License Agreement. Issue Description The submission did not include all the required information for apps offering auto-renewable subscriptions. Apps offering auto-renewable subscriptions must include all of the following required information in the binary: Title of auto-renewing subscription, which may be the same as the in-app purchase product name Length of subscription Price of subscription, and price per unit if appropriate Functional links to the privacy policy and Terms of Use (EULA) The app metadata must also include functional links to the privacy policy and Terms of Use (EULA). Next Steps Update the app's metadata to include the following required information: A functional link to the Terms of Use (EULA). If you are using the standard Apple Terms of Use (EULA), include a link to the Terms of Use in the App Description. If you are using a custom EULA, add it in App Store Connect.
2
1
134
2d
Which offer type to use for seasonal discounts?
Hi, I would like to run a seasonal discount on my app and offer -30% off for subscribing for the first year to all new and lapsed users. I can achieve that in two ways: Create a new Subscription with an Introductory offer (for the new users). And add a Promotional offer to existing subscription (for the lapsed users). or Add Offer Code to existing subscription. Make it available for new users and previous subscribers. It seems that both ways produce the same result, which one should I prefer? Are there any caveats to them? Thank you!
1
0
159
1w
Re-enabling cancelled subscription before the expiry date
My app has a single subscription group called Premium that contains two products with different billing periods - monthly and yearly. All tests are made in Apples's Sandbox environment with sandbox user. I am currently testing a scenario, where the user is subscribed to the monthly product, subsequently cancels the subscription from the App Store subscriptions page, and before the subscription expires, he wants to re-enable it (same monthly product). If the subscription is re-enabled from the App Store subscriptions page, my server gets a notification about the changed subscription renewal status and everything works well. This scenario is documented at the bottom of the page here: https://developer.apple.com/documentation/storekit/in-app_purchase/testing_in-app_purchases_with_sandbox/testing_disabling_auto-renew#3780478 I however also want to support the scenario where the user can re-enable the subscription before it expires from the app itself. To do so, if the subscription is cancelled, but not yet expired, I show the user a button Re-activate. When this button is clicked, I initiate a purchase of the same monthly product, the IAP correctly shows the payment sheet and once I click Subscribe in the In App Purchase payment sheet, it goes through without any issues. However, my app subsequently receives a callback that the purchase failed: <SKPaymentQueue: 0x280f1fa10>: Payment completed with error: Error Domain=ASDErrorDomain Code=500 "Unhandled exception" UserInfo={NSUnderlyingError=0x2803a4720 {Error Domain=AMSErrorDomain Code=301 "Invalid Status Code" UserInfo={NSLocalizedDescription=Invalid Status Code, AMSURL=https://sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy?REDACTED, AMSStatusCode=500, NSLocalizedFailureReason=The response has an invalid status code}}, NSLocalizedFailureReason=An unknown error occurred, NSLocalizedDescription=Unhandled exception} This seems like the purchase failed with invalid status, but strangely enough, my server receives a notification that the subscription renewal status was changed to AUTO_RENEW_ENABLED and if I check the App Store subscriptions, I can see that its not cancelled anymore. The subscription also gets renewed at the end of the billing period, where it would have otherwise been cancelled. So in other words, everything seems to work except the purchase error above. My question is, what could be the reason for this? Perhaps Apple does not support re-enabling subscription directly from the App, but only from the App Store subscription page? Or perhaps its just a limitation of Apple's sandbox environment and I would not receive this payment error in production environment?
0
1
127
1w
Reject: 2.1.0 Performance: App Completeness Bug description: Specifically, no action occurred after completing in-app purchase.
Hello. I received a rejection on a new application in the first release for some unknown reason: 2.1.0 Performance: App Completeness Bug description: Specifically, no action occurred after completing in-app purchase. and a screenshot of the paywall with products (prices). My products load from RevenueCat, and when tested in TestFlight, there are no issues. Please tell me what could be the problem?
1
0
133
1w
free trial for xx days
good morning everyone, I have a problem of understanding, my app unlocks content after registration, we offer a trial period of xx days to allow new users to use the full version at the end of these days if they want to continue using the full app they have to register without any payment. The app release documentation mentions a xx-day trial period in the Payments section: Apps without a subscription may offer a free time-based trial period before presenting a full unlock option by configuring a non-consumable IAP item at price level 0 that follows the naming convention: “XX-day trial.” Prior to the start of the trial period, the app must clearly identify the duration, content or services that will no longer be accessible at the end of the trial period, and any downstream costs that the user will have to pay for full functionality. should we also use the IAP method even though there is never any mention of purchase but only registration ? thank you in advance for your help
3
0
149
2w
More then 2 business day apple still not contact to charge money for enroll program
Im very socked after waiting more when 2 days and still no one contact whit me for charge money for enroll program. Support on apple is same worst write 1-2 business days 2 week not have reply. Im thing google is bad but him support reply 5-6 hrs and have live chat but apple nothing, no phone, no live chat only email and no one look at it. First im download apple dev im try to enroll from app im scan personal ID and im going on step to pay im add debit card in apple id all information ok when try to pay write unknown error contact whit itunes. im delete card from apple id im add again but option from enroll in app is missing and im do whit website and write we contact 2 business days. 1 week pass.
1
0
162
2w
Custom hardware with companion app, question with Subscriptions
I have a question regarding in-app purchasing and subscriptions for an app that interfaces with a custom hardware product. Say there is a custom electronic product that communicates over BLE to an app. The custom hardware is sending different types of sensor data collected on the device to the ios app and that data is stored on a backend. If the mobile app plans to have a paid subscription, but still allow users to use the app without a paid subscription but simply limit access to view some of that collected data (for example, locked/greyed out screens or limits features available in the app), does that fall under the IAP requirements of Apple? In the described case, would Apple mandate the app use the App Store's in-app purchasing system and take the 15-30% cut for the paid subscriptions? Or does that not apply since the data is collected by a custom hardware product? I am a little unclear on this. Any guidance would be appreciated.
0
0
172
2w
Troubleshooting Subscription Button Visibility and Functionality Issues in TestFlight and App Store Connect
Below, I have a button designed to facilitate the purchase of a subscription, which depends on the availability of the subscription in App Store Connect. This button is visible when testing locally using a StoreKit Configuration File synced from App Store Connect, and I have linked my subscription to my app in the information section. Currently, my app is in a "waiting for review" status, and the subscription is marked as "developer action needed - rejected." However, this issue of the button not appearing persisted even when the subscription was previously in the "waiting for review" status, indicating that the problem may not be related to the subscription status. I'm encountering an issue where the 'request products' function returns no results in the TestFlight environment, even when using a sandbox Apple ID. This problem has led to repeated rejections of my app, as testers are unable to verify its functionality. What could be causing these issues? VStack { if storeVM.subscriptions.isEmpty { if storeVM.isLoading { ProgressView("Loading subscriptions...") .progressViewStyle(.circular) .scaleEffect(2.0) .padding() } else if let errorMessage = storeVM.errorMessage { Text("Error: \(errorMessage)") .foregroundColor(.red) .padding() } else { Text("No subscriptions available") .padding() } } else { ForEach(storeVM.subscriptions, id: \.id) { product in Button(action: { Task { await buy(product: product) } }) { HStack { Spacer() Text("Unlock 3-day free trial. \nThen $23.99 per year. Cancel anytime.") .font(.custom("Lora-VariableFont_wght", size: 20)) .foregroundColor(.white) .lineSpacing(5) Spacer() } } .padding() .background(Color.black.opacity(0.6)) .cornerRadius(10) .padding(.horizontal, 10) } } .onAppear { Task { await storeVM.requestProducts() } } func requestProducts() async { isLoading = true errorMessage = nil do { subscriptions = try await Product.products(for: productIds) isLoading = false } catch { print("Failed product request from App Store server: \(error)") isLoading = false errorMessage = "Failed to load products" } }
3
0
192
3w
Provide Seat based charging with InApp Purchase
Hi, as I checked now multiple threats in the internet I cant find a solution to solve the Problems with the Apple Guidelines. Our Business Model is based on pay per user. As Apple rejected our App due to not compatible guidelines I cant figure out how to implement pay per user with InApp Purchase. Because I cannot find a solution to increate the subscriptions because you can only have 1 Subscription per Account. I cant increase the subscription amount nor adjust prices of the subscription when they invite a user for example. I really need help to figure out how to solve this type of issue. I appreciate any hints how I could solve this.
0
0
157
3w
List All Subscriptions for a Subscription Group: "subscriptionAvailability" is not a valid relationship name
I try to fetch subscriptions with included relationships according to the documentation GET https://api.appstoreconnect.apple.com/v1/subscriptionGroups/12345678/subscriptions?include=[ "appStoreReviewScreenshot", "group", "introductoryOffers", "offerCodes", "prices", "promotedPurchase", "promotionalOffers", "subscriptionAvailability" ] The form of include field is taken from the official OpenAPI spec In the response I get a bunch of errors What am I doing wrong? { "errors": [ { "id": "0c02ac40-47c6-4107-b725-930e938a587f", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "'[ \"appStoreReviewScreenshot\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "cf2e214a-cab7-4e63-8971-d8974b0903f6", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"group\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "56d7e72f-cf29-4fac-9456-79074e294567", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"introductoryOffers\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "abdaf783-9a95-4053-a614-bcee7aedab45", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"offerCodes\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "53270b6c-f0f5-4d18-9004-2c99ce9905bd", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"prices\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "9676075f-d2fb-493e-b093-c973e3b103d2", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"promotedPurchase\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "451dd333-1c75-4e22-90e1-40c6532fa465", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"promotionalOffers\"' is not a valid relationship name", "source": { "parameter": "include" } }, { "id": "b0afb70e-ab6a-4aa3-9840-3e94844d3385", "status": "400", "code": "PARAMETER_ERROR.INVALID", "title": "A parameter has an invalid value", "detail": "' \"subscriptionAvailability\" ]' is not a valid relationship name", "source": { "parameter": "include" } } ] }
1
0
174
3w
App Store Connect Review Information Screenshot
In order to submit my new subscription for review I need to upload a screen. No matter what resolution image I upload it fails saying "Your file could'nt be save. Try again if the problem persists, contact us" I am using many different types of simulators (Iphone 15 - Iphone Xs) and physical devices to take a screenshot and nothing is accepted. I can see the error message being returned from apples API is "IMAGE_BAD_DIMENSIONS_SM_LESS_MIN" so assume its a resolution issue. I am following the current guidelines here: https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications
0
0
150
4w
Creating in-app subscription products via the API
Hi, I am implementing in-app subscriptions in my application and would like to set up a module in my admin portal by which I can create subscription products via my custom module. For this purpose I need API's that allow me to create subscription products. Please let me know if such a solution is possible, if it is, then please share the API's and payload by which I could implement it. Thank you in advance.
1
0
176
4w