First submission checklist
Everything here is deterministic, lives in the repository, and can be checked before you build. That matters because the expensive rejections are the ones where the message names a guideline and not a file, and each round trip is a 20 to 40 minute build plus one to three days in a queue.
The judgement calls — whether your app does enough to exist under Guideline 4.2, whether it reads as spam under 4.3 — are not on this list, because no checklist and no tool predicts them.
Start the Play side first. Apple's cost is the number of iterations, which you control. Play's cost includes a fixed multi-week floor for some new accounts, which you cannot.
Do first, because it has a fixed floor
Closed testing. Some new personal Play developer accounts must run a closed test with a minimum number of opted-in testers for a continuous period before applying for production access. Testers must actually accept and install; a list of email addresses is not a list of testers. Take the current numbers from Play Console. Detail.
Target API level. Google's annual deadline blocks publishing rather than triggering a review conversation, and raising it opts you into that Android version's behaviour changes. Do it early enough to find the library that has not caught up. Detail.
Privacy manifests, the biggest RN-specific risk
# what already carries a manifest
find node_modules -name "PrivacyInfo.xcprivacy" | sed 's|node_modules/||' | cut -d/ -f1 | sort -u
# every manifest in the tree parses
find . -name "PrivacyInfo.xcprivacy" -exec plutil -lint {} \;
# what actually resolved into the build
grep -E '^ +- ' ios/Podfile.lock | sed 's/[ -]*//' | cut -d' ' -f1 | sort -uApple's rule is per-bundle: your app's manifest does not cover a dependency, and a dependency cannot lean on yours. hermes is on Apple's SDK list, which makes this near-universal for React Native.
Of the most popular React Native packages that ship native iOS code, about 11 percent carry a manifest of their own, so most of your tree does not. The census. · Apple's list mapped to npm packages. · ITMS-91053 · ITMS-91061
Permissions and background modes
/usr/libexec/PlistBuddy -c "Print" ios/*/Info.plist | grep -i 'UsageDescription' -A1
/usr/libexec/PlistBuddy -c "Print :UIBackgroundModes" ios/*/Info.plist 2>/dev/null
find android -path '*intermediates*' -name 'AndroidManifest.xml' | head -1 \
| xargs grep -E 'uses-permission|foregroundServiceType'For each entry, answer in one sentence: which user-facing feature stops working if this is removed? Anything you cannot answer is a rejection waiting, because App Review asks the same question.
Guideline 2.5.4 rejects a declared location background mode with no genuine persistent-location feature. Guideline 5.1.5 rejects apps that demand location up front or break without it. Permission audit. · 2.5.4 · 5.1.5
Accounts, payments, metadata
- In-app account deletion if you support account creation, plus a web-accessible route for Play. Satisfying one does not satisfy the other. Detail.
- Paywall carrying subscription title, length, localised price read from StoreKit rather than hard-coded, working terms and privacy links, plain auto-renewal wording, and a restore purchases path you have tested on a second device. 3.1.2
- In-app purchase for your own subscription; Stripe is fine for real-world services. 3.1.1
- No references to other mobile platforms in description, keywords, promotional text, screenshots or in-app strings. 2.3.10
- No placeholder content. Lorem ipsum, TODO, example.com, a privacy policy link that 404s.
- Play Data safety derived from what your SDKs actually collect, not from memory. Detail.
The Expo trap that costs a whole extra cycle
ios/ and android/ are build artefacts, regenerated from app config and config plugins on every prebuild. A fix applied there works locally, vanishes on the build server, and produces an identical second rejection.
Anything that must survive a build lives in app.json, app.config.js or a config plugin. Why RN and Expo fail differently.
The morning you submit
- Test the demo account from a device that is not yours, in a private session. Broken demo credentials are a Guideline 2.1 rejection and entirely self-inflicted.
- Seed the demo account with data, so a reviewer does not see an empty app.
- Write the review notes: credentials, where to find the non-obvious features, one line per sensitive permission naming the feature, and anything that looks wrong but is not. Review notes that work.
- Open every link in the built app, including the privacy policy, from the device.
What none of this covers
Guideline 4.2 minimum functionality and 4.3 spam are humans deciding whether your app does enough to exist and whether it looks like forty others. 1.4.1 medical scrutiny is a human reading your claims. No checklist predicts them, and any tool implying it can guarantee approval is selling certainty that does not exist. 4.2 · 1.4.1
shipcheck runs every deterministic item above against your local project, before you build, inside the Claude Code session you already have open. No account, no repository upload, first scan free with real findings. What it checks.
More in this section
- Submitting an Expo app with EAS: the checklist
- Submitting an AI app: what applies, all at the same time
- Setting up App Store Connect for the first time
- TestFlight beta review: what it actually checks
- The annual OS release: what actually changes for a React Native app
- Rejected: the order of operations that gets you approved fastest
About shipcheck
shipcheck is a pre-submission checker from Baker Ventures LLC that runs inside Claude Code. It reads your React Native or Expo project, finds the things that get apps rejected or blocked at upload, cites the exact App Store Review Guideline or Google Play policy clause, and names the file and line to fix.
It exists because React Native and Expo apps fail for reasons that are invisible in the code you wrote: capability arriving through a dependency, purpose strings added by a config plugin, a privacy manifest missing from an SDK you never chose directly, and a generated ios/ directory that discards your edits on the next prebuild. shipcheck checks what the binary and the config actually declare, not what you intended. The rejection references on this site are free, need no account, and link to the primary Apple or Google document for every claim.
Questions and answers
What should I check before submitting a React Native app to the App Store?
Privacy manifests across the dependency tree, permission strings that match real features, background modes with a matching capability, in-app account deletion if you support accounts, working demo credentials, no placeholder content, no references to other mobile platforms, and a paywall carrying terms and privacy links that resolve.
How long does a first App Store submission take?
The review itself is usually one to three days. What decides the total is the number of round trips, and configuration rejections cost the most because they name a guideline rather than a file. That is the part a pre-submission check reduces.
What is the most common first-submission rejection?
Across public accounts the recurring clusters are Guideline 2.1 completeness including crashes and broken demo accounts, 5.1.1 privacy including missing account deletion, 4.2 minimum functionality, and metadata problems under 2.3. Privacy manifest upload errors sit before review as a separate blocker.
Do I need to do anything different for Google Play?
Yes, and start it earlier. Play has a Data safety declaration that must match your SDKs, a target API level that blocks publishing rather than triggering review, permissions declarations for sensitive access, and for some new personal accounts a closed test with a minimum tester count over a fixed period.
Can I automate any of this?
The deterministic parts, yes. Privacy manifests, permission strings, background modes, metadata references, manifest contents and link resolution are all findable in the repository before a build. Judgement calls such as minimum functionality cannot be automated by anyone.
shipcheck. “First submission checklist.” Baker Ventures LLC, September 6, 2026. https://shipcheck.bakerventuresstudio.com/guides/first-submission-checklist/