App Store Checklist
0 / 0
Phase 01 Developer Account & App ID
1.1

iOS + Mac Enroll in Apple Developer Program

$99/year covers both iOS and macOS distribution. Requires an Apple ID. Organizations also need a D-U-N-S number — allow up to a week for verification.

1.2

iOS + Mac Choose Your App Name

Max 30 characters. Must be unique across the App Store (iOS and Mac share the same namespace). Search apps.apple.com before committing — the name cannot change post-publish without a new version.

30 char max Unique across both iOS and Mac App Store
1.3

iOS + Mac Register a Bundle ID (App ID)

Reverse-domain format: com.DOMAIN.appname. Use an Explicit App ID — not a wildcard — because In-App Purchases require it. Enable In-App Purchases capability here. For a Mac Catalyst app, this is the same Bundle ID as your iOS app. For a native macOS app, register a separate Bundle ID (e.g. com.DOMAIN.appname-mac) or reuse the same one if shipping as a universal purchase.

developer.apple.com → Identifiers Explicit ID required for IAP — wildcard won't work Mac Catalyst = same Bundle ID as iOS
1.4

iOS + Mac Create the App in App Store Connect

New App → select platform (iOS, macOS, or both) → choose your Bundle ID → enter an SKU (internal-only string, e.g. APPNAME-001). You can create a single App Store Connect record that ships on both iOS and macOS if using Mac Catalyst or universal purchase. Native macOS apps get their own separate record.

appstoreconnect.apple.com → My Apps → + Universal Purchase: one record, ships on iOS + Mac
1.5

macOS Decide: Mac Catalyst vs Native macOS

Two paths for shipping a Mac app:

Mac CatalystTake your existing SwiftUI/UIKit iPad app to Mac with minimal extra code. Same Bundle ID. One codebase. Some UIKit APIs unavailable on Mac. Enabled in Xcode: General → Deployment → Mac.
Native macOSSeparate target using AppKit or SwiftUI. Separate Bundle ID and App Store Connect record (unless Universal Purchase). More work, more Mac-native feel.
Phase 02 Xcode Project Configuration
2.1

iOS + Mac Set Bundle Identifier

Xcode → Target → Signing & Capabilities → Bundle Identifier. Must match exactly what you registered in step 1.3. For a Mac Catalyst target, Xcode may append .macos automatically — verify it matches your registered ID.

Mismatch causes code signing failures at archive time
2.2

iOS + Mac Set Signing Team

Signing & Capabilities → Team → select your developer account. Enable Automatically manage signing. For projects with both iOS and macOS targets, set the team on each target separately.

2.3

iOS + Mac Add In-App Purchase Capability

Signing & Capabilities → + Capability → search "In-App Purchase" → add it. For a multi-target project (iOS + macOS), add this capability to each target that will present purchases.

Required on every target that initiates purchases
2.4

macOS Add App Sandbox Capability

Required for all Mac App Store submissions. Signing & Capabilities → + Capability → App Sandbox. Configure the minimum entitlements your app actually needs (network access, file access, etc.). Overly broad entitlements can trigger review rejection.

developer.apple.com — App Sandbox Required for Mac App Store — not optional
2.5

macOS Enable Hardened Runtime

Required for Mac App Store and notarization. Signing & Capabilities → + Capability → Hardened Runtime. If your app uses JIT, DYLD injection, unsigned memory, or Apple Events, add the appropriate exceptions. Most SwiftUI apps need no exceptions.

2.6

macOS Set Minimum macOS Deployment Target

General → Deployment → macOS. Set the minimum version your app supports. RevenueCat SDK requires macOS 10.13+. Older targets may restrict which StoreKit 2 APIs are available — SK2 requires macOS 12+.

RevenueCat min: macOS 10.13 StoreKit 2: macOS 12+
2.7

iOS + Mac Add StoreKit Configuration File (Testing)

File → New → StoreKit Configuration File. Define your products here to test purchase flows locally before App Store Connect products are approved. Set it in each scheme: Run → Options → StoreKit Configuration.

Testing only — not shipped or needed in production
2.8

iOS + Mac Add RevenueCat SDK via Swift Package Manager

File → Add Package Dependencies → paste the URL below → add the RevenueCat library to every target that needs it (iOS target, macOS target, or both).

github.com/RevenueCat/purchases-ios Supports iOS 13+ and macOS 10.13+
2.9

iOS + Mac Initialize RevenueCat in App Entry Point

