shipcheck

What you can check for free before submitting

Updated September 7, 2026 · published by Baker Ventures LLC · sources cited inline

Most of the pre-submission pass costs nothing. The part that costs money is judgement, and no tool sells that.

Free and worth doing, in order of value:

1. The stranger install. Release build, on a device you have never signed into. Fresh install, no account, no data, offline once. This finds more Guideline 2.1 rejections than every automated check combined, and almost nobody does it because their own phone already works.

2. Xcode validation. Structural problems with the archive: signing, entitlements, bundle validity. Runs before you spend a review cycle.

3. A TestFlight upload, early. The automated upload checks run before either kind of review, so pushing a build in week one of a release cycle surfaces all four ITMS blockers for free. What TestFlight review does and does not check.

4. Greps over your own project. Purpose strings with no matching feature, other-platform references, account creation with no deletion path, unsubstantiated claims in listing copy. Twenty minutes.

5. The Console's own blocking list. Both stores tell you what is blocking this specific version. Reasoning from memory instead of reading it is a self-inflicted cycle.

What none of them check: whether a reviewer can reach your feature, whether your paywall is comprehensible, whether your screenshots show the app, whether your demo account works today. Those are where the expensive rejections are.

The greps

Twenty minutes, and they cover a real share of the automated failures:

# purpose strings, including the ones a config plugin added
npx expo config --type public 2>/dev/null | grep -E 'UsageDescription'
grep -rn 'UsageDescription' ios/*/Info.plist 2>/dev/null

# other-platform references in metadata and UI strings
grep -rniE 'android|google play|play store|samsung|pixel' \
  fastlane/metadata store src app 2>/dev/null | head

# account creation without an in-app deletion path
grep -rniE 'sign ?up|create account|register' src app --include=*.tsx | head
grep -rniE 'delete (my )?account|deleteAccount' src app --include=*.tsx | head

# unsubstantiated claims in listing and paywall copy
grep -rniE '[0-9,]+\+? (users|downloads|reviews)|as seen (in|on)|#1 |rated #1|clinically proven' \
  fastlane/metadata store src app 2>/dev/null | head

# keys that must not be in a bundle
grep -rniE 'sk-[a-z0-9]{10}|api[_-]?key\s*[:=]\s*["\x27]' src app app.json 2>/dev/null | head

Each maps to a specific guideline: 5.1.1(v), 2.3.10, 2.3, ITMS-90683.

The stranger install, in detail

The highest-value free check, written out so it actually gets done:

1. Release build. Not a dev build, not the simulator.
2. A device with no account of yours signed in, or delete the app and
   revoke it in Settings so the first-run paths are genuine.
3. Open it. Do not create an account until it forces you to.
4. Try to use the main feature. Note every point you are blocked.
5. Airplane mode. Use it. Turn airplane mode off.
6. Force quit. Reopen. Note what state it returns in.
7. Reach the paywall and try to decline it. Time yourself.
8. Try to delete your account, if you created one.

Steps 3, 5 and 7 produce most findings. A blank first screen on a fresh install is the single most common 2.1 rejection, and it is invisible to everyone who has used the app before. What reviewers actually test.

What each thing covers

CheckCoversMisses
Xcode validationArchive structure, signing, entitlementsEverything about behaviour and metadata
Upload processingThe four ITMS blockersEverything a human evaluates
TestFlight beta reviewSuitability for testingMetadata, screenshots, most guidelines
GrepsConfig and copy problems you can nameAnything you did not think to search for
Stranger installCompleteness, first-run, paywall clarityConfig and dependency-level problems
Console blocking listWhat that store says is blocking this versionAnything not yet detected

The pattern: automated checks find config problems, and a human find behaviour problems. Doing one and not the other leaves half the surface uncovered.

Where shipcheck fits, disclosed

We make shipcheck, and this page is on its site. The honest framing:

What it adds is the pass you would run by hand, run consistently, over the resolved config, Podfile.lock and node_modules together, with the guideline text cited and the file and line named. The dependency-level findings are the ones hardest to reproduce with greps, because they require knowing which of 800 packages pulls in an SDK on Apple's list. The SDK to npm map, published free.

What it does not do is judgement. It cannot tell you whether a reviewer will reach your feature, whether your paywall is clear, or whether your screenshots show the app. Those still need the stranger install, and no tool in this category can honestly claim otherwise.

The CLI path is free. What it checks. · The first-submission checklist. · How the rejection checkers compare.

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

Can I check my app for App Store rejection risk for free?

Most of it, yes. Xcode's own validation, the upload processing checks, TestFlight, and a set of greps over your project cover the majority of the automated failures. What none of them cover is judgement, which is where the expensive rejections live.

What does Xcode validation actually catch?

Structural problems with the archive: signing, entitlements, bundle validity, and several of the automated checks. It is the cheapest gate available and it runs before you have spent a review cycle.

Does TestFlight tell me if my app will be approved?

No. Beta App Review is a narrower question than App Review, and metadata, screenshots and several guideline areas are not evaluated. What it does give you for free is the automated upload checks, which is genuinely useful early.

What can a static tool not check?

Whether a reviewer can reach your feature, whether your paywall is comprehensible, whether your screenshots show the app, whether your demo account works, and whether a design is manipulative. All of those are judgement, and all of them are common rejection causes.

Is there a free tool that reads my React Native project?

shipcheck runs inside Claude Code and reads the project directly, and the CLI path is free. This page is written by the people who make it, which is disclosed here and on every page of this site.

What is the single most valuable free check?

Installing the release build on a device you have never signed into, and using it as a stranger. Fresh install, no account, offline once. That one exercise finds more Guideline 2.1 rejections than every automated check combined.

Cite this pageshipcheck. “What you can check for free before submitting.” Baker Ventures LLC, September 7, 2026. https://shipcheck.bakerventuresstudio.com/compare/free-ways-to-check-your-app-before-submitting/