Part 3: The Complete Launch Checklist

Print this out. Check every box. Ship with confidence.

Development Checklist

Project Setup

  • Expo SDK on latest stable version
  • TypeScript configured with strict mode
  • ESLint and Prettier configured
  • Git repository initialized
  • .gitignore includes .env files
  • Environment variables properly set up

Authentication

  • Email/password login works
  • Apple Sign-In implemented (required if you have any auth)
  • Google Sign-In implemented
  • Logout clears all user data
  • Session persists across app restarts
  • Token refresh works correctly
  • Password reset flow tested

Core Features

  • Main feature works as expected
  • All CRUD operations tested
  • Error states handled gracefully
  • Loading states implemented
  • Empty states designed
  • Offline behavior defined

Payments & Paywall

  • RevenueCat SDK integrated
  • Products created in App Store Connect (weekly + yearly)
  • Products created in Google Play Console
  • Sandbox testing completed (iOS)
  • Test purchases work (Android)
  • Restore purchases works
  • Paywall displays correctly with real prices
  • Entitlement checks gate features properly
  • PREMIUM_ENTITLEMENT_ID matches RevenueCat dashboard ("premium")
  • Mock offerings use correct package types (ANNUAL + WEEKLY, not MONTHLY)
  • Trial day calculation handles WEEK/MONTH/YEAR units (not just days)
  • Hard paywall 3-layer guard working (index.tsx + _layout.tsx + usePremiumStatus)
  • Dev skip button calls usePremiumStore.setState, not markPremiumScreenSeen
  • Review screenshots uploaded for each subscription in ASC
  • IAPs attached to app version in ASC (not submitted separately)
  • Prices equalized across 175 territories via asc CLI

Data & Security

  • document-level access control enabled on ALL tables
  • No API keys in client code
  • Sensitive data in SecureStore (not AsyncStorage)
  • Input validation on all user inputs
  • No sensitive data in console.log
  • HTTPS used everywhere

Design & UX Checklist

Visual Design

  • Consistent color palette
  • Typography hierarchy clear
  • Dark mode supported
  • Icons consistent style
  • Proper spacing/margins
  • No UI clipping or overflow

User Experience

  • Onboarding flow complete
  • Navigation intuitive
  • Back buttons work correctly
  • Pull-to-refresh where expected
  • Haptic feedback on key actions
  • Keyboard dismisses appropriately
  • Forms validate in real-time

Accessibility

  • Text readable at all sizes
  • Touch targets 44pt minimum
  • Colors have sufficient contrast
  • Screen reader labels added
  • Supports Dynamic Type (iOS)

Performance

  • App starts in < 3 seconds
  • Animations run at 60fps
  • Images optimized and cached
  • No memory leaks
  • Lists virtualized (FlatList)
  • Bundle size reasonable (< 50MB)

App Store Assets Checklist

App Icon

  • 1024x1024 PNG created
  • No transparency (App Store requirement)
  • No alpha channel
  • Looks good at small sizes
  • Distinct from competitors
  • No text (usually)

Screenshots (iOS)

DeviceResolutionRequired
iPhone 6.7"1290 x 2796Yes
iPhone 6.5"1284 x 2778Yes
iPhone 5.5"1242 x 2208No
iPad Pro 12.9"2048 x 2732If iPad support
  • 4-10 screenshots per device size
  • First screenshot is most important
  • Show key features
  • Include text overlays explaining value
  • Consistent design across all screenshots

Screenshots (Android)

TypeResolutionRequired
Phone1080 x 1920 minimumYes
7" Tablet1200 x 1920If tablet support
10" Tablet1800 x 2560If tablet support
  • 2-8 screenshots
  • Feature graphic (1024 x 500)
  • High-res icon (512 x 512)

App Store Listing Checklist

App Information (Both Platforms)

  • App name (30 characters max)
  • Subtitle/short description (30-80 chars)
  • Full description written
  • Keywords/tags optimized
  • Category selected correctly
  • Support URL live
  • Privacy policy URL live
  • Marketing URL (optional)

iOS Specific

  • App Store Connect account ready
  • Bundle ID matches app.json
  • SKU defined
  • Content rights declared
  • Age rating questionnaire complete
  • Export compliance answered
  • IDFA usage declared

Android Specific

  • Google Play Console account ready
  • Package name matches app.json
  • Content rating questionnaire complete
  • Target audience declared
  • Data safety section complete
  • App access instructions (if login required)

Required Documents

  • Privacy Policy (link in app + stores)
  • Terms of Service (recommended)
  • EULA (for subscriptions)

Privacy Policy Must Include

  • What data you collect
  • How you use the data
  • Third-party services used
  • Data retention policy
  • User rights (GDPR/CCPA)
  • Contact information
  • Last updated date

Pre-Submission Testing Checklist

Device Testing

  • Tested on iPhone (recent model)
  • Tested on iPhone (older model)
  • Tested on Android phone
  • Tested on tablet (if supported)
  • Tested with slow network
  • Tested with no network

Flow Testing

  • Fresh install flow
  • Upgrade from free to paid
  • Logout and login again
  • Kill app and reopen
  • Background to foreground
  • Deep links work

Build & Submit Checklist

Pre-Build

  • Version number incremented
  • Build number incremented (or autoIncrement enabled)
  • All console.log removed (or production-safe)
  • Debug code removed
  • Environment variables for production
  • expo-constants pinned to exact "55.0.4" in package.json
  • web.output is "server" in app.json (required for API routes)
  • runtimeVersion is hardcoded string ("1.0.0"), not a policy object
  • ios.supportsTablet: false (unless you support iPad)
  • ITSAppUsesNonExemptEncryption: false in infoPlist
  • API keys (OPENAI_API_KEY) set as PLAINTEXT in EAS env (not SECRET)
  • API routes deployed via eas deploy (after setting env vars)
  • No ChatGPT/OpenAI/GPT/Claude references in any metadata

EAS Build

# Verify configuration
eas build:configure

# Build for production
eas build --platform all --profile production

# Check build status
eas build:list
  • Build completes successfully
  • Download and test the build
  • Install on real device
  • All features work in production build

Submit

# iOS
eas submit --platform ios

# Android
eas submit --platform android
  • Submission accepted
  • All metadata complete
  • No errors or warnings

Post-Launch Checklist

Monitoring Setup

  • Sentry error tracking enabled
  • RevenueCat dashboards accessible
  • Analytics tracking key events
  • Push notification setup (optional)

Quick Reference: Version Numbers

app.json
{
  "expo": {
    "version": "1.0.0",        // User-facing version
    "ios": {
      "buildNumber": "1"        // Increment each build
    },
    "android": {
      "versionCode": 1          // Increment each build
    }
  }
}
Rule: Version can stay same, buildNumber/versionCode must always increase.

Emergency Fixes

If App Gets Rejected

  1. Read the rejection reason carefully
  2. Don't panic - most are easy fixes
  3. Fix the issue
  4. Increment build number
  5. Rebuild and resubmit
  6. Add notes explaining the fix

Common Quick Fixes

RejectionFix
Broken linkUpdate URL, resubmit
Missing privacy policyAdd policy, link it
Crasher bugFix, test, rebuild
Incomplete metadataFill missing fields
Login issuesAdd demo account
100% Complete

Every item already checked off

All checklist items are already implemented, tested, and production-ready.

Auth flow complete
Security best practices
Store-ready config
Get ShipReactNative
Save 40+ hours of setup