Skip to main content

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

  1. Go to developer.apple.com/programs
  2. Enroll as Individual or Organization ($99/year)
  3. Complete identity verification
  4. Accept agreements in App Store Connect

Note: Organization enrollment requires a D-U-N-S number.

Google Play Developer Account

🤖 Google Play Console

  1. Go to play.google.com/console
  2. Sign in with Google account
  3. Pay one-time $25 registration fee
  4. Complete developer profile
  5. 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.