Module 12: Production and Deployment
App Store Deployment
Deploy your app to the Apple App Store and Google Play Store
🎯 Learning Objectives
- Set up Apple App Store Connect and Google Play Console
- Prepare app metadata, screenshots, and descriptions
- Submit to TestFlight for iOS beta testing
- Submit to Google Play internal and beta tracks
- Use EAS Submit for automated submissions
- Navigate the app review process
Deployment Overview
Publishing your app to the stores involves several steps: building production binaries, preparing store listings, and navigating the review process.
The Deployment Pipeline
flowchart LR
subgraph Build["1. Build"]
B1[Production Build]
B2[Sign & Package]
end
subgraph Prepare["2. Prepare"]
P1[Store Listing]
P2[Screenshots]
P3[Metadata]
end
subgraph Submit["3. Submit"]
S1[Upload Binary]
S2[Submit for Review]
end
subgraph Review["4. Review"]
R1[App Review]
R2[Approval/Rejection]
end
subgraph Live["5. Live"]
L1[Published!]
end
Build --> Prepare --> Submit --> Review --> Live
style Build fill:#e3f2fd
style Prepare fill:#fff3e0
style Submit fill:#e8f5e9
style Review fill:#f3e5f5
style Live fill:#c8e6c9
Platform Comparison
| Aspect | Apple App Store | Google Play Store |
|---|---|---|
| Developer Fee | $99/year | $25 one-time |
| Review Time | 24-48 hours (typically) | Hours to days |
| Beta Testing | TestFlight | Internal/Closed/Open tracks |
| Binary Format | .ipa file | .aab file (App Bundle) |
| Console | App Store Connect | Google Play Console |
Prerequisites
Apple Developer Account
📱 Apple Developer Program
- Go to developer.apple.com/programs
- Enroll as Individual or Organization ($99/year)
- Complete identity verification
- Accept agreements in App Store Connect
Note: Organization enrollment requires a D-U-N-S number.
Google Play Developer Account
🤖 Google Play Console
- Go to play.google.com/console
- Sign in with Google account
- Pay one-time $25 registration fee
- Complete developer profile
- Verify identity (required for new accounts)
Production Build Ready
# Ensure you have production builds
eas build --platform all --profile production
# Wait for builds to complete
eas build:list
# You should have:
# - iOS: .ipa file (distribution: store)
# - Android: .aab file (buildType: app-bundle)
iOS: App Store Connect Setup
App Store Connect is Apple's portal for managing your iOS apps.
Create Your App
// Step 1: Login to App Store Connect
// https://appstoreconnect.apple.com
// Step 2: Go to "My Apps" → "+" → "New App"
// Step 3: Fill in app details:
// - Platform: iOS
// - Name: Your App Name (unique on App Store)
// - Primary Language: English (or your language)
// - Bundle ID: Select from dropdown (must match app.json)
// - SKU: Unique identifier (e.g., com.company.app.v1)
// - User Access: Full Access (or limited)
App Information
// Required information in App Store Connect:
// App Information Tab:
// - Name (30 characters max)
// - Subtitle (30 characters max)
// - Category (Primary and Secondary)
// - Content Rights
// - Age Rating
// Pricing and Availability:
// - Price (Free or Paid tiers)
// - Availability (countries/regions)
// App Privacy:
// - Privacy Policy URL (required)
// - Data collection practices
Prepare Screenshots
| Device | Size (pixels) | Required |
|---|---|---|
| iPhone 6.7" | 1290 x 2796 | Yes (scales to smaller) |
| iPhone 6.5" | 1284 x 2778 | Yes |
| iPhone 5.5" | 1242 x 2208 | Yes |
| iPad Pro 12.9" | 2048 x 2732 | If supporting iPad |
💡 Screenshot Tips
- Use 3-10 screenshots per device size
- First 3 screenshots are most important (shown in search)
- Add text overlays to highlight features
- Show real app content, not mockups
- Tools: Figma, Sketch, or screenshot services like AppMockUp
App Description
// Description (4000 characters max)
// Structure recommendation:
// Opening hook (first 1-2 sentences visible in search)
TaskFlow helps you stay organized and productive with
smart task management that adapts to your workflow.
// Key features (bullet points work well)
KEY FEATURES:
• Smart task organization with tags and priorities
• Collaborate with team members in real-time
• Set reminders and never miss a deadline
• Sync across all your devices
• Dark mode for comfortable nighttime use
// Social proof (if available)
"The best task app I've ever used" - TechCrunch
Featured in App Store's "Apps We Love"
// Call to action
Download TaskFlow today and transform how you work!
// Keywords (100 characters, comma-separated)
// Separate field for keywords - not visible to users
task, todo, productivity, organizer, reminder, gtd, project
iOS: Submission Process
Upload Build to App Store Connect
# Option 1: Using EAS Submit (recommended)
eas submit --platform ios
# Option 2: Manual upload via Transporter
# 1. Download Transporter from Mac App Store
# 2. Sign in with Apple ID
# 3. Drag .ipa file to Transporter
# 4. Click "Deliver"
# Option 3: Using xcrun (command line)
xcrun altool --upload-app -f MyApp.ipa \
-t ios \
-u "your@email.com" \
-p "app-specific-password"
TestFlight Beta Testing
flowchart LR
subgraph Internal["Internal Testing"]
I1[Up to 100 testers]
I2[App Store Connect users]
I3[No review required]
end
subgraph External["External Testing"]
E1[Up to 10,000 testers]
E2[Email invitation]
E3[Beta review required]
end
subgraph Public["Public Link"]
P1[Unlimited testers]
P2[Shareable link]
P3[Beta review required]
end
Internal --> External --> Public
// TestFlight Setup:
// 1. Build appears in App Store Connect (after processing)
// 2. Go to TestFlight tab
// 3. Add build to test group
// Internal Testing:
// - Add testers via email (must be App Store Connect users)
// - No beta review required
// - Builds available immediately
// External Testing:
// - Create test group
// - Add testers via email
// - Requires Beta App Review (usually < 24 hours)
// - Provide "What to Test" notes
// Public Link:
// - Enable public link for test group
// - Share link anywhere
// - Anyone can join up to tester limit
Submit for App Review
// In App Store Connect:
// 1. Select your build in the App Store tab
// 2. Complete all required fields:
// - Version Information
// - App Review Information
// - Rating
// - Review Notes (optional but helpful)
// 3. App Review Information:
// - Contact info for reviewer
// - Demo account credentials (if login required)
// - Notes about features that need explanation
// 4. Submit for Review
// - Review typically takes 24-48 hours
// - Can expedite in special circumstances
// 5. Post-submission:
// - Monitor for status changes
// - Respond quickly to any questions
// - Can reject submission and resubmit if needed
Common iOS Rejection Reasons
⚠️ Avoid These Common Mistakes
- Crashes: Test thoroughly before submission
- Placeholder content: No lorem ipsum or test data
- Broken links: All URLs must work
- Missing privacy policy: Required for all apps
- Inaccurate screenshots: Must match actual app
- Login issues: Provide working demo credentials
- Minimum functionality: App must do something useful
- Misleading metadata: Description must match functionality
Responding to Rejection
// If your app is rejected:
// 1. Read the rejection reason carefully
// - Resolution Center in App Store Connect
// - Often includes specific guideline violated
// 2. Options:
// a) Fix the issue and resubmit
// b) Reply to explain/clarify (if misunderstanding)
// c) Appeal (if you believe rejection is wrong)
// 3. Tips for successful resubmission:
// - Address ALL issues mentioned
// - Add detailed review notes explaining changes
// - Provide video walkthrough for complex features
// - Be polite and professional in communications
Android: Play Console Setup
Google Play Console is where you manage your Android apps.
Create Your App
// Step 1: Login to Google Play Console
// https://play.google.com/console
// Step 2: Click "Create app"
// Step 3: Fill in app details:
// - App name
// - Default language
// - App or game
// - Free or paid
// - Declarations (policies compliance)
// Step 4: Set up your app
// - Complete all dashboard tasks
// - This unlocks testing and production access
Store Listing
// Main store listing requirements:
// App Details:
// - App name (50 characters max)
// - Short description (80 characters max)
// - Full description (4000 characters max)
// Graphics:
// - App icon: 512 x 512 PNG
// - Feature graphic: 1024 x 500 (shown at top of listing)
// - Screenshots: minimum 2, up to 8 per device type
// - Phone screenshots: 16:9 or 9:16 aspect ratio
// - Video: YouTube URL (optional)
// Categorization:
// - App category
// - Tags (up to 5)
// - Contact email
// - Privacy policy URL
Screenshot Requirements
| Type | Dimensions | Quantity |
|---|---|---|
| Phone | 16:9 or 9:16, min 320px | 2-8 required |
| 7" Tablet | 16:9 or 9:16 | Optional |
| 10" Tablet | 16:9 or 9:16 | Optional |
App Content Setup
// Required policies and declarations:
// 1. Privacy Policy
// - Hosted URL required
// - Must cover data collection practices
// 2. App Access
// - If login required, provide test credentials
// - Or explain restricted access
// 3. Ads Declaration
// - Does app contain ads?
// 4. Content Rating
// - Complete IARC questionnaire
// - Automated rating based on answers
// 5. Target Audience
// - Age groups your app targets
// - Additional requirements for kids' apps
// 6. Data Safety
// - What data is collected
// - How data is used
// - Data sharing practices
Android: Submission Process
Testing Tracks
flowchart LR
subgraph Internal["Internal Testing"]
I1[Up to 100 testers]
I2[Email list]
I3[Immediate access]
end
subgraph Closed["Closed Testing"]
C1[Unlimited testers]
C2[Email or link]
C3[Review may be required]
end
subgraph Open["Open Testing"]
O1[Anyone can join]
O2[Listed in Play Store]
O3[Review required]
end
subgraph Prod["Production"]
P1[All users]
P2[Full release]
P3[Review required]
end
Internal --> Closed --> Open --> Prod
Upload Your App Bundle
# Option 1: Using EAS Submit (recommended)
eas submit --platform android
# Option 2: Manual upload in Play Console
# 1. Go to Release > Testing > Internal testing
# 2. Click "Create new release"
# 3. Upload your .aab file
# 4. Add release notes
# 5. Review and roll out
# First upload requirements:
# - Signed with upload key (EAS handles this)
# - Target API level must meet requirements
# - 64-bit support required
Internal Testing Setup
// Internal testing (recommended for first release):
// 1. Go to Release > Testing > Internal testing
// 2. Create new release
// 3. Upload .aab file
// 4. Add release name and notes
// 5. Review and start rollout
// Add testers:
// 1. Go to Internal testing > Testers tab
// 2. Create email list
// 3. Add tester emails
// 4. Testers receive invite link
// Testers join via:
// - Opt-in link (from Play Console)
// - Direct Play Store link (after opting in)
Production Release
// Before production release, complete:
// ✅ Store listing (all fields)
// ✅ Content rating questionnaire
// ✅ Pricing & distribution
// ✅ App content declarations
// ✅ Data safety form
// ✅ Target audience settings
// Create production release:
// 1. Go to Release > Production
// 2. Create new release
// 3. Upload .aab (or promote from testing)
// 4. Add release notes
// 5. Choose rollout percentage
// 6. Submit for review
// Staged rollout options:
// - Start with 5-10% of users
// - Monitor crashes and feedback
// - Increase to 100% when stable
Common Android Rejection Reasons
⚠️ Google Play Policy Violations
- Metadata policy: Misleading descriptions or graphics
- Impersonation: Copying other apps' branding
- Permissions: Requesting unnecessary permissions
- Data safety: Inaccurate data collection disclosure
- API level: Not targeting current requirements
- Functionality: App crashes or doesn't work
- Content policy: Prohibited content types
- Ads policy: Deceptive or intrusive ads
EAS Submit
EAS Submit automates the submission process to both app stores.
Configure EAS Submit
// eas.json submit configuration
{
"cli": {
"version": ">= 7.0.0"
},
"submit": {
"production": {
"ios": {
"appleId": "your@email.com",
"ascAppId": "1234567890",
"appleTeamId": "XXXXXXXXXX"
},
"android": {
"serviceAccountKeyPath": "./pc-api-key.json",
"track": "internal"
}
}
}
}
iOS Submission Setup
# Find your App Store Connect App ID:
# 1. Go to App Store Connect
# 2. Select your app
# 3. App Information > General > Apple ID
# Find your Team ID:
# 1. Go to developer.apple.com
# 2. Account > Membership
# 3. Team ID is listed there
# Submit iOS build
eas submit --platform ios
# Or submit a specific build
eas submit --platform ios --id [BUILD_ID]
# Interactive prompts if config missing:
# - Apple ID (email)
# - App-specific password (or use --apple-id and --asc-app-id)
# - Select app from list
Android Submission Setup
# Create Google Play Service Account:
# 1. Go to Google Cloud Console
# 2. Create new project (or select existing)
# 3. Enable Google Play Android Developer API
# 4. Create Service Account:
# - IAM & Admin > Service Accounts
# - Create Service Account
# - Name: "Play Console Upload"
# - Grant no roles initially
# 5. Create JSON key:
# - Click service account
# - Keys > Add Key > Create new key
# - Select JSON
# - Download the file
# 6. Link to Play Console:
# - Go to Play Console
# - Setup > API access
# - Link Google Cloud Project
# - Grant access to Service Account
# - Give "Release manager" permission
# 7. Update eas.json:
{
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./google-play-key.json",
"track": "internal"
}
}
}
}
# Submit Android build
eas submit --platform android
Available Android Tracks
// Track options for android submission:
{
"submit": {
"production": {
"android": {
// Testing tracks
"track": "internal", // Internal testing
"track": "alpha", // Closed testing
"track": "beta", // Open testing
// Production
"track": "production", // Full release
// Staged rollout (production only)
"releaseStatus": "inProgress",
"rollout": 0.1 // 10% rollout
}
}
}
}
Automated Submission Commands
# Submit latest build
eas submit --platform ios
eas submit --platform android
# Submit specific build
eas submit --platform ios --id [BUILD_ID]
# Submit to specific profile
eas submit --platform android --profile production
# Submit both platforms
eas submit --platform all
# Non-interactive (for CI/CD)
eas submit --platform all --non-interactive
# Auto-submit after build completes
eas build --platform ios --profile production --auto-submit
CI/CD Integration
# GitHub Actions: Build and Submit
name: Build and Submit
on:
push:
tags:
- 'v*'
jobs:
build-and-submit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Setup EAS
uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- name: Decode Google Play key
run: echo "${{ secrets.GOOGLE_PLAY_KEY }}" | base64 -d > google-play-key.json
- name: Build and Submit iOS
run: eas build --platform ios --profile production --auto-submit --non-interactive
- name: Build and Submit Android
run: eas build --platform android --profile production --auto-submit --non-interactive
The Review Process
Review Timeline
| Stage | iOS | Android |
|---|---|---|
| First Submission | 24-72 hours | Hours to 7 days |
| Updates | 24 hours typically | Hours typically |
| Expedited Review | Available for critical fixes | Not available |
What Reviewers Check
// Apple App Review checks:
// - App functions as described
// - No crashes or obvious bugs
// - Meets Human Interface Guidelines
// - Appropriate content rating
// - Privacy policy compliance
// - In-app purchase implementation
// - No hidden features
// - Accurate metadata and screenshots
// Google Play Review checks:
// - Policy compliance
// - Functionality testing
// - Content appropriateness
// - Security and data handling
// - Performance and stability
// - Accurate store listing
Tips for Smooth Review
✅ Best Practices
- Test thoroughly on multiple devices before submitting
- Provide demo account credentials for login-required apps
- Add detailed review notes explaining complex features
- Include video walkthrough for non-obvious functionality
- Ensure all links work (privacy policy, support, etc.)
- Use placeholder-free content (no lorem ipsum)
- Match screenshots to actual app appearance
- Respond quickly to reviewer questions
Post-Launch
// After your app is approved:
// 1. Monitor metrics
// - Downloads and installs
// - Crash reports
// - User reviews
// - Retention rates
// 2. Respond to reviews
// - Address negative feedback
// - Thank positive reviewers
// - Update app based on feedback
// 3. Plan updates
// - Regular bug fixes
// - New features
// - Performance improvements
// 4. Marketing
// - App Store Optimization (ASO)
// - Social media promotion
// - Press outreach
// - User acquisition campaigns
Hands-On Exercises
Exercise 1: Prepare Store Listing
Create a complete store listing for a task management app.
Show Solution
// App Store / Play Store Listing
// App Name (30 char iOS, 50 char Android)
TaskFlow - Smart Task Manager
// Subtitle (iOS only, 30 char)
Organize your life effortlessly
// Short Description (Android, 80 char)
Smart task management with reminders, collaboration, and seamless sync.
// Full Description (4000 char max)
TaskFlow transforms how you manage tasks and stay productive.
SMART TASK MANAGEMENT
• Create tasks with titles, descriptions, and due dates
• Organize with projects, tags, and priorities
• Set recurring tasks for habits and routines
• Add subtasks to break down complex projects
POWERFUL REMINDERS
• Location-based reminders
• Time-based notifications
• Smart suggestions based on your patterns
• Never miss an important deadline
SEAMLESS COLLABORATION
• Share projects with team members
• Assign tasks and track progress
• Comment and discuss within tasks
• Real-time sync across all devices
BEAUTIFUL DESIGN
• Clean, intuitive interface
• Dark mode for comfortable night use
• Customizable themes and colors
• Widget support for quick access
SYNC EVERYWHERE
• Works on iPhone, iPad, and Apple Watch
• Offline support with automatic sync
• End-to-end encryption for privacy
Start your free 14-day trial of TaskFlow Pro,
then $4.99/month or $39.99/year.
// Keywords (iOS, 100 char)
task,todo,reminder,productivity,gtd,checklist,planner,organize
// Category
Primary: Productivity
Secondary: Lifestyle
// Privacy Policy URL
https://taskflow.app/privacy
// Support URL
https://taskflow.app/support
Exercise 2: Configure EAS Submit
Set up eas.json for automated submission to both stores.
Show Solution
// eas.json
{
"cli": {
"version": ">= 7.0.0",
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"channel": "development"
},
"preview": {
"distribution": "internal",
"channel": "preview",
"ios": {
"simulator": false
},
"android": {
"buildType": "apk"
}
},
"production": {
"channel": "production",
"autoIncrement": true,
"ios": {
"resourceClass": "large"
},
"android": {
"buildType": "app-bundle",
"resourceClass": "large"
}
}
},
"submit": {
"preview": {
"android": {
"serviceAccountKeyPath": "./google-play-key.json",
"track": "internal"
}
},
"production": {
"ios": {
"appleId": "developer@taskflow.app",
"ascAppId": "1234567890",
"appleTeamId": "ABC123XYZ"
},
"android": {
"serviceAccountKeyPath": "./google-play-key.json",
"track": "production",
"releaseStatus": "inProgress",
"rollout": 0.1
}
}
}
}
// Usage:
// Build and auto-submit to stores
eas build --platform all --profile production --auto-submit
// Submit existing build
eas submit --platform all --profile production
// Submit to internal testing
eas submit --platform android --profile preview
Exercise 3: Create Release Checklist
Build a comprehensive pre-release checklist.
Show Solution
# App Release Checklist
## Pre-Build
- [ ] Version number updated in app.json
- [ ] Release notes prepared
- [ ] All features tested on physical devices
- [ ] No console.log statements in production code
- [ ] Environment variables set for production
- [ ] Privacy policy updated if data practices changed
## Store Listing
- [ ] Screenshots updated (if UI changed)
- [ ] Description updated (if features changed)
- [ ] "What's New" text prepared
- [ ] All links working (privacy, support, website)
- [ ] Content rating still accurate
## Build
- [ ] Production build created: `eas build --profile production`
- [ ] Build tested via internal distribution
- [ ] No crashes in testing
- [ ] All features work as expected
- [ ] Performance acceptable
## iOS Specific
- [ ] TestFlight beta tested
- [ ] Review notes updated
- [ ] Demo credentials ready (if needed)
- [ ] Export compliance updated (if using encryption)
## Android Specific
- [ ] Internal testing completed
- [ ] Data safety form accurate
- [ ] Target API level meets requirements
- [ ] 64-bit support verified
## Submission
- [ ] Submit to stores: `eas submit --platform all`
- [ ] Monitor submission status
- [ ] Team notified of pending release
## Post-Release
- [ ] Verify app appears in stores
- [ ] Test download and install
- [ ] Monitor crash reports (24-48 hours)
- [ ] Monitor user reviews
- [ ] OTA update ready if hotfix needed
- [ ] Marketing/announcement sent
Summary
🎯 Key Takeaways
- Developer accounts: Apple $99/year, Google $25 one-time
- Store listings: Prepare screenshots, descriptions, and metadata
- iOS process: App Store Connect → TestFlight → App Review → Release
- Android process: Play Console → Testing tracks → Review → Production
- EAS Submit: Automates submission to both stores
- Review times: iOS ~24-48h, Android varies
- Staged rollout: Release to percentage of users first
- Post-launch: Monitor crashes, reviews, and metrics
Submission Command Reference
# EAS Submit Commands
eas submit --platform ios # Submit iOS
eas submit --platform android # Submit Android
eas submit --platform all # Submit both
# Auto-submit with build
eas build --profile production --auto-submit
# Submit specific build
eas submit --platform ios --id [BUILD_ID]
# Non-interactive (CI/CD)
eas submit --platform all --non-interactive
In the next lesson, we'll cover crash reporting and analytics to monitor your app's health in production.