๐Ÿš€ ShipToStore

iOS publishing guide ยท 6 steps ยท ~3h 35m

๐Ÿ–ผ๏ธ Metadata & assets

Screenshots, description, privacy labels, and URLs โ€” what reviewers check first and what users see on your store page.

Capture screenshots at the exact required sizes

1h

Screenshots are uploaded per device class in App Store Connect โ†’ your app โ†’ the version โ†’ App Previews and Screenshots.

Required sizes (PNG or JPEG, no alpha):

  • iPhone 6.9โ€ณ / 6.7โ€ณ: 1320ร—2868 or 1290ร—2796 (portrait) โ€” required for all apps. One set covers all smaller iPhones unless you upload device-specific sets.
  • iPad 13โ€ณ: 2064ร—2752 โ€” required only if your app runs on iPad.

Rules of thumb:

  • Up to 10 per device class; the first 3 show in search results and do most of the selling.
  • Generate from the Simulator: pick e.g. iPhone 17 Pro Max, press Cmd+S โ€” the PNG lands on the Desktop at the correct pixel size.
  • Marketing frames/captions are fine, but the app UI shown must be the real, current UI.

โš ๏ธ Pitfall

Guideline 2.3.10: screenshots must show the actual app. Mockups, 'coming soon' features, Android status bars, or fabricated content are an instant metadata rejection.

Write the description, promotional text, and keywords

1h

Three text fields, three different jobs:

  • Description (4000 chars): first 2โ€“3 lines show before 'more' โ€” lead with the core benefit. Don't mention prices (they drift and cause metadata rejections) or other platforms.
  • Promotional text (170 chars): sits above the description and is editable without a new review โ€” perfect for announcements ('v1.2: dark mode is here').
  • Keywords (100 chars): comma-separated, no spaces after commas (workout,log,fitness,tracker โ€” spaces waste characters). Don't repeat words already in your name/subtitle (they're already indexed); skip the plural if you have the singular; competitor names violate guidelines.

Write these in a text editor first โ€” App Store Connect's fields are unforgiving to edit in.

Set Support URL, Marketing URL, and Privacy Policy URL

30 min
  • Support URL (required): any live page where users can get help โ€” a simple contact page or even a well-kept GitHub issues link works. Reviewers do click it.
  • Marketing URL (optional): your landing page.
  • Privacy Policy URL (required): must be a live, reachable page with an actual policy covering what data you collect, why, and how users can exercise their rights. Generators (e.g. iubenda, Termly, free templates) are fine for v1 โ€” a 404 or parked domain is an instant rejection.

No website? GitHub Pages, Notion public pages, or Carrd all pass review. Just make sure the privacy policy mentions the SDKs that actually collect data (analytics, crash reporting, RevenueCat).

Complete the age rating questionnaire

10 min

In the app record, open App Information โ†’ Age Rating โ†’ Edit and answer the questionnaire (violence, sexual content, gambling, unrestricted web access, user-generated content, etc.). Apple computes the rating (4+, 9+, 12+, 17+) from your answers.

  • Answer honestly โ€” under-rating discovered in review means rejection; discovered after release can mean removal.
  • An embedded browser or unfiltered webview forces 17+ via the 'unrestricted web access' question โ€” a common surprise.
  • User-generated content triggers expectations of moderation, reporting, and blocking mechanisms (Guideline 1.2) โ€” make sure those exist if you answer yes.

Fill in the App Privacy "nutrition labels"

45 min

In App Store Connect โ†’ your app โ†’ App Privacy, declare every category of data collected โ€” by your code and by every SDK you embed.

Process:

  1. List your SDKs: analytics (Firebase, Mixpanel, PostHog), crash reporting (Sentry, Crashlytics), monetization (RevenueCat), ads (AdMob, Meta), auth providers.
  2. Look up each vendor's published privacy-label guidance โ€” most maintain an official 'App Store privacy details' doc.
  3. Declare each data type in the right bucket: Data Used to Track You / Data Linked to You / Data Not Linked to You.
  4. Typical indie minimum: Identifiers + Usage Data (analytics), Diagnostics (crash reporting), Purchases (RevenueCat), plus Contact Info if you have accounts.
  5. If you declare tracking, you must also implement the ATT prompt โ€” these two must agree.

Answers can be edited anytime without a new binary, but mismatches found in review cause rejection.

โš ๏ธ Pitfall

Mismatch between labels and actual behavior (e.g. Firebase Analytics in the binary but 'Data Not Collected' declared) is a rejection โ€” Apple scans embedded SDKs. When in doubt, over-declare.

Set pricing and availability

10 min

In App Store Connect โ†’ your app โ†’ Pricing and Availability:

  • Price: choose Free ($0) or a price point. Apple's pricing system has ~900 price points; you pick a base price/territory and Apple derives the other storefronts (you can override per-territory).
  • A paid app price requires the Paid Apps Agreement to be Active โ€” if you can't select a price, go back to Phase 3.
  • Availability: all territories by default; deselect countries where you can't operate (legal, language, content reasons). You can expand later without review.
  • Freemium apps (free + IAP): set the app itself to Free โ€” the IAPs carry the prices.
โ† Create the App Store Connect recordIn-App Purchases & Subscriptions โ†’

Track this interactively

Check off steps, skip what doesn't apply, and pick up where you left off.

Open the checklist โ€” free