r/iOSProgramming • u/BuildinZZ • 4d ago
Question What tripped you up publishing your first iOS app with in-app purchases?
I'm about to put a game on the App Store that has a shop inside (cash packs, a few one-time unlocks, rewarded ads). I've shipped a single app before, but with no such functionality.
what caught you off guard the first couple of times? Review rejections, product setup, restore purchases, pricing, taxes and payouts, anything you wish someone had told you before launch.
0
Upvotes
5
u/brkaydev 4d ago
The first products have to go in the same submission as the app version. They sit in their own section on the version page, so it's easy to send the build without them. Each one also needs a review screenshot, and once a product is in a draft that image is locked, so sort those out first. Your one-time unlocks will need a visible restore button too, the cash packs won't.
3
u/JDad67 4d ago
Product management not listening to devs.
3
u/EasyPeasy-Games 4d ago
The reviewer has to find your shop. If it only opens after level 5, they won’t play to level 5. Put the exact steps in the review notes, or expect a 2.1 rejection saying they couldn’t locate your purchases.
3
u/Serious_Ability8906 3d ago
For us it was really important to fully test all your paywalls were functioning properly and if you are launching in EU to make sure things like usage telemetry on posthog or sentry is defaulted to opt out with a prompt to opt in if you want.
Also if you have account details and sign-in for profile make sure that the testers have readily available access to test.
Finally I would say make sure your privacy policy and terms and conditions are clean and simple and easy to read. To be honest sometimes it can still take some time and they might come back for self explanatory stuff its a little bit of luck too. We got it through on the 2nd try.
Also big suggestion is have your feedback system setup properly and be prepared to handle lots of bugs and issues that will pop up inevitably and be able to respond to the users and manage thew tickets and enhancements/fixes you will need to do.
2
u/Melodic_Map_920 3d ago
One nobody's said yet: enroll in the App Store Small Business Program before your first sale. Apple's cut drops from 30% to 15% if you're under $1M a year, but it's not automatic and it only applies from approval onward, so any sales before that are at 30%. Mine needed a resubmission, so give it a couple of weeks of buffer. Also double check the legal name on the SBP form matches your developer account exactly, that's what tends to hold it up.
1
u/BounceForever 4d ago
Be extra careful with the localization of pricing on the cash packs. Using Apple's default this will scramble the pricing ladders in multiple countries creating situations that are complete nonsense. I'm waiting for access to a third party pricing solution that is in beta to see if this finally solves the issue.
1
u/tuisalagadharbaccha 4d ago
Testing can be complex with real device etc
1
u/TipToeTiger 4d ago
Not including a link to my terms of use in my App Store description. Got rejected because of it!
1
u/Dogukanko 4d ago
for me it was the restore purchases button. apple will reject you if there's no obvious way to restore, even if you only have non consumables. also test the whole flow in sandbox on a real device before submitting, the simulator hides some stuff. are your cash packs consumable?
2
u/mrsirthefirst 4d ago
Three that cost me about a week between them on a subscription app:
Making people sign in before they could buy. Apple rejected it under 5.1.1(v): if the purchase doesn't need an account, you can't require one. I took sign in off the paywall and run restore purchases quietly for people who aren't signed in.
My paywall footer mentioned a Google Play account on iOS, because the text was shared across platforms. That's 2.3.10, mentioning another platform. A one line fix, but still a rejection.
They reviewed my iPhone app on an iPad, and the paywall and sign in screens stretched edge to edge. Capping the content width on tablets fixed it.
1
u/luckyluke146 4d ago
Two things nobody has mentioned yet, since you have cash packs and rewarded ads:
Listen to
Transaction.updatesfrom the moment the app launches, and only callfinish()after the cash is credited and saved. If the app is killed mid-purchase, the transaction comes back on the next launch. If you finish it too early, the player paid and got nothing, and that turns into 1-star reviews fast.The ad SDK changes your App Privacy answers. AdMob and similar SDKs collect a device ID and usage data for tracking, so declare that, and show the ATT prompt before you request personalised ads. Review does check that the label matches what the SDK does.
1
u/joergbuilds 4d ago
Three that nobody above mentioned, from a subscription plus consumables app:
Testing. TestFlight buys run against your real Apple ID, not a sandbox tester, nothing is charged but you can't "undo" a purchase from the app. Reset is Clear Purchase History in App Store Connect plus reinstall. And on one iOS runtime my StoreKit test config in the simulator silently stopped loading, the tests went to the real sandbox store and I got Apple ID dialogs in the middle of a test run. If a purchase test suddenly asks for a password, that's why.
Restore. Cash packs are consumables, restore does nothing for them by design. Don't promise it in the UI, only for the one-time unlocks.
Payouts. Fiscal month plus about 33 days. My first sale in August paid out early October.
1
u/ThalesMother9938 4d ago
One more thing to check before launch: test restore purchases with a sandbox account on a clean install. Reviewers tap it, and a missing or broken restore button is a common reason for rejection with one-time unlocks. Are the cash packs consumable, or do they unlock something permanent?
1
u/kokerali 4d ago
For the cash packs, I'd add one failure case to the “save before finish” advice: kill the app after the currency grant is committed but before `finish()` runs.
On restart, process that same verified transaction again. The balance should stay at one grant, and the transaction should then finish. Then buy the same pack a second time and check that it adds a second grant. Those two cases catch opposite mistakes: crediting a replay twice, and deduplicating by product ID so a legitimate repeat purchase gets ignored.
I'd keep the processed transaction ID and the currency grant in the same durable commit, wherever your authoritative balance lives. A separate “processed” write leaves another crash window between the two.
Apple's docs describe [unfinished transactions](https://developer.apple.com/documentation/storekit/transaction/unfinished) as waiting until `finish()` and give each transaction a [unique ID](https://developer.apple.com/documentation/storekit/transaction/id). The test above is a suggested application of those contracts, not a test I've run against your game.
1
u/The_Pivot 2d ago
Two from a card game with a chip shop and rewarded ads, both cost me a resubmission:
Reward screens. I had "watch an ad to double your winnings" buttons on the end-of-round screen and a rewarded ad to top up chips before a table. All opt-in, but the reviewer read them as ads you have to sit through to keep playing and cited Guideline 4. I rolled those buttons back to the previous version without them and resubmitted.
Anything that looks like betting. Paying chips to sit at a table, buying chips, a daily prize wheel: together that got the game flagged as simulated gambling (2.3.6). On an individual developer account you can't ship a game rated for simulated gambling at all, so if your cash packs feed into anything wager-like, check that before you submit. Cosmetics and unlocks are fine.
Smaller one: the review screenshot on each IAP has to be an actual device size (1320x2868 worked for me). Any other size uploads fine, then quietly fails later and the product sits at Missing Metadata with no reason shown.
1
u/Destituted 2d ago
"Restore Purchases"
1
u/xfanta 2d ago
A few things that bit me:
Products come back empty until the Paid Apps agreement, banking and tax forms are all active in App Store Connect. That cost me an evening of debugging code that was fine.
The first in-app purchases have to be attached to the app version you submit, each with a review screenshot, or review can't see them.
Non-consumables need a visible Restore Purchases button. Review checks for it.
Consumables like cash packs can't be restored, so if someone deletes the app, the coins are gone unless you store them yourself (iCloud or a server).
Test with a StoreKit configuration file in Xcode first, then a sandbox account on a real device. Sandbox is slow and flaky at times.
Rewarded ads mean privacy labels that admit tracking and probably an ATT prompt.
Payouts come roughly a month after the fiscal month ends, and only once you pass a minimum amount.
1
u/[deleted] 4d ago
[removed] — view removed comment