import RevenueCat
Purchases.configure(withAPIKey: "YOUR_REVENUECAT_PUBLIC_KEY")

// Optional — useful during development:
Purchases.logLevel = .debug

For a Mac Catalyst app, the same @main App struct runs on both platforms. For separate targets, initialize in each target's entry point using its own RevenueCat API key from step 5.2.

Phase 03 In-App Purchases & Subscriptions
3.1

iOS + Mac Navigate to Monetization in App Store Connect

In-App Purchases covers non-consumables and consumables. Subscriptions covers auto-renewable tiers. These live under the same app record — both platforms share the same IAP products when using Universal Purchase.

appstoreconnect.apple.com → [Your App] → Monetization IAP products are shared across iOS and Mac in Universal Purchase
3.2

iOS + Mac Create a Subscription Group

All auto-renewable subscriptions must belong to a group. A user can hold only one active subscription per group — this is how upgrade/downgrade logic works. Group name is shown in system dialogs.

Group name max 30 chars Example: "App Name Pro Access"
3.3

iOS + Mac Create Each Purchase / Subscription Tier

Repeat for every tier (Monthly, Annual, Lifetime, etc.):

Product IDReverse-domain string, e.g. com.DOMAIN.appname.pro_annual
Reference NameInternal only — never shown to users
Duration1 week / 1 month / 2 months / 3 months / 6 months / 1 year
PriceSet via Apple pricing matrix — currency conversion is automatic
Display NameUser-facing, localizable. Max 30 chars.
DescriptionUser-facing, localizable. Max 45 chars.
Subscription LevelHierarchy within the group for upgrade/downgrade
3.4

iOS + Mac Add Review Screenshot for Each IAP Product

Apple requires a screenshot showing exactly where and how the purchase appears in your app. One required per product. For review only — never shown to customers.

IAP Review Screenshot
640 × 920 px minimum
JPEG or PNG · Shows purchase UI in context · One per product · Internal review only
Missing screenshot blocks product approval Show paywall or purchase button in its actual in-app context
3.5

iOS + Mac Set Free Trial / Introductory Offer

Under each subscription product: Add Introductory Offer → Free Trial, Pay Up Front, or Pay As You Go → set duration and eligibility. RevenueCat manages trial eligibility server-side automatically.

RevenueCat handles eligibility without extra code
3.6

iOS + Mac Save & Submit Each Product for Review

Products are reviewed independently from the app binary. Status: Missing Metadata → Ready to Submit → Waiting for Review → Approved. Usually approved with the first app submission but can be submitted standalone.

Phase 04 App Store Screenshots & Preview Assets
4.1

iOS iPhone Screenshot Sizes

Provide at minimum one large iPhone set. The 6.9″ set covers all newer iPhones when no device-specific sets are provided.

iPhone 6.9″ 16 Pro Max
1320 × 2868 px
Portrait · REQUIRED — newest required size as of 2024
iPhone 6.7″ 15 / 14 Plus
1290 × 2796 px
Portrait · Optional if 6.9″ provided
iPhone 6.5″ 11 Pro Max / XS Max
1242 × 2688 px
Portrait · Required — covers older large iPhones
iPhone 5.5″ 8 Plus / 7 Plus
1242 × 2208 px
Portrait · Required if supporting pre-X devices
developer.apple.com — Screenshot Specifications JPEG or PNG · sRGB or P3 · up to 10 per size
4.2

iOS iPad Screenshot Sizes (if iPad supported)

iPad Pro 13″ M4
2064 × 2752 px
Portrait · Required if iPad supported
iPad Pro 12.9″ 3rd / 4th gen
2048 × 2732 px
Portrait · Required if iPad supported
4.3

macOS Mac Screenshot Sizes

Mac screenshots are landscape. Provide at least one required size. Shots should show the app window in its natural state — no simulated hardware overlays needed.

Mac 16″ / large display
2880 × 1800 px
Landscape · REQUIRED for Retina resolution
Mac standard
1280 × 800 px
Landscape · Required — minimum accepted size
Mac mid-size
1440 × 900 px
Landscape · Optional
Mac Retina mid
2560 × 1600 px
Landscape · Optional
JPEG or PNG · landscape only for Mac Up to 10 screenshots per size Mac Catalyst apps still need Mac-sized screenshots — not iPhone-sized
4.4

iOS + Mac Recommended Screenshot Order for Apps with Purchase Tiers

