10 examples to get you started with Store Operations - 7 basic and 3 intermediate. Each example moves one step along the build → test → submit → release → monitor path for Expo SDK 57 apps on App Store Connect and Google Play Console.
Link the project to EAS and configure at least a production build profile in eas.json. Store uploads require store distribution builds - not development or simulator artifacts.
Every store upload needs a new build number (iOS) and versionCode (Android). Marketing version can stay the same for hotfixes; native integers must always increase.
Reviewers need working credentials, feature flags off, and reproduction paths - especially for login-gated Expo apps.
<!-- store/review-notes-ios.md -->## App Review notes (iOS)**Demo account**- Email: reviewer@example.com- Password: ReviewDemo2026!**How to test core flow**1. Launch app → tap Sign In → use demo account above2. Home → tap Scan → grant Camera when prompted → scan any UPC3. Profile → Settings → Delete Account (required for account-creation apps)**Backend**- Production API; no VPN required- Push notifications: send test from Profile → Notification test**ATT / tracking**- We do not track users across apps; ATT prompt is not shown- Analytics: first-party only (Sentry crashes, no ad ID)**Contact**- engineering-mobile@example.com (responds within 4 business hours)
Attach the same content in App Store Connect → App Review Information → Notes
Update passwords every release - expired demo accounts cause false rejections
Mention if features are geo-gated or require hardware (NFC, LiDAR)
Store approval is not the finish line - watch crashes and ANRs as rollout percentage increases.
// lib/releaseHealth.ts - tag sessions with store buildimport * as Application from "expo-application";import Constants from "expo-constants";export function releaseContext() { return { appVersion: Application.nativeApplicationVersion, buildNumber: Application.nativeBuildVersion, updateId: Constants.expoConfig?.updates?.checkAutomatically, platform: Application.applicationId, };}
## First 72 hours after live- [ ] Crash-free sessions ≥ 99.5% (Sentry / Play Vitals)- [ ] No spike in 1-star reviews mentioning "crash" or "login"- [ ] iOS phased release day 1–2: hold at 1% if crashes climb- [ ] Play staged rollout: pause at 20% if ANR rate doubles baseline- [ ] Support inbox macro ready for "update app" replies
Compare build number in crash reports to the build you promoted - OTA cannot fix native regressions
A recurring calendar prevents "Friday submit" surprises and aligns marketing with phased rollout timing.
<!-- docs/release-train.md -->| Week | Activity | Owner ||------|----------|-------|| T-14 | Feature freeze on `main` | EM || T-10 | Cut `release/x.y.z`, bump build numbers | Mobile lead || T-7 | TestFlight + Play internal to QA | QA || T-5 | Metadata + privacy forms signed off | PM + Legal || T-3 | `eas submit` both platforms | Mobile lead || T-2 | iOS: submit for review; Android: production with 5% rollout | Mobile lead || T-0 | iOS: release with phased 7-day; Android: 20% → 50% → 100% | Mobile lead || T+1 | Go/no-go from crash dashboards | On-call |
iOS phased release takes up to 7 days to reach 100% - plan marketing pushes after day 3–4 if metrics are clean
Play staged rollout is manual percentage - document who can pause it (see incident runbook)
EU Digital Services Act trader forms and age ratings must be complete before T-3 or EU territories block