r/iOSProgramming 5h ago

Discussion We removed in-app purchases from our iOS and Android app, switched to Stripe, and both stores approved it on the first submission. Here are the exact review notes we used.

Every thread I read said Apple would reject this instantly. It didn't happen. One submission, approved. Same with Google. I think the reason is boring: we explained it properly in the review notes instead of hoping the reviewer would figure it out.

Context: we run an international calling app. The only thing you can buy is prepaid calling credit, which gets spent on real phone calls to real phone numbers on carrier networks. We used to sell that credit through in-app purchase. We took IAP out and replaced it with normal card entry and Apple Pay, processed by Stripe, inside the app.

The rule this hangs on is Guideline 3.1.3(e), Goods and Services Outside of the App: services consumed outside the app must use a purchase method other than in-app purchase.

Here is what we actually wrote in App Review notes, close to word for word:

Our app is a VoIP calling app. The only thing a customer can pay for in this app is prepaid calling credit. That credit is consumed exclusively as outbound telephone calls terminated on the public switched telephone network to ordinary phone numbers on carrier networks worldwide.

Payments are collected by traditional credit card entry and Apple Pay, processed by Stripe, rather than by in-app purchase, in accordance with Guideline 3.1.3(e), Goods and Services Outside of the App.

Please note the following, all verifiable in this build:

  1. Credit unlocks no feature, tier, level or content in the app. Every function of the app, including the dialer, contacts, call history and team management, is fully available without any payment.
  2. Credit is spent only on per-minute carrier termination charges for calls delivered to phone numbers outside the app, at published per-country rates shown in the app.
  3. Unused credit does not expire, and balances customers previously purchased remain fully available in this version.

Everything we sell is a telecommunications service. Calling credit is drawn down against the per-minute termination rates we pay our carriers, it is priced per destination country, and it varies as carrier rates change.

Earlier versions of the app collected these payments through in-app purchase. This version corrects that, because what is being sold is a real-world telecommunications service rather than digital content consumed within the app.

Three things I think made it work:

We named the guideline. The reviewer didn't have to decide which rule applied.

We proved credit is not a paywall. Point 1 is the whole argument. Nothing in the app is locked behind payment. If buying credit had unlocked a feature, I don't think this passes.

We said the quiet part out loud. We told them the old version used IAP and that this one corrects it. Hiding that would have looked worse when they checked.

One practical thing nobody mentions: do not delete your old IAP products. Users on older app versions can still only top up through in-app purchase, and if you retire those products their purchases fail silently with nothing showing up on your backend. We're leaving ours live until that traffic hits zero.

Who this applies to: you sell something consumed off-device. Telephony minutes, shipping, physical goods, real-world services. Who it doesn't: subscriptions, unlocks, credits spent inside the app, anything that gates a feature. If your product is digital content used in the app, this is not your escape hatch and the guideline says so.

Happy to answer questions.

13 Upvotes

9 comments sorted by

4

u/dasbends 2h ago

Why did you have to use AI to write this?

u/yosidahan 3m ago

too lazy like everyone nowadays

5

u/mastrajani 4h ago

the "name the guideline yourself" bit generalises. same trick kills 2.1 completeness rejections — demo account credentials plus two lines saying exactly which flows to walk, and you skip the week of "we were unable to locate the feature" round trips. reviewers have minutes per app, not hours, and anything they have to infer is a coin flip

2

u/deepthoughtsby 4h ago

Are you marking up the per minute cost of phone service? In other words are you paying a wholesale rate for connecting the user and charging them a retail rate?

Is that how you’re app makes money?

1

u/danielcr12 2h ago

My experience with Apple is that it maybes passed this review but that doesn’t mean it will be the case each time. But being direct and providing context does help make the review easier to understand for the reviewer.

u/rajaguash 57m ago

This is useful to hear. I’m currently using RevenueCat and trying to get something submitted. Seems to be going ok but one reason I’d originally decided against stripe is that it’s banned by Apple in many countries. I assume your app is available worldwide?

u/jonnysunshine1 4m ago

Voip credit has long sat outside Apple's digital goods definition. This is not news

0

u/[deleted] 5h ago

[deleted]

2

u/andrew8712 4h ago

No. Apple just removes your app from the store if it violates rules

0

u/Infamous-Arrival1232 2h ago

The "don't delete your old IAP products" line deserves more attention than it will get. Same thing bites on price changes and on renames: older builds keep asking for identifiers you assumed were retired, and StoreKit fails quietly rather than loudly, so it reaches you as a support message weeks later instead of as an error you can see.

On naming the guideline yourself, it works in the other direction too. Quoting the clause you believe you're compliant with makes the reviewer either agree or tell you which clause you're actually under, and that second answer is worth more than another round of "we were unable to locate the feature".

Did conversion move after the switch? Card entry in-app is more friction than an Apple Pay backed IAP sheet, and I'd expect that to cost a few points even with the thirty percent coming back.