Pre-submission audit for macOS & iOS apps

Stamp it cleared
before Apple stamps it rejected.

ShipCheck reads your actual Xcode project and your actual App Store Connect data — then tells you exactly what will bounce your submission, before you find out from Apple.

Download for macOS macOS 14+ · Free during beta · No account required
— Loading manifest count…
The manifest

Everything Apple checks that you'll forget you answered

Not a linter. ShipCheck cross-references your code against the live state of your App Store Connect record, so it catches drift — the mismatch that crept in six builds ago, not just typos.

IAP & Subscriptions

Every product ID, cross-checked

Diffs the product IDs in your .storekit config and source code against what's actually registered in App Store Connect — the mismatch that causes a silent purchase failure in production.

Privacy Manifest

Required Reason APIs, declared correctly

Scans your code and every bundled third-party framework for Apple's Required Reason APIs, checks them against PrivacyInfo.xcprivacy, and drafts a reason code for anything undeclared — rule-based first, with optional AI (bring your own key) filling in the gaps a rule doesn't cover.

App Information & Review

Everything human review looks at first

Name, subtitle, keywords, description, support URL, copyright, demo account, review notes — pulled live from App Store Connect and checked before a reviewer ever opens your build.

Age Rating

What your code implies vs. what you declared

Compares content signals actually detected in your project against your declared App Store Connect age rating answers.

Screenshots

Missing screenshot sets, caught before Apple asks

Checks what's actually uploaded to your most recent App Store Connect version, per device size and locale — not just whether you remembered, but whether it actually saved.

Legal Documents

Privacy Policy and Terms of Use, drafted for you

Generates a starting draft of both from the data collection ShipCheck actually detected in your project — something to review and publish, not boilerplate you write from scratch.

The recurring five

Export compliance, ATT, Sign in with Apple, and more

Export Compliance, missing permission usage strings, App Tracking Transparency, Sign in with Apple requirements, and Background Modes consistency — the declarations easy to get wrong precisely because you got them right last time.

Security

Why it's safe to connect your App Store Connect account

Handing an API key to a new tool should feel uncomfortable. Here's exactly what ShipCheck does with yours — nothing hidden.

Storage

Kept in your Keychain, not a plain file

Your .p8 key is stored in macOS Keychain with access control, unlocked only after you unlock your Mac — never written to disk as a plain file.

In transit

Signed locally, never transmitted

ShipCheck signs its own request token on your Mac. Only that signed token — never the private key itself — is sent, straight to Apple.

Architecture

No backend, ever

There is no ShipCheck server to breach. Every App Store Connect call goes directly from your machine to Apple's API.

Not a new idea

The same credentials fastlane already asks for

Key ID, Issuer ID, and a .p8 file are the exact three values fastlane — the tool most professional iOS teams already trust — has used for years. ShipCheck's Keychain-backed storage is more restrictive than fastlane's typical plain-file setup.

AI, if you want it

Bring your own key, or skip it entirely

AI only ever assists with one thing: suggesting a Privacy Manifest reason code when no rule matches. Off by default — add a key from Anthropic, OpenAI, Gemini, Mistral, Groq, DeepSeek, or xAI, and calls go straight from your Mac to that provider, never through ShipCheck.

The tradeoff, stated plainly: ShipCheck doesn't run inside Apple's App Sandbox — it needs full filesystem access to read your Xcode project. That's exactly why the setup steps below have you create a key scoped to the Developer role rather than Admin: least privilege, so there's less at risk even in a worst case.

Also works in CI

Catch drift the moment it happens, not at submit time

The same app runs headless — wire it into a build phase or CI job so a product ID mismatch or a missing Privacy Manifest entry fails the build right away, instead of surfacing weeks later right before you submit.

/Applications/ShipCheck.app/Contents/MacOS/ShipCheck --ci /path/to/your/project

Always runs the checks that need no App Store Connect account — IAP ID consistency, Privacy Manifest, and Other Declarations — and exits non-zero on any blocking finding. Optionally add your API key as an environment variable to also run a real IAP diff against App Store Connect, or wire it into a git pre-commit hook to catch drift before it's even pushed. Full setup guide, including React Native projects →

Setup

Connect your App Store Connect account

ShipCheck needs three things from Apple to read your app's real data. Here's exactly where to find them.

Open your API keys page

In App Store Connect, go to Users and Access → Integrations → App Store Connect API.

Generate a key

Click Generate API Key, give it a name, and grant it Developer access — the minimum role ShipCheck needs. Avoid Admin: a key scoped to Developer cannot touch users, agreements, or finances, so there is less exposure if it were ever compromised.

Copy the Key ID and Issuer ID

Both appear right on that page next to your new key, e.g. Key ID: 2X9R7B4K3P and Issuer ID: 69a6de….

Download the .p8 file — now

Apple only lets you download this once. Save it somewhere you won't lose it before you navigate away from the page.

Paste all three into ShipCheck

Open ShipCheck → Settings → App Store Connect, enter the Key ID and Issuer ID, and choose the .p8 file.

Why does ShipCheck need this? Apple's App Store Connect API requires every request to carry a signed token proving it's really you. ShipCheck builds and signs that token locally, on your Mac, using the key you just downloaded — the file itself is stored in your Keychain and never transmitted anywhere except directly to Apple.

Pricing

Free right now. That's not a trial.

Full access, no card

$0 — during the public beta

  • Every check, every category, unlimited projects
  • Live App Store Connect integration on your Mac, no time limit
  • If you download during the beta, this stays free for you — permanently, even after paid tiers launch

After the beta, new installs get one project with full App Store Connect integration for free, then $29.99/yr or $89.99 once for unlimited projects. Local-only checks (Privacy Manifest, declarations, IAP against your local .storekit) always stay free, on every project, no account needed.