Store Submission Guide

Complete guide for submitting your app to the App Store and Google Play Store.


Table of Contents

  1. Pre-Submission Checklist
  2. App Store (iOS)
  3. Google Play Store (Android)
  4. Common Rejection Reasons
  5. Post-Submission

Pre-Submission Checklist

Technical Requirements

  • App runs without crashes on all target devices
  • All features work correctly offline (if applicable)
  • Deep links are configured and tested
  • Push notifications work correctly
  • Analytics tracking is properly implemented
  • Error tracking is configured
  • All API keys are production keys (not test/sandbox)
  • Remove all console.log statements or use production logger

Content Requirements

  • App icon meets platform guidelines
  • Screenshots for all required device sizes
  • App description (short and long)
  • Privacy policy URL
  • Terms of service URL (if applicable)
  • Support email/URL
  • Marketing URL (optional)
  • Privacy policy is up to date
  • GDPR compliance (if serving EU users)
  • CCPA compliance (if serving California users)
  • Age rating content is accurate
  • All third-party licenses are included

App Store (iOS)

1. Apple Developer Account Setup

1. Go to https://developer.apple.com
2. Enroll in Apple Developer Program ($99/year)
3. Complete enrollment verification
4. Set up App Store Connect access

2. App Store Connect Configuration

Create App Record

  1. Go to App Store Connect
  2. Click "My Apps" → "+" → "New App"
  3. Fill in:
    • Platform: iOS
    • Name: Your app name (max 30 characters)
    • Primary Language
    • Bundle ID: Must match app.jsonexpo.ios.bundleIdentifier
    • SKU: Unique identifier (e.g., com.yourcompany.appname.v1)

App Information

Category: Select primary and secondary category
Content Rights: Declare if using third-party content
Age Rating: Complete questionnaire honestly

Privacy Policy URL: https://yoursite.com/privacy
Support URL: https://yoursite.com/support
Marketing URL: https://yoursite.com (optional)

Pricing and Availability

  • Select price tier (or Free)
  • Choose countries/regions
  • Set pre-order options (optional)

3. Required Screenshots

DeviceSizeRequired
iPhone 6.7"1290 x 2796 pxYes
iPhone 6.5"1284 x 2778 pxYes
iPhone 5.5"1242 x 2208 pxOptional
iPad Pro 12.9"2048 x 2732 pxIf iPad supported

Screenshot Tips:

  • Show real app functionality
  • Use device frames (optional)
  • Add marketing text overlay
  • Maintain consistent style across all screenshots
  • Maximum 10 screenshots per device size

4. App Review Information

Contact Information:
  First Name: [Your name]
  Last Name: [Your last name]
  Phone: [Your phone]
  Email: [Your email]

Demo Account (if login required):
  Username: demo@example.com
  Password: demopassword123

Notes for Reviewer:
  - Explain any non-obvious features
  - Provide test credentials
  - Explain in-app purchases if applicable

5. In-App Purchases (if applicable)

  1. Go to "Features" → "In-App Purchases"
  2. Add each product:
    • Reference Name
    • Product ID (must match RevenueCat)
    • Pricing
    • Localized Display Name and Description
    • Review Screenshot

6. Build Submission with EAS

# Install EAS CLI
npm install -g eas-cli

# Login to Expo account
eas login

# Configure EAS
eas build:configure

# Build for iOS
eas build --platform ios --profile production

# Submit to App Store
eas submit --platform ios

7. TestFlight (Beta Testing)

1. Build is automatically available in TestFlight after processing
2. Add internal testers (up to 100)
3. Add external testers (up to 10,000)
4. External testing requires Beta App Review

Google Play Store (Android)

1. Google Play Developer Account Setup

1. Go to https://play.google.com/console
2. Pay one-time $25 registration fee
3. Complete account verification
4. Set up payments profile (for paid apps/IAP)

2. Create App in Play Console

  1. Go to "All apps" → "Create app"
  2. Fill in:
    • App name
    • Default language
    • App or game
    • Free or paid
    • Declarations (policies)

3. Store Listing

Main Store Listing

App name: Max 30 characters
Short description: Max 80 characters
Full description: Max 4000 characters

App icon: 512 x 512 px (PNG, 32-bit)
Feature graphic: 1024 x 500 px

Screenshots

TypeSizeRequired
Phone16:9 or 9:16Min 2, Max 8
7" Tablet16:9 or 9:16If tablet supported
10" Tablet16:9 or 9:16If tablet supported

Requirements:

  • Minimum: 320px
  • Maximum: 3840px
  • PNG or JPEG
  • No alpha transparency

4. App Content

Privacy Policy

1. Go to "Policy" → "App content"
2. Add Privacy policy URL
3. Must be accessible and specific to your app

Ads Declaration

Select: "Yes, my app contains ads" or "No, my app doesn't contain ads"

Content Rating

1. Start questionnaire
2. Answer questions about:
   - Violence
   - Sexual content
   - Language
   - Controlled substances
   - Miscellaneous
3. Receive ratings (ESRB, PEGI, etc.)

Target Audience

1. Select age groups your app targets
2. If targeting children:
   - Must comply with COPPA
   - Additional restrictions apply

Data Safety

Data Collection:
  - List all data types collected
  - Specify if data is encrypted
  - Specify if users can request deletion

Data Sharing:
  - List third parties data is shared with
  - Purpose of sharing

Security Practices:
  - Data encryption in transit
  - Data deletion request mechanism

5. In-App Products (if applicable)

  1. Go to "Monetize" → "Products" → "In-app products"
  2. For each product:
    • Product ID (must match RevenueCat)
    • Name and description
    • Price
    • Activate product

6. Build Submission with EAS

# Build for Android
eas build --platform android --profile production

# Submit to Google Play
eas submit --platform android

7. Testing Tracks

Internal Testing:
  - Up to 100 testers
  - Immediate availability
  - No review required

Closed Testing:
  - Limited users via email list
  - Review required
  - Good for beta testing

Open Testing:
  - Anyone can join
  - Review required
  - Good for public beta

Production:
  - Full release
  - Full review

Common Rejection Reasons

App Store (iOS)

ReasonSolution
Crashes/BugsTest thoroughly on all device sizes
Incomplete InformationFill all required metadata fields
Placeholder ContentRemove all lorem ipsum and test data
Broken LinksVerify all URLs work
Login IssuesProvide valid demo credentials
Missing Restore PurchasesImplement restore button for IAP
Guideline 4.2 - Minimum FunctionalityEnsure app provides value
Guideline 5.1.1 - Data CollectionAdd proper privacy disclosures

Google Play Store (Android)

ReasonSolution
Policy ViolationReview all Google Play policies
Metadata IssuesNo misleading descriptions/screenshots
Privacy PolicyMust be accessible and complete
PermissionsOnly request necessary permissions
Target API LevelMust target recent Android API
Data SafetyComplete data safety form accurately

Post-Submission

Monitoring

App Store Connect:
  - Check "Activity" tab for build status
  - Monitor "Resolution Center" for issues
  - View crash reports in "Analytics"

Google Play Console:
  - Check "Release" → "Production" for status
  - Monitor "Android Vitals" for crashes
  - View "Ratings and reviews"

Update Process

# Increment version in app.json
{
  "expo": {
    "version": "1.1.0"
  }
}

# Build new version
eas build --platform all --profile production

# Submit update
eas submit --platform all

App Store Optimization (ASO)

Keywords (iOS):
  - 100 character limit
  - Comma-separated
  - No spaces after commas
  - Don't repeat app name

Title & Description:
  - Include primary keywords
  - Focus on benefits
  - Use bullet points for features
  - Localize for target markets

Reviews:
  - Respond to all reviews
  - Ask happy users to rate
  - Address negative feedback

EAS Configuration

eas.json Example

{
  "cli": {
    "version": ">= 5.0.0"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal",
      "ios": {
        "simulator": false
      }
    },
    "production": {
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {
      "ios": {
        "appleId": "your-apple-id@email.com",
        "ascAppId": "123456789",
        "appleTeamId": "XXXXXXXXXX"
      },
      "android": {
        "serviceAccountKeyPath": "./google-service-account.json",
        "track": "production"
      }
    }
  }
}

Resources