Skip to main content

Submitting to App Stores (EAS Submit)

1. Submitting to Google Play

Field Description Value
platform Target platform android
track Release track production, internal, alpha, beta
releaseStatus Release status completed, draft
listings Listing details (optional) Object with language, title, shortDescription, fullDescription

Example: Submit to Google Play

expo submit:android --track production
Note: Ensure your app is built with the latest version of Expo SDK and includes all required metadata for Google Play Store submission.
Warning: You must have a Google Play Developer account and have uploaded the app to the store at least once before using EAS Submit.

2. Submitting to App Store

Field Description Value
app.store App Store identifier com.yourcompany.yourapp
app.bundleId Bundle identifier for iOS com.yourcompany.yourapp
app.version Version of the app to submit 1.0.0

Example: Submitting to App Store

expo submit --platform ios
Note: Ensure your app is built with the correct configuration before submitting to App Store.
Warning: App Store submission requires valid certificates and provisioning profiles.

3. Configuring Submit Profiles

Property Description Default Notes
android Android-specific configuration for submitting to Google Play {} See Android Configuration
ios iOS-specific configuration for submitting to App Store {} See iOS Configuration
channel Channel to use for submitting builds production Used to group builds for submission
platform Platform to submit builds for all Can be android, ios, or all

Example: Basic Submit Profile Configuration

{
  "submit": {
    "production": {
      "android": {
        "publisher": "google",
        "track": "production"
      },
      "ios": {
        "publisher": "apple",
        "appStore": "appstoreconnect"
      }
    }
  }
}

Android Configuration

Property Description Default Notes
publisher Publisher to use for submission google Currently only supports Google Play
track Track to publish the app to production Options: production, beta, alpha, internal
releaseStatus Status of the release completed Options: completed, draft, halted
listings Listing configuration for the app {} See Android Listings

iOS Configuration

Property Description Default Notes
publisher Publisher to use for submission apple Currently only supports Apple App Store
appStore App Store service to use for submission appstoreconnect Currently only supports App Store Connect
releaseStatus Status of the release completed Options: completed, draft, halted
listings Listing configuration for the app {} See iOS Listings

Android Listings Configuration

Property Description Default Notes
language Language code for the listing en-US ISO 639-1 language code
title Title of the app in this language My App Max 50 characters
shortDescription Short description of the app My App Description Max 80 characters
fullDescription Full description of the app My App Full Description Max 4000 characters

iOS Listings Configuration

Property Description Default Notes
language Language code for the listing en-US ISO 639-1 language code
title Title of the app in this language My App Max 30 characters
subtitle Subtitle of the app in this language My App Subtitle Max 30 characters
description Description of the app My App Description Max 4000 characters

4. Using Latest Build

When submitting your app to the app stores using EAS Submit, you can use the latest build available in your project. This is useful for quickly deploying updates without having to manually specify a build ID.

Option Values Description
--latest true Use the latest build available in your project.
--build-id <build-id> Specify a specific build ID to submit.

Example: Submitting Latest Build

eas submit --latest
Note: Ensure that your latest build is properly configured and signed before submitting to the app stores.

5. Providing Build ID

When submitting to app stores using EAS Submit, you must provide the build ID of the artifact you want to submit. This ID is generated when you run eas build and is required to associate your submission with the correct build.

Field Description Value
buildId The unique identifier for the build artifact <build-id>

Example: Providing Build ID in EAS Submit

eas submit --build-id <build-id>
Note: The build ID is generated during the eas build process and can be found in the output or in the EAS dashboard.

6. Configuring Release Track (Android)

Property Values Description
releaseTrack production, staging, testing Defines the release track for Android builds. Defaults to production.
rollout 100, 50, etc. Percentage of users to include in the release. Defaults to 100.

Example: Setting Release Track

{
  "android": {
    "releaseTrack": "staging",
    "rollout": 50
  }
}
Note: The releaseTrack setting affects how the build is submitted to Google Play Console.

7. Setting Release Status

Field Description Values Notes
status Release status "draft", "ready", "rejected" Controls visibility and submission state

Example: Setting Release Status

{
  "releases": [
    {
      "status": "ready"
    }
  ]
}
Note: Status "ready" makes the release eligible for store submission.

8. Using App Store Connect API Key

Field Description Value
apiKey API key for App Store Connect string
apiKeyId Unique identifier for the API key string
issuerId Issuer ID associated with the API key string

Example: Configuring EAS Submit with App Store Connect API Key

{
  "expo": {
    "build": {
      "ios": {
        "appStoreConnectApiKey": {
          "keyId": "API_KEY_ID",
          "issuerId": "ISSUER_ID",
          "key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
        }
      }
    }
  }
}
Note: The API key must be generated in App Store Connect and have appropriate permissions for submitting builds.

