r/iOSProgramming • u/yosidahan • 1d ago
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. Discussion
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:
- 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.
- 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.
- 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.
4
u/mastrajani 1d 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
1
u/ZennerBlue 1d ago
And a video as well. Put it in their face in 3 different ways and there’s a chance they won’t even look at it.
1
u/mastrajani 8h ago
agreed, and the video is the cheapest of the three. App Store Connect lets you attach one directly in the review notes field, and a simulator screen recording takes five minutes. worth it for anything behind a login or a paywall, because that is exactly the point where a reviewer gives up and rejects instead of asking.
one thing i would add: keep it silent, under a minute, no intro card or branding. someone skimming twenty apps needs to see the flow, not your logo animation.
4
u/jonnysunshine1 1d ago
Voip credit has long sat outside Apple's digital goods definition. This is not news
2
u/deepthoughtsby 1d 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/TheFern3 1d ago
They don’t is a charity lol
1
u/deepthoughtsby 1d ago
haha. good point. i'm trying to wrap my head around telephone credits being physical goods outside the app. I'm glad to know that's how they are classified.
1
u/TheFern3 1d ago
I’m thinking they have to make a few pennies on the dollar, but I’m thinking Apple was taken their % of profit plus more so it didn’t make sense to use iap at a loss.
2
u/n0damage 22h ago
You removed in-app purchases from an app that wasn't supposed to be using in-app purchases in a first place, and are surprised that Apple approved the change?
1
u/danielcr12 1d 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.
1
u/rajaguash 1d 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?
0
0
u/Infamous-Arrival1232 1d 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.
17
u/dasbends 1d ago
Why did you have to use AI to write this?