App Store rejections feel arbitrary when you're on the receiving end of one. They rarely are. Apple's reviewers work from a published set of guidelines, and the rejections that hit FlutterFlow apps cluster around a small number of them — nearly all preventable before you ever hit submit.
Each rejection costs a review cycle: typically one to three days, longer around holidays and major OS releases. Two rejections push a launch out by a week. Here are the six we see most.
The two that catch almost everyone
These are policy requirements rather than product problems, which is exactly why they get missed. Neither has anything to do with what your app does.
Reason 01
Missing in-app account deletion
If your app lets users create an account, it must let them delete that account from inside the app. Not by emailing support, not through a link to a web form — an in-app flow that removes the account and its associated data.
This is the most common rejection we see on apps with authentication, and it catches teams out precisely because it isn't about their product. Guideline 5.1.1(v) applies regardless of what you built. Deleting the Firebase Auth user isn't enough on its own — you also need to handle that user's data in Firestore.
The fix: Build a Delete Account flow before submission, and remove the user's data, not just the auth record.
Reason 02
No way past the login screen
Apple's reviewer opens your app, hits a login wall with no way through, and rejects it. The rejection reads as though your app crashed or didn't work — because from their side, it didn't.
You're required to provide working demo credentials in App Store Connect. If your app needs a phone OTP, or a particular account state to be meaningful, or a backend still behind a staging flag, the reviewer needs a documented path through all of it. Roles count too: give them an account that reaches the full experience.
The fix: Add demo credentials to Review Notes, and verify they work on a clean install.
The three that mean rebuilding something
These are harder to turn around, because clearing them means shipping actual functionality rather than editing metadata. If any apply to you, find out now rather than after your first rejection.
Reason 03
Minimum functionality: a wrapped website
If a meaningful portion of your app is a WebView pointing at your existing site, Apple will likely reject it under Guideline 4.2. The rule exists to keep the store from filling with repackaged websites, and reviewers apply it aggressively.
This hurts MVPs in particular, because wrapping an existing web product is the fastest route to a mobile presence — exactly the pattern the guideline targets. The bar Apple applies is roughly: does this do something a mobile browser couldn't? Push notifications, offline access, camera, biometrics, native navigation.
The fix: Build native screens for your core flows, and add one capability a browser can't deliver.
Reason 04
Payments routed outside in-app purchase
If you sell digital content, subscriptions, or features used inside your app, that has to go through Apple's in-app purchase system. Linking out to Stripe or your own checkout for digital goods is a rejection under Guideline 3.1.1.
The line that confuses people is physical goods and real-world services — those should use external payment and must not use IAP. An e-commerce app taking card payments is fine; a subscription unlocking premium features is not. Depending on your region, even mentioning a cheaper price on your website can draw a rejection.
The fix: Route digital purchases through StoreKit. Reserve external payment for physical goods only.
Reason 05
User content with no moderation tools
Any app where users post content other users can see needs a moderation system. Apple requires four things specifically: a way to filter objectionable content, a way to report it, a way to block abusive users, and published developer contact information.
Teams building social features almost always plan moderation as a post-launch concern. Apple treats it as a launch requirement, and this rejection is among the hardest to clear quickly because it means building real features. You'll also need an EULA covering zero tolerance for objectionable content, which is explicitly checked.
The fix: Ship report, block and filter tools with the first version that has user content.
The one that's easiest to get wrong quietly
Reason 06
Privacy labels that don't match
You declared that your app collects no data. But it includes an analytics SDK, or Crashlytics, or an ad network. Apple can see the SDKs in your binary, and the mismatch triggers a rejection.
Third-party SDKs are the usual blind spot: teams accurately declare what their own code collects and forget that an analytics package is collecting device identifiers on their behalf. The related failure is permission strings — every permission needs a purpose string, and a generic one gets rejected.
The fix: Audit every SDK against your privacy labels, and write specific purpose strings.
Google Play is different, not easier
Play review is faster and more automated, which teams read as more lenient. It isn't — the enforcement simply arrives later and lands harder. Where Apple blocks you before launch, Google will frequently approve an app and then suspend it weeks afterwards.
The Play issues we see most: a Data Safety form that doesn't match actual SDK behaviour, missing declarations for sensitive permissions, and target API level requirements that change annually and silently block updates to existing apps.
"An Apple rejection costs you days before launch. A Play suspension costs you your listing after launch, with users already installed."
That asymmetry is worth planning around. Treat the Play requirements as seriously as Apple's, even though nothing blocks you upfront.
The pre-submission checklist we run
Before any client app goes to review, we work through this. It's the cheapest hour in the entire project:
- Account deletion — in-app flow exists, removes the auth record and the user's data.
- Demo credentials — in Review Notes, tested on a clean install, covering every role.
- Privacy labels — audited against every SDK in the binary, not just your own code.
- Permission strings — specific and user-facing, no placeholder text.
- Privacy policy — live at a public URL, covering everything you actually collect.
- Purchases — digital goods through StoreKit, physical goods through external payment.
- Moderation tools — report, block, filter and EULA, if users can see each other's content.
- Screenshots — correct dimensions for every required device size.
- Age rating — matches your actual content, including anything user-submitted.
- Crash-free launch — tested on a real device, fresh install, no cached state.
None of this is FlutterFlow-specific. It's the preparation any mobile app needs, and it's the step most first-time submissions skip — which is why it's a distinct phase in our development process rather than an afterthought, and why it appears in our list of no-code founder mistakes.
FlutterFlow
App Store
Google Play
Launch