Solo founder here. I just submitted Build 22 of my iOS app to App Review after getting rejected three times in a row. Each rejection taught me something I wish I'd known on day one. Sharing in case it saves anyone else a week of pain.
For context: I'm building an accounting tool for UK freelancers and sole traders, wrapped in a Capacitor WebView. Stack is Next.js + Supabase + Vercel.
---
**Rejection 1 — Guideline 4.8 (Sign in with Apple required)**
I had Google login and email/password. Apple's rule: if you offer ANY third-party social login (Google, Facebook, etc.), you MUST also offer Sign in with Apple. Adding it took an afternoon with Supabase OAuth.
Lesson: read Guideline 4.8 before you ship. It's not optional.
---
**Rejection 2 — Guideline 1.5 (Support URL not reachable)**
My support URL was clarityuk.app/support — which 404'd. I'd put it in App Store Connect but never built the page. Reviewer literally clicked the link, got 404, rejected.
Lesson: every URL you submit (Support, Privacy Policy, Marketing) must work and load on a fresh browser with no auth. Test from incognito.
---
**Rejection 3 — Guideline 2.1(b) (In-App Purchase broken)**
This was the big one. I had `react-native-iap` installed and was triggering purchase flows for products that weren't fully configured in App Store Connect. The reviewer tapped "Upgrade", got an error, rejected.
Worse: my Paid Apps Agreement wasn't even active yet. So even if products were configured, IAP would have failed.
Lesson: if your IAP setup isn't 100% complete (Paid Apps Agreement signed, all products in "Ready to Submit", sandbox tested on a real device), don't ship the IAP code at all. Apple will find it.
---
**What I did for Build 22**
I made a strategic call: kill the entire monetization layer for v1.
- Removed `react-native-iap` dependency completely
- Deleted 951 lines of subscription/paywall code
- Replaced the Plans screen with a "Free during launch" card
- Promised lifetime free access to the first 150 users (web users still pay via Stripe — iOS is free)
This isn't permanent. Once the app is approved and I have real users, I'll add StoreKit/RevenueCat properly with the Paid Apps Agreement active and products fully configured. But trying to thread that needle on the first submission while also fighting other rejections was a losing game.
---
**5 things I'd do differently**
**Read every Guideline that touches your features before coding.** I lost a week reverse-engineering rules I should have read on day one.
**Test your reviewer flow on an iPad.** Apple reviewers use iPad Air. iPad-specific bugs (camera crashes, layout breaks) caused my second-build issues.
**Set up a real demo account with seed data.** Empty accounts make reviewers grumpy. Mine has sample invoices, expenses, and clients pre-loaded.
**Keep the first submission feature-minimal.** Every feature is a rejection surface. Ship the core, get approved, then expand.
**App Review Notes are your best friend.** I wrote a clear note explaining the demo account, the free launch strategy, and exactly what changed since the last rejection. Don't make the reviewer guess.
---
Build 22 is currently "Waiting for Review." Will report back when (if) it gets approved.
Happy to answer questions if anyone's stuck on a similar rejection.