Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Official Expo AI agent skill for deploying Expo apps to App Store and Google Play.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/play-store.md
1# Submitting to Google Play Store23## Prerequisites451. **Google Play Console Account** - Register at [play.google.com/console](https://play.google.com/console)62. **App Created in Console** - Create your app listing before first submission73. **Service Account** - For automated submissions via EAS89## Service Account Setup1011### 1. Create Service Account12131. Go to Google Cloud Console → IAM & Admin → Service Accounts142. Create a new service account153. Grant the "Service Account User" role164. Create and download a JSON key1718### 2. Link to Play Console19201. Go to Play Console → Setup → API access212. Click "Link" next to your Google Cloud project223. Under "Service accounts", click "Manage Play Console permissions"234. Grant "Release to production" permission (or appropriate track permissions)2425### 3. Configure EAS2627Add the service account key path to `eas.json`:2829```json30{31"submit": {32"production": {33"android": {34"serviceAccountKeyPath": "./google-service-account.json",35"track": "internal"36}37}38}39}40```4142Store the key file securely and add it to `.gitignore`.4344## Environment Variables4546For CI/CD, use environment variables instead of file paths:4748```bash49# Base64-encoded service account JSON50EXPO_ANDROID_SERVICE_ACCOUNT_KEY_BASE64=...51```5253Or use EAS Secrets:5455```bash56eas secret:create --name GOOGLE_SERVICE_ACCOUNT --value "$(cat google-service-account.json)" --type file57```5859Then reference in `eas.json`:6061```json62{63"submit": {64"production": {65"android": {66"serviceAccountKeyPath": "@secret:GOOGLE_SERVICE_ACCOUNT"67}68}69}70}71```7273## Release Tracks7475Google Play uses tracks for staged rollouts:7677| Track | Purpose |78|-------|---------|79| `internal` | Internal testing (up to 100 testers) |80| `alpha` | Closed testing |81| `beta` | Open testing |82| `production` | Public release |8384### Track Configuration8586```json87{88"submit": {89"production": {90"android": {91"track": "production",92"releaseStatus": "completed"93}94},95"internal": {96"android": {97"track": "internal",98"releaseStatus": "completed"99}100}101}102}103```104105### Release Status Options106107- `completed` - Immediately available on the track108- `draft` - Upload only, release manually in Console109- `halted` - Pause an in-progress rollout110- `inProgress` - Staged rollout (requires `rollout` percentage)111112## Staged Rollout113114```json115{116"submit": {117"production": {118"android": {119"track": "production",120"releaseStatus": "inProgress",121"rollout": 0.1122}123}124}125}126```127128This releases to 10% of users. Increase via Play Console or subsequent submissions.129130## Submission Commands131132```bash133# Build and submit to internal track134eas build -p android --profile production --submit135136# Submit existing build to Play Store137eas submit -p android --latest138139# Submit specific build140eas submit -p android --id BUILD_ID141```142143## App Signing144145### Google Play App Signing (Recommended)146147EAS uses Google Play App Signing by default:1481491. First upload: EAS creates upload key, Play Store manages signing key1502. Play Store re-signs your app with the signing key1513. Upload key can be reset if compromised152153### Checking Signing Status154155```bash156eas credentials -p android157```158159## Version Codes160161Android requires incrementing `versionCode` for each upload:162163```json164{165"build": {166"production": {167"autoIncrement": true168}169}170}171```172173With `appVersionSource: "remote"`, EAS tracks version codes automatically.174175## First Submission Checklist176177Before your first Play Store submission:178179- [ ] Create app in Google Play Console180- [ ] Complete app content declaration (privacy policy, ads, etc.)181- [ ] Set up store listing (title, description, screenshots)182- [ ] Complete content rating questionnaire183- [ ] Set up pricing and distribution184- [ ] Create service account with proper permissions185- [ ] Configure `eas.json` with service account path186187## Common Issues188189### "App not found"190191The app must exist in Play Console before EAS can submit. Create it manually first.192193### "Version code already used"194195Increment `versionCode` in `app.json` or use `autoIncrement: true` in `eas.json`.196197### "Service account lacks permission"198199Ensure the service account has "Release to production" permission in Play Console → API access.200201### "APK not acceptable"202203Play Store requires AAB (Android App Bundle) for new apps:204205```json206{207"build": {208"production": {209"android": {210"buildType": "app-bundle"211}212}213}214}215```216217## Internal Testing Distribution218219For quick internal distribution without Play Store:220221```bash222# Build with internal distribution223eas build -p android --profile development224225# Share the APK link with testers226```227228Or use EAS Update for OTA updates to existing installs.229230## Monitoring Submissions231232```bash233# Check submission status234eas submit:list -p android235236# View specific submission237eas submit:view SUBMISSION_ID238```239240## Tips241242- Start with `internal` track for testing before production243- Use staged rollouts for production releases244- Keep service account key secure - never commit to git245- Set up Play Console notifications for review status246- Pre-launch reports in Play Console catch issues before review247