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)
| Device | Resolution | Required |
|---|---|---|
| iPhone 6.7" | 1290 x 2796 | Yes |
| iPhone 6.5" | 1284 x 2778 | Yes |
| iPhone 5.5" | 1242 x 2208 | No |
| iPad Pro 12.9" | 2048 x 2732 | If 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)
| Type | Resolution | Required |
|---|---|---|
| Phone | 1080 x 1920 minimum | Yes |
| 7" Tablet | 1200 x 1920 | If tablet support |
| 10" Tablet | 1800 x 2560 | If 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)
Legal & Compliance Checklist
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
- Read the rejection reason carefully
- Don't panic - most are easy fixes
- Fix the issue
- Increment build number
- Rebuild and resubmit
- Add notes explaining the fix
Common Quick Fixes
| Rejection | Fix |
|---|---|
| Broken link | Update URL, resubmit |
| Missing privacy policy | Add policy, link it |
| Crasher bug | Fix, test, rebuild |
| Incomplete metadata | Fill missing fields |
| Login issues | Add 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