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 |
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 |
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. |
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> |
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. |
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 |
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
- Configure
eas.jsonwith submission profiles - Run
eas submit --platform android - Use
eas submit --profile productionfor 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 |
|
DEPRECATED |
| APK Upload Failure | Upload of APK fails due to network or size issues |
|
NEW |
| Metadata Mismatch | App metadata (version, name) does not match store requirements |
|
EXPERIMENTAL |
Workflow: Resolving EAS Submit Failures
- Review logs for specific error messages
- Validate configuration in
eas.json - Check file paths and permissions
- Retry submission after fixing root cause
- Use
eas submit --dry-runto 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.