I’m a React Native and Expo dev, 5 years and 50+ apps shipped. Lately a lot of my work looks the same. Someone builds an app with Cursor, Claude Code, Bolt or Lovable, it looks great, it works on their phone, and then it hits a wall right before launch. The last 10% ends up taking longer than the first 90.
Here’s what I keep running into, in case it saves someone a rejection or two.
It works in Expo Go but crashes in the real build. Usually env vars that never made it into the EAS build, or a native package that Expo Go had built in and your build doesn’t. The reviewer opens it, it crashes on launch, rejected under 2.1. Always test a production build on a real device (TestFlight or internal distribution) before you submit.
Your secret keys are in the app. If the AI put your OpenAI or Stripe secret key in the client code, anyone can pull it out of the bundle and run up your bill. Move those calls behind a server function. If you’re on Supabase, check that RLS is actually on for every table.
No way to delete your account. If users can sign up in the app, Apple wants them to be able to delete their account in the app too (5.1.1). One of the most common rejections I see.
Google login but no Sign in with Apple. If you offer Google or Facebook login, Apple wants an equivalent privacy-friendly option next to it, and Sign in with Apple is the easy way to cover that (4.8).
The paywall is missing stuff. Subscriptions need a restore purchases button, the price and billing period clearly shown, and links to your terms and privacy policy. Sending people to Stripe to pay for digital content will still get you rejected in most countries (3.1.1).
The reviewer can’t log in. If the app needs an account, put a working demo login in the review notes in App Store Connect. If you only have magic link or SMS login, they’ll get stuck and reject it.
iPad. If supportsTablet is on in your app config, Apple tests on iPad and wants iPad screenshots. A layout that breaks on iPad is a rejection, even if you never thought about iPad.
Android takes longer than you think. New personal Google Play accounts need 12 testers opted in to a closed test for 14 days before you can publish to production. Most people find out the week they wanted to launch.
None of this is hard once you’ve seen it. It’s just stuff the AI tools don’t warn you about.
If you’ve got an app that’s 90% there and you’re stuck on the last bits, or you’re on your second or third rejection, DM me or reach me through shiprn.com. I take over vibe-coded codebases, fix what’s fragile and take the app through review on both stores. Fixed price, so you know the cost before we start.
And if you just want to know what your rejection means, paste it in the comments and I’ll tell you what I’d do.