Cross-Platform In-App Purchase

Hello, my name is Antony Basta and I am the developer of an app called SecuriKey. SecuriKey allows any old apartment building intercom to be controlled from an app. Users can create entry codes that work once, up to a certain date, or are instantly revokable. There is no need for any new or additional hardware – it works with the buildings existing intercom.

Currently, the app is using Stripe for subscriptions and it was initially approved 2 months ago for the App Store. I pushed an update a few weeks ago and Apple Rejected it because I am not using In-App Purchase (IAP). I submit an appeal, mentioning that we offer a consumable service that takes place outside of the app (guideline 3.1.3(e)), it is effectively a "Reader" app since we provide VoIP numbers to our customers (guideline 3.1.3(f)), and SecuriKey requires hardware to function – that is, it will not work without a physical intercom (guideline 3.1.4). Additionally, we do ship physical goods to our customers (NFC tags and Security Signs) monthly and require monthly service personnel to service the building using the physical goods for our own back end workflow. A lot of back and forth has occurred between the review team and at the time of this post, the app is still being reviewed by the board. I thoroughly believe we fit within all of the mentioned IAP exception guidelines – but that's a conversation for another day.

As I wait, I began to delve into using IAP for this product. I was able to jerry-rig the IAP platform to feed Stripe the necessary data through the notifications apple sends when a subscription is made, and I am able to create an account and collect a payment. But there's one huge oversight. This is a cross-platform app. Meaning, roommates or family members who use different mobile operating systems, can be logged into the same account. A user may sign up from the iPhone but his/her roommate/family member may have an android that also has access to the service under the same account. Thus, the android user will not be able to change the IAP subscription plan from the android side of the service. Furthermore, a web-portal is being developed, and using IAP will not allow us to modify the subscription via the web-portal either.

Has anyone ever dealt with something like this? How can you use IAP for a cross-platform application and allow android users to modify the subscription (Whether it be canceling, upgrading, or downgrading)?

I appreciate all comments and feedback as I wait on Apple's review board.

Bonus content: Without making my post too long, here is some bonus content about our processes and flows.

Sign Up: Customer Signs Up, Account is Registered on our back end, Associated Account and Payment methods are Registered With Stripe, Customer is subscribed via Stripe.

Usage: Customer is logged in (Android, iOS, or Web), Customer can make access codes, modify Stripe Subscriptions, and login information (This is synced across all devices since any platform can access stripe subscription data and make modifications).

Problem: If a subscription is made via IAP on iOS, android users and web-portal cannot modify account subscription as there are no server API's or calls that can modify IAP

In terms of maintaining status for a multi-platform service there are tools that can be used server to server to help address some of your concerns. One thing to note that is modifying the current subscription does require access to the Apple ID that completed the purchase and a valid platform to manage their subscriptions from: https://support.apple.com/guide/iphone/manage-purchases-subscriptions-settings-iph3dfd91de/ios

We have the existing verifyReceipt API and App Store Server Notifications (version 1) that can provide status in either pull or push model that use the StoreKit original app receipt and format. While a series of new Server API's available or releasing soon that use the original_transaction ID as the token and transactions utilize the JWS format to provide a more robust set tools, lookups, etc. for maintaining status in realtime server to server. News and doc updates coming soon. https://developer.apple.com/documentation/appstoreserverapi https://developer.apple.com/documentation/appstoreserverapi/get_all_subscription_statuses https://developer.apple.com/documentation/storekit/original_api_for_in-app_purchase/subscriptions_and_offers/enabling_app_store_server_notifications https://developer.apple.com/videos/play/wwdc2021/10174

Thanks for your response! You mentioned:

One thing to note that is modifying the current subscription does require access to the Apple ID that completed the purchase and a valid platform to manage their subscriptions from.

This is my exact road block. In a situation where a user signs up with IAP and then eventually switches mobile platforms or shares an account with an Android user, then the subscription is essentially stuck and stagnant. Neither I from my back end, nor the subscriber can change and modify the subscription from an android or any other platform other than the purchasing account. I guess obtaining the status of a subscription is not an issue, as this can even be done on the back end with a database, but the issue rather lies in modifying the subscription from a device that did not purchase it, but is, however, using the shared account.

I see that you're an engineer, and it's great to speak with another engineer. I would objectively state that it is not viable nor fair for Apple to push IAP on developers who provide a multi-platform service due to the fact that Apple themselves have not built out the infrastructure needed to manage these customers. I mean I can't even obtain an email from the purchase – how can customers be verified, contacted, or notified? I get that I can associate them with a transaction ID, but again, even with that, I'm unable to modify their subscription or even have them modify it outside of the on-device Apple UI. Stripe gives developers full control. Every customer has an account that is manageable from a dashboard, there's a plethora of web hooks for different scenarios, we can see who we are reaching and provide them with emails, physical goods, and extensions on late payments – even prorate subscription changes. Moreover, they provide us with full control with subscription management and integration (or at least advanced web hooks) for external services.

If Apple has indeed established a dashboard backend with API calls that allow developers to control and manage subscriptions outside of the Apple Ecosystem (whether that be UI or script) – such as Stripe – then we would have no problem using Apple's network. It would actually be preferred. However, without the tools, IAP for subscriptions is useless for multi-platform services and services that rely on external 3rd party companion services. It is limiting. IAP has it's time and place, and that's for game tokens and levels. For real-world services that have complex architectures and heavy reliance on additional backend platforms/services, it is no where near what other payment processing services can provide. And, until Apple has built out IAP with features that allow us to do this, providing a real-world subscription with IAP is not feasible. I know you probably cannot comment on this, but we know you agree.

Did you ever solve this?

Cross-Platform In-App Purchase
 
 
Q