App rejected from iOS app store - Business: Payments - In-App Purchase

Our app has been rejected on the iOS app store. On a call with Apple they told me that our app binary has in app subscriptions included in it.
I have no idea where this is coming from, because we don’t use in app purchases on the app and have never enabled it. Seems like it could only be coming from Expo.

Has this happened to anyone else? Any ideas how to fix?

The subscriptions we apparently have in the binary are:

custom 1 year subscription - $28.99
custom 6 month sub - $20.49
custom 1 month sub - $4.99
auto renewable subscriptions

I have no idea where these are coming. It’s not from our code.

We’re on Expo 33.

The message in the chat from Apple (which seems to be different to the information they were giving me on the phone):

We noticed that your app offers a subscription with a mechanism other than the in-app purchase API.

Specifically, you offer subscription plans to unlock digital content and services with a payment mechanism other than in-app purchase.

Next Steps

To resolve this issue, please revise your app to ensure that the subscription for products used within the app is offered using the in-app purchase API, with the exception of the content specified in guideline 3.1.3 of the App Store Review Guidelines.

Hey @elie,

I have yet to see another report of this and while sifting through the source code, I couldn’t find those values any where. Just to clarify, is this a managed project or ExpoKit project?

Cheers,
Adam

It’s a managed project.

Is there anyway to fully remove in app purchases from the expo bundle?

Hey @elie - we just talked about this and are pretty sure IAP info isn’t included in the js bundle nor is in the binary (the intent is def for standalone apps to include only what you’ve pulled in), and generally subscription stuff is set up through appstore connect, but we’re going to search for those specific prices, etc., to make sure there isn’t something curious going on unintentionally. And we’ll double check our app store connect setup as well. It would be great if you could do this on your end too (scan js, scan app connected, etc).

Grepping the Expo codebase, there are no mentions of 28.99, for example. Also, IAP prices are set up in App Store Connect and aren’t part of the client binary AFAIK, and the test IAPs in one of our test apps have prices different than the ones you posted. And Apple’s message seems to indicate the issue is that the app has subscriptions of some type and is not using IAPs. I would inspect the contents of your binary and ensure there are no IAPs on App Store Connect to figure out what’s going on.

Ya. I am very confused about all this. I wouldn’t be surprised if this was a mistake by Apple either. Although they were adamant on the phone it’s part of my binary. I will do another search through our codebase.

Do you know if there’s an easy way to search through a binary for these values?

I took a look in my iTunes connect and have no IAPs listed.

Are the subscriptions mentioned at all similar to the expo demo app? If not the exact pricing, does the demo app include 3 subscription tiers of 1 month, 6 months and 1 year?

I would just use strings on the binary or something similar, nothing special about Expo. The subscriptions are different than the ones on the Expo demo app, which has only two subscriptions (one auto-renewable and one non-renewable) and two non-subscription items.

Do you have anything to do with money in your app? If you let people purchase digital goods or link to a website where they can purchase digital goods, that may cause the rejection. (You cannot rent a video in the Amazon Prime Video nor even get a link to Amazon’s website to rent the video for this reason.)

We do offer subscriptions on the website and we understood originally that was the problem. But eventually we were told on the phone that we had subscriptions in our binary but it wasn’t mentioned in our terms and conditions for the App Store and the specific subscriptions we include I wrote above.

I may try a new build and see if it helps if I can’t find the issue in our code.

“The binary” might not literally mean the ARM code. The reviewer may have found subscriptions in your app (even if they are in a web view or a link to Safari) and found they were not using IAPs.

We got rejected again. Going to get on another call with them. This is the full rejection:

From Apple

    1. 1.1 Business: Payments - In-App Purchase

Guideline 3.1.1 - Business - Payments - In-App Purchase

We noticed that your app offers a subscription with a mechanism other than the in-app purchase API.

Specifically, you offer subscription plans to unlock digital content and services with a payment mechanism other than in-app purchase

Next Steps

To resolve this issue, please revise your app to ensure that the subscription for products used within the app is offered using the in-app purchase API, with the exception of the content specified in guideline 3.1.3 of the App Store Review Guidelines.

Request a phone call from App Review

At your request, we can arrange for an Apple Representative to call you within the next three to five business days to discuss your App Review issue.

Request a call to discuss your app’s review

In-App Purchase

It may be appropriate to revise your app to use the in-app purchase API to provide content purchasing functionality.

In-app purchase provides several benefits, including:

  • The flexibility to support a variety of business models.
  • Impacting your app ranking by consolidating your sales to one app rather than distributing them across multiple apps.
  • An effective marketing vehicle to drive additional sales of new content.

For information on in-app purchase, please refer to the following documentation:

In-App Purchase for Developers

In-App Purchase Programming Guide

For step-by-step instructions on in-app purchase creation within App Store Connect, refer to App Store Connect Help.

I would search both your production JS bundle and your Mach-O binary for any case-insensitive mention of payment-related words and processors.

Additionally if your UI lets people pay money, that would be a potential issue. If you do talk to an app reviewer it might help to ask for the steps they took to find the subscriptions.

If this helps (or doesn’t) my Expo iOS app got accepted into the App Store… so it seems this is an isolated case.

I think the real issue is that we have subscriptions on the website, even though our call with them explained it as something else.
They’ve been incredibly unhelpful and so difficult to get on them on the phone again. They randomly call me up without scheduling and always goes to voicemail when I call back. So after weeks of trying I still can’t confirm for sure what the real issue is :cry:

Final update: the real issue was that we have subscriptions offered on our website and not on the app.

The previous phone call with Apple led us completely astray. I still have no idea where they got the numbers from that I mentioned in my original post.

Glad you got to the bottom of things, Elie. Even though Apple tends to make that as difficult as possible haha.

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.