What app store review actually rejects, and how to avoid the resubmission cycle
App store review feels like a black box to a lot of first-time app founders, but across the submissions we've handled, the rejections cluster around a small, predictable set of issues. Knowing them in advance turns a multi-week resubmission cycle into a same-week approval far more often than not.
We keep an internal log of every rejection reason we've received across every client submission, and the same handful of categories account for the large majority of them. The specific advice below comes directly from that log, not from Apple's or Google's general published guidelines alone.
Incomplete or misleading metadata
Screenshots that don't match the actual current app version, a description that oversells functionality not yet in the build, or a support URL that doesn't work are some of the most common and most avoidable rejections. Apple in particular checks these details closely, and it's a five-minute fix category that still causes a surprising number of delayed launches.
We now regenerate screenshots as a mandatory step of the submission checklist for every version, rather than reusing a prior version's screenshots and assuming they still match closely enough, since "closely enough" has been the actual cause of more than one avoidable rejection.
Login-gated apps with no reviewer access
If your app requires an account to see anything meaningful, you need to provide a working demo login in the App Store Connect notes, every time, even if you provided one for a previous version. Reviewers don't carry over demo credentials between submissions, and a missing or expired demo account is one of the single most common causes of an otherwise-fine app getting bounced.
We maintain a dedicated, permanent demo account for every client app specifically so this credential is always available and never tied to a real user's account that might get deleted or have its password changed independently of the submission process.
Payment handled outside Apple's or Google's system when it shouldn't be
Digital goods and subscriptions generally must go through the platform's own in-app purchase system, not an external payment link, and this rule gets enforced strictly. Physical goods and services booked for real-world delivery are typically fine to charge outside the app. Knowing which category your product falls into before you build the payment flow saves a full rebuild after rejection.
We settle this classification question explicitly during scoping, before a single line of payment code is written, since a founder's own instinct about which category their product falls into is right more often than not but wrong often enough that we verify it against the platform's actual current guidelines rather than assuming.
Crashes on specific but common device configurations
An app that works perfectly on a reviewer's test device can still crash on an older iPhone or a specific Android screen size the developer never tested on. We test on at least one older, lower-spec device in addition to the newest hardware before every submission specifically because reviewers do sometimes test on older devices, and a crash there is an automatic rejection regardless of how well it performs elsewhere.
We keep a small physical device library specifically for this purpose, including at least one budget Android phone and one iPhone that's a few generations old, since a simulator doesn't always reproduce the exact memory and performance constraints of genuinely older hardware.
An app that works perfectly on a reviewer's test device can still crash on an older iPhone or a specific Android screen size the developer never tested on.
Our actual pre-submission checklist
Working demo credentials documented in the submission notes, screenshots taken from the exact build being submitted, a test pass on at least one older device per platform, and a support URL and privacy policy that are live and accurate. This checklist, followed consistently, has taken our average time-to-approval down from roughly two weeks including one rejection cycle to under five days on most projects.
We treat this checklist as a hard gate, not a suggestion, meaning no submission goes out without every item checked, even under launch-date pressure, since the cost of skipping a step and triggering a rejection cycle is almost always higher than the day it takes to run the checklist properly.
The rejections that feel arbitrary, and mostly aren't
Founders sometimes describe a rejection as random or inconsistent, especially when a nearly identical app from a competitor is live in the store. In our experience, this is rarely true, most rejections trace back to something specific once you dig into the actual reviewer notes, even when the initial rejection message is vague. A competitor's app that looks similar on the surface may differ in exactly the detail that triggered your rejection, a permissions request, a data handling disclosure, a subtly different monetization flow.
We push clients to read the full rejection reason carefully and, when it's genuinely unclear, use Apple's or Google's resolution center to ask a direct clarifying question rather than guessing and resubmitting blind. A guessed fix that misses the actual issue costs another full review cycle, often several days, for a problem a single clarifying question could have resolved immediately.
What we do differently for a second submission after a rejection
Once we understand the specific rejection reason, we fix that issue and re-run the entire pre-submission checklist from scratch, not just the single item that triggered the rejection. Reviewers occasionally flag a second, unrelated issue on a resubmission that happened to be present the first time too but wasn't the reason for that particular rejection, and catching it proactively avoids a second wasted cycle.
This full-checklist discipline on resubmission has meaningfully shortened our average time from first rejection to final approval, since it trades a small amount of extra care for a real reduction in the odds of a second, unrelated rejection extending the timeline further.
We also log every rejection reason, resolution, and time-to-approval into the same internal record mentioned earlier, which means each new client project starts with the benefit of every previous submission's lessons already baked into the pre-submission checklist, rather than each app relearning the same handful of platform quirks independently.
That compounding record is, honestly, the main reason our approval times have improved year over year more than any single process change. Each rejection anyone on our team has ever hit becomes a checklist item for everyone after them, which is a small thing to set up and a genuinely large thing to have accumulated over several years of client launches.