Screenshot 1 — Hero: core value prop. Hook immediately.
Screenshot 2 — Key feature #2
Screenshot 3 — Key feature #3
Screenshot 4 — Paywall / subscription screen showing your tiers clearly
Screenshot 5+ — Supporting features, power user views

Apple reviewers may compare the paywall here against the IAP review screenshot in step 3.4. Keep them consistent.
4.5

iOS + Mac How to Capture Screenshots

iOS Simulator → Device menu → Trigger Screenshot (⌘S) → saves to Desktop
iOS real device → Side + Volume Up → syncs via Finder
macOS → Screenshot app (⇧⌘5) or Xcode → Debug → Capture Screenshot
Xcode Organizer → Window → Organizer → Screenshots tab (connected device)

For designed marketing shots: export at exact dimensions from Figma/Sketch and composite the real screenshot into your layout.
4.6

iOS App Preview Video (optional)

15–30 seconds of real screen recording. Autoplays in search results — worth doing if motion demonstrates value.

6.9″ iPhone886 × 1920 px · 30fps · H.264 or HEVC
6.5″ iPhone886 × 1920 px · 30fps
5.5″ iPhone886 × 1920 px · 30fps
Mac App Store does not support preview videos
Phase 05 RevenueCat Setup & API Keys
5.1

iOS + Mac Create RevenueCat Account & Project

Sign up → New Project → name it after your app. A single project holds multiple platforms (iOS, macOS, Android) sharing entitlements and subscriber data.

5.2

iOS + Mac Add Apps to the RevenueCat Project

Project Settings → Apps → Add App. Add one entry per platform:

iOS appApple App Store → enter iOS Bundle ID → get iOS Public API Key (starts with "appl_")
macOS appApple App Store → enter macOS Bundle ID → get macOS Public API Key (also "appl_")

For Mac Catalyst (same Bundle ID as iOS), you can use the same API key. For a separate native macOS target, add it as a separate app.

Public keys are safe to embed in the app bundle
5.3

iOS + Mac Generate an App Store Connect In-App Purchase Key

Allows RevenueCat to verify receipts server-to-server. In App Store Connect: Users and Access → Integrations → In-App Purchase tab (separate from the regular API Keys tab).

appstoreconnect.apple.com → Users and Access → Integrations → In-App Purchase Download the .p8 immediately — it cannot be re-downloaded after closing the page
What you get.p8 private key · Key ID (10-char) · Issuer ID (UUID)
Store safelyPassword manager — never commit .p8 to version control
CoversOne key covers both iOS and macOS apps in the same ASC account
5.4

iOS + Mac Enter the Key in RevenueCat

RevenueCat Dashboard → each app → App Store Connect section → paste Key ID and Issuer ID, upload the .p8. Do this for both your iOS and macOS RevenueCat app entries if they are separate.

5.5

iOS + Mac Configure Entitlements in RevenueCat

Entitlements are feature-unlock gates (e.g. pro). Multiple products at different prices all map to the same entitlement. Create entitlements → attach every product that grants access.

Entitlement IDe.g. pro — this string is checked in Swift to gate features
Cross-platformEntitlements are shared across iOS and macOS entries in the same project
5.6

iOS + Mac Configure Offerings in RevenueCat

Offerings are named bundles of packages shown on your paywall. The Current offering is fetched by default. Offerings can be changed remotely without an app update. Create separate offerings per platform if your Mac and iOS paywalls differ.

docs.revenuecat.com — Offerings Swappable remotely — no app update needed
5.7

iOS + Mac Gate Features by Entitlement in Swift

let customerInfo = try await Purchases.shared.customerInfo()
if customerInfo.entitlements["pro"]?.isActive == true {
  // unlock pro features — same code on iOS and macOS
}
Phase 06 App Store Listing & Metadata
6.1

iOS + Mac App Icon

Supply a single 1024 × 1024 px PNG in App Store Connect. Xcode generates all device sizes from the AppIcon asset catalog. No alpha channel. No pre-applied rounded corners.

iOS / iPadOS1024 × 1024 px · PNG · no alpha · Apple applies rounding
macOS1024 × 1024 px · PNG · Apple applies the squircle mask on Mac — design with safe margins
macOS icons look best with subtle drop shadow and visible padding inside the squircle
6.2

iOS + Mac Name, Subtitle & Description

Name30 chars max
Subtitle30 chars — keyword-rich, shown under name in search
Description4000 chars · First 3 lines visible before "more" — lead with value prop
Promotional Text170 chars · Updatable anytime without a new version
iOS and macOS listings can have separate descriptions in ASC if shipping as separate apps
6.3

iOS + Mac Keywords

100 characters total, comma-separated, no spaces around commas. Don't repeat words in the name or subtitle. Don't use competitor names. Keywords apply per-platform for Mac vs iOS listings.

100 char budget total · No spaces around commas
6.4

iOS + Mac URLs & Contact Info

Support URLRequired. Contact form, support page, or mailto: link.
Privacy Policy URLRequired if app collects any data (RevenueCat does). Must be publicly live before submission.
Marketing URLOptional. Link to your app's landing page.
privacypolicygenerator.info Privacy Policy URL must be live at review time
6.5

iOS + Mac Age Rating

Complete the content questionnaire. Most utility apps land at 4+. Answer honestly — Apple cross-checks at review. Must be completed separately for each platform listing if separate app records.

6.6

iOS + Mac App Privacy (Nutrition Label)

Declare every data type your app and its SDKs collect. RevenueCat collects Purchase History, User ID, and Device ID — all must be declared. Check RevenueCat's privacy manifest for the full required list.

docs.revenuecat.com — Privacy & Compliance Inaccurate declarations are grounds for App Store removal
6.7

iOS + Mac Upload Screenshots in App Store Connect

App Store Connect → your app → App Store → [version] → drag screenshots into each device-size slot. iOS and macOS screenshots are uploaded in separate sections even for Universal Purchase apps.

Phase 07 Build, TestFlight & Submit for Review
7.1

iOS + Mac Bump Version & Build Number

Version (CFBundleShortVersionString) is user-facing, e.g. 1.0.0. Build (CFBundleVersion) must increment with every upload. Set both on every target before archiving.

Build number must exceed any previous upload — even if version stays the same
7.2

iOS Archive for iOS

Set scheme destination to Any iOS Device (arm64) — not Simulator. Product → Archive → Xcode Organizer opens automatically.

Must target a device — Simulator builds cannot be uploaded
7.3

macOS Archive for macOS

Set scheme destination to My Mac (for Mac Catalyst: "My Mac (Designed for iPad)" or "My Mac"). Product → Archive. A macOS archive produces a .xcarchive containing a .app bundle.

For Mac Catalyst, Xcode may show multiple Mac destination options — pick "My Mac"
7.4

iOS + Mac Validate the Archive

Organizer → select archive → Validate App. Catches entitlement mismatches, missing privacy manifests, and binary issues before upload. For macOS, validation also checks Hardened Runtime and sandbox entitlements.

Fix all errors before uploading — Notarization will also fail on the same issues
7.5

iOS + Mac Upload to App Store Connect

Organizer → Distribute App → App Store Connect → Upload. For macOS, Xcode also notarizes the binary with Apple automatically during this step. Allow 10–30 min for processing.

macOS notarization is handled automatically by Xcode during ASC upload
7.6

iOS TestFlight — Internal Testing

Build appears in TestFlight → Internal Groups after processing. Up to 100 internal testers (must be in your developer account). No review needed. Confirm RevenueCat sandbox purchases work end-to-end here before submitting.

7.7

macOS TestFlight for Mac

Mac apps also use TestFlight since macOS 12. The build appears separately under the macOS platform in TestFlight. Internal testers install via the TestFlight Mac app. External Mac beta requires a review (same as iOS external beta).

developer.apple.com/testflight Requires macOS 12+ on tester's machine
7.8

iOS + Mac Select Build & Fill In Review Information

App Store Connect → your app → App Store → [version] → Build → + → select build. Then fill Review Information:

Sign-In RequiredIf auth required, supply test account username + password
Notes for ReviewerExplain how to reach the IAP, what the free tier covers, anything non-obvious. Reviewers won't spend real money.
IAP noteReviewers use the sandbox — full purchase UI must be reachable without completing a real transaction
7.9

iOS + Mac Submit for Review

Click Add for Review → confirm. Status: Waiting for Review. First submissions: 1–3 business days. Mac apps go through the same review pipeline as iOS — no separate Mac reviewer queue.

developer.apple.com/news — current review times Average first review: 1–3 business days for both iOS and Mac
7.10

iOS + Mac Post-Approval: Release & Production Checks

Manually Release This Version lets you control go-live timing after approval — useful for coordinating marketing. After release, confirm RevenueCat S2S notifications are firing in production and real-purchase entitlement grants work on both platforms.

docs.revenuecat.com — Apple S2S Notifications Set up S2S webhooks before launch for reliable subscription status
Quick Reference — Key URLs