Guideline 2.1 — App Completeness
The reviewer could not get through your app. Either they could not sign in, something crashed, or they found content that was not finished. It is the most common rejection there is, and almost always the cheapest to fix.
What the rejection usually says
We were unable to sign in with the demo account provided.
We discovered one or more bugs in your app when reviewed on iPad running iOS.
Your app still includes placeholder content.
Wording varies between reviewers; the substance does not.
Why it gets triggered
- The demo account in App Review Information expired, was rate-limited, or requires a verification code the reviewer cannot receive.
- The build crashes on a device or OS version you did not test — iPad is the classic one.
- A feature is behind a server that was down, gated by a region, or waiting on a backend deploy.
- Lorem ipsum text, empty states, or a support URL that is not live yet.
How to fix it
1.Prove the demo account works today
Sign in with it yourself in a fresh install, right before you resubmit. If it needs a one-time code, provide a bypass code or a pre-verified account, and say so in the notes.
2.Test on the device they named
The rejection names a device and OS version. Run that exact combination in the simulator and fix what breaks before replying.
3.Fill in App Review notes properly
Explain any non-obvious flow: where the feature lives, what to tap, what data to expect. Reviewers have minutes, not hours.
4.Remove anything unfinished
Placeholder copy, dead links, empty tabs and coming-soon screens all read as incomplete. Hide them behind a flag rather than shipping them.
A reply you can adapt
Short, specific, and stating what changed — reviewers read hundreds of these.
Thank you for the review. The demo account has been reset and verified working — credentials updated in App Review Information, no verification code required. We reproduced the crash on the device named and fixed it in this build. No other changes.
AppSubmit does this for your app, specifically
Paste the rejection and the decoder reads it against your actual listing, build and release history — then writes the fix plan and drafts the reply. It also watches your submissions, so the next rejection reaches you as a notification rather than a surprise.
Decode a rejection free