9. Using Google Service Account

Property Value Description
serviceAccountKey string Path to the Google Service Account JSON key file
projectID string Google Cloud Project ID where the app is registered
appID string App ID in Google Play Console (e.g., com.example.app)

Example: EAS Submit Configuration

{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "platforms": [
      "android"
    ],
    "android": {
      "package": "com.example.app",
      "versionCode": 1
    },
    "plugins": [
      [
        "expo-build-properties",
        {
          "android": {
            "compileSdkVersion": 34,
            "targetSdkVersion": 34
          }
        }
      ]
    ]
  },
  "eas": {
    "build": {
      "profiles": [
        {
          "name": "production",
          "platform": "android",
          "releaseChannel": "production",
          "distribution": "store"
        }
      ]
    },
    "submit": {
      "profiles": [
        {
          "name": "production",
          "platform": "android",
          "serviceAccountKey": "./google-service-account.json",
          "projectID": "my-project-123456",
          "appID": "com.example.app"
        }
      ]
    }
  }
}
Note: The service account must have the Android Developer role in Google Play Console.
Warning: Ensure the service account key file is securely stored and not committed to version control.

10. Automating Submission

Example: EAS Submit Configuration

{
  "expo": {
    "name": "MyApp",
    "slug": "my-app",
    "platforms": [
      "android",
      "ios"
    ],
    "plugins": [
      "expo-build-properties"
    ]
  },
  "experiments": {
    "easBuild": true
  }
}
Field Description Values
easBuild Enables EAS Build integration true

Workflow: Automating EAS Submit

  1. Configure eas.json with submission profiles
  2. Run eas submit --platform android
  3. Use eas submit --profile production for automated builds
Note: Ensure eas.json is configured with appropriate submission profiles before automating.

11. Handling Submission Errors

Example: Error handling in EAS Submit configuration

{
  "submit": {
    "production": {
      "android": {
        "artifacts": [
          "build/app-release.apk"
        ],
        "credentials": {
          "keystore": {
            "keystorePath": "android/keystore.jks",
            "keystorePassword": "secret",
            "keyAlias": "my-key-alias",
            "keyPassword": "secret"
          }
        },
        "releaseStatus": "completed",
        "errorHandling": {
          "retryAttempts": 3,
          "onFailure": "notifyTeam"
        }
      }
    }
  }
}
Error Type Description Resolution Steps Status
Invalid Keystore Provided keystore is invalid or corrupted
  1. Verify keystore file exists
  2. Check password and alias
  3. Re-generate keystore if needed
DEPRECATED
APK Upload Failure Upload of APK fails due to network or size issues
  1. Retry upload with stable connection
  2. Compress APK if over size limit
  3. Check EAS limits
NEW
Metadata Mismatch App metadata (version, name) does not match store requirements
  1. Validate app.json or app.config.js
  2. Ensure version matches store expectations
  3. Rebuild with correct metadata
EXPERIMENTAL

Workflow: Resolving EAS Submit Failures

  1. Review logs for specific error messages
  2. Validate configuration in eas.json
  3. Check file paths and permissions
  4. Retry submission after fixing root cause
  5. Use eas submit --dry-run to simulate submission
Note: EAS Submit logs are available in the Expo dashboard under Submissions tab.
Warning: Repeated submission failures may lead to account restrictions. Ensure all configurations are correct before retrying.

12. Managing App Metadata

Field Description Example Value Notes
name App name displayed to users "My Awesome App" Must be 3-50 characters
version App version string "1.0.0" Must follow semantic versioning
description App description for store listings "A powerful mobile app built with Expo" Max 1000 characters
icon App icon path (PNG or JPG) "./assets/icon.png" Recommended size: 1024x1024px
splash Splash screen image path "./assets/splash.png" Recommended size: 1024x1024px
orientation App orientation "portrait" Options: portrait, landscape
backgroundColor Background color for splash screen "#ffffff" Hex color code
ios.bundleIdentifier Bundle identifier for iOS "com.myapp" Must be unique per app
android.package Package name for Android "com.myapp" Must be unique per app
platforms Enabled platforms ["ios", "android"] Options: ios, android

Example: app.json configuration

{
  "expo": {
    "name": "My Awesome App",
    "version": "1.0.0",
    "description": "A powerful mobile app built with Expo",
    "icon": "./assets/icon.png",
    "splash": {
      "image": "./assets/splash.png",
      "backgroundColor": "#ffffff"
    },
    "ios": {
      "bundleIdentifier": "com.myapp"
    },
    "android": {
      "package": "com.myapp"
    },
    "platforms": ["ios", "android"]
  }
}
Note: Metadata fields in app.json are used by the app stores to display information about your app. Ensure all fields are properly set before submitting to the App Store or Google Play.

Was this article helpful?