Help › Mobile app › Publish to Play Store & App Store
Mobile app: publish to Play Store & App Store
From tested code to the SiteCash app in Google Play and the Apple App Store: the live server, production builds, both store consoles step by step, app review, and how to ship updates. Every command is explained.
The release path
- Live server on
https://with the app API — apps in the stores cannot use your PC. - Production builds in Expo's cloud: an Android App Bundle (
.aab) and an iPhone app (.ipa). - Store listings: text, screenshots, privacy answers, a demo login for the reviewers.
- Testing with your team: Google Play internal/closed testing, Apple TestFlight.
- Review by Google and Apple, then release to everyone.
- Updates: raise the version, build, upload, release.
Plan about 1–2 weeks for the first release: account approvals, the first reviews and (for a personal Google account) a 14-day closed test.
Accounts and costs
| Account | Cost | Notes |
|---|---|---|
| Expo — expo.dev | Free plan works (builds can queue); paid plans build faster | Project @dbarmai/sitecash already exists. |
| Google Play Console — play.google.com/console | US$25 once | Identity verification. Organization account: needs a D-U-N-S number, publisher name = company. Personal account: before going public you must run a closed test with at least 12 testers for 14 days. |
| Apple Developer Program — developer.apple.com | US$99 a year | Organization enrolment needs a D-U-N-S number and a company website. Keep the membership paid, or the app is removed from the store. |
| Firebase — console.firebase.google.com | Free | Android notifications (project sitecash-pettycash already set up). |
1. Live server
Deploy SiteCash as described in DEPLOY.md on a domain with HTTPS, for example https://app.sitecash.in. Installed apps refuse plain http://. Then check:
| Setting on the server | Value | Why |
|---|---|---|
APP_URL | https://app.sitecash.in | Links in alerts; the app's "Open on the web", Help, Privacy links. |
SUPPORT_EMAIL | e.g. support@sitecash.in | Shown on the privacy and account-deletion pages that both stores require. |
PUSH_MODE | empty (means expo in production) | Sends phone notifications. |
EXPO_ACCESS_TOKEN | only if "Enhanced push security" is on in Expo | Allows the server to send notifications for the project. |
MIGRATE_ON_START | true (Docker) or run npm run db:migrate | Applies database updates, including app logins (0008_mobile_sessions). |
Check in a browser (use your domain):
https://app.sitecash.in/api/health→{"ok":true,"db":"up",…}https://app.sitecash.in/privacyand/account-deletion→ pages show your support emailhttps://app.sitecash.in/help/index.html→ the manual
2. Final app settings
App ids (decide once)
In mobile/app.json: android.package and ios.bundleIdentifier are com.sitecash.app. They can never change after the first store release — a new id is a different app. If you change the Android package, also add that package as an app in Firebase and replace google-services.json.
Server address for store builds
The address is written into the app when it is built. Store it in Expo for the production (store) and preview (tester APK) builds:
cd C:\Projects\PettyCash-RealEstate\mobile
eas env:set --environment production --name EXPO_PUBLIC_API_URL --value https://app.sitecash.in --visibility plaintext
eas env:set --environment preview --name EXPO_PUBLIC_API_URL --value https://app.sitecash.in --visibility plaintext
eas env:list production # check what the production build will use
--visibility plaintext: the value is not secret (it is visible inside the app anyway). To change it later run the same eas env:set command with the new value, or manage it on expo.dev → project → Environment variables.
Version
"version" in app.json is what users see (start with 1.0.0). The internal build numbers (Android versionCode, iOS buildNumber) are counted by Expo and go up by themselves on each production build ("appVersionSource": "remote" and "autoIncrement": true in eas.json).
Try a preview build first
eas build -p android --profile preview
This is the same app as the store version but installed from a link (APK), connected to the live server. Install it on a few phones and go through the test checklist before building for the stores.
3. Signing and push keys
Stores only accept apps signed with your keys. EAS creates and keeps them for you.
| Key | Created | What to do |
|---|---|---|
| Android upload keystore | On the first Android build ("Generate a new Android Keystore?" → yes) | Download a backup and keep it safe: eas credentials → Android → production → Keystore: Manage everything needed to build your project → Download existing keystore. Google Play then re-signs the app with its own key (Play App Signing). |
| Firebase key for Android notifications (FCM V1) | You upload it once | See the development setup, step 7a. It serves development and store builds. |
| iOS distribution certificate, provisioning profile, push key | On the first iOS production build (sign in with your Apple ID) | Answer yes to create each. Check with eas credentials -p ios. |
| App Store Connect API key | On the first eas submit -p ios | Let EAS create it; it is used for uploads. |
| Google Play service account key | You create it (step 7g) | Only for uploading from the command line. |
mobile/.gitignore already ignores the usual file names.4. Production builds
cd C:\Projects\PettyCash-RealEstate\mobile
git pull # build the latest committed code
eas build -p android --profile production # → .aab for Google Play
eas build -p ios --profile production # → .ipa for the App Store
# or both at once:
eas build -p all --profile production
- Each build takes about 15–40 minutes. Follow it on the link shown, or list builds with
eas build:list. - The
productionprofile uses theproductionenvironment variables (your https server address) and raises the build number. - You can build and upload in one go with
--auto-submitonce the store setup below is done:eas build -p all --profile production --auto-submit.
5. Demo login for reviewers
Google and Apple both sign in to test the app. They need a working login that is not a real company. Create the made-up demo company on the live database once:
cd C:\Projects\PettyCash-RealEstate
$env:DATABASE_URL = "postgres://…your live database…"
$env:SAMPLE_PASSWORD = "Review-2026!secure" # choose your own strong password
$env:SAMPLE_ONLY_COMPANY = "1" # only the demo company, no extra sample companies
npx tsx scripts/seed-sample.ts
It creates Sunrise Developers Pvt Ltd with an active plan for one year, sites, entries with bill photos, vendor bills and cash requests, and these logins (with your password):
kiran@sunrise.example— site user (give this to reviewers)neha@sunrise.example— accountant (give this too, to show approvals)ravi@sunrise.example— owner
6. Screenshots and graphics
| Item | Google Play | App Store |
|---|---|---|
| App icon | 512 × 512 PNG (resize mobile/assets/images/icon.png) | Taken from the build automatically |
| Feature graphic | 1024 × 500 PNG/JPG, required | — |
| Phone screenshots | 2–8, portrait, e.g. 1080 × 1920 or larger | At least 1 (up to 10) for the 6.9-inch iPhone (1320 × 2868) or 6.7-inch (1290 × 2796) |
- Install the preview/production app on a phone, log in with the demo company (step 5).
- Capture: Home, Cash book, New expense with a bill photo, Voucher, Approvals (as Neha), Request cash. Android: Power + Volume down. iPhone: Side button + Volume up. For the App Store use a large iPhone (e.g. iPhone 15/16 Plus or Pro Max) so the size matches.
- Use only the demo company — never real company names or amounts.
7. Google Play
7a. Create the app
- Play Console → Create app.
- App name SiteCash – Site Petty Cash, default language English (India) or English (US), App, Free. Accept the declarations → Create app.
7b. App content (Dashboard → "Set up your app")
| Section | Answer |
|---|---|
| Privacy policy | https://app.sitecash.in/privacy |
| App access | All or some functionality is restricted → add instructions: name "Demo site user", username kiran@sunrise.example, password; and "Demo accountant" neha@sunrise.example. Note: "Accounts are created by the customer company on the web; no sign-up in the app." |
| Ads | No ads |
| Content rating | Fill the questionnaire: category Utility, Productivity, Communication, or Other; answer No to violence, sexual content, gambling, etc. Result: Everyone. |
| Target audience | 18 and over |
| News app / Government app / Health | No |
| Financial features | The app is a business expense record; it does not lend, bank, trade or move money. Choose the option that it provides no financial features (answer truthfully if you add such features later). |
| Data safety | See below |
| Data deletion | Web link: https://app.sitecash.in/account-deletion |
7c. Data safety answers
| Question | Answer |
|---|---|
| Does the app collect or share user data? | Yes, collects |
| Encrypted in transit? | Yes |
| Can users request deletion? | Yes (the deletion web link) |
| Personal info | Name, Email address, Phone number — collected, not shared, required (phone optional), for App functionality and Account management |
| Photos and videos | Photos (bill photos) — collected, not shared, optional, App functionality |
| Files and docs | Collected (PDF bills), not shared, optional, App functionality |
| App info and performance / App activity | Other user-generated content (cash entries, notes) — collected, App functionality |
| Device or other IDs | Collected (notification token), App functionality |
| Location, contacts, financial info, health, messages, web history | Not collected |
7d. Store listing
Grow users → Store presence → Main store listing: short and full description (text to paste), 512 × 512 icon, 1024 × 500 feature graphic, phone screenshots. Store settings: category Business, contact email = your support email, website = your domain.
7e. First upload: internal testing
- Test and release → Testing → Internal testing → Testers: create an email list with your team's Google accounts.
- Create new release. When asked about app signing, keep Google-managed signing (Play App Signing).
- Download the
.aabfrom the build page on expo.dev and drag it into App bundles. (Google requires this first upload by hand.) - Release name is filled in; add release notes ("First release"). Next → Save and publish.
- Share the join link from the Testers tab. Testers open it, accept, and install SiteCash from the Play Store.
7f. Closed testing (personal accounts) and production
- Personal developer account: create a Closed testing track, add at least 12 testers who stay opted in for 14 days, then use Apply for production on the dashboard. (Organization accounts can skip this.)
- Production → Create new release → Add from library (choose the tested bundle) → release notes → countries (e.g. India) → Save.
- Publishing overview → Send changes for review. The first review can take from a few hours to about a week; you get an email.
7g. Upload later versions from the command line (optional)
- Google Cloud console (same Google account) → create a service account → create a JSON key and download it (keep it outside the repo).
- Play Console → Users and permissions → Invite new users → the service account's email → give it release permissions for SiteCash.
- Then, after each Android production build:
The first time it asks for the JSON key file and remembers it.eas submit -p android --latest--latestuploads your most recent build. Uploads go to the internal testing track; promote them in the Play Console.
8. Apple App Store
8a. Upload the build
cd C:\Projects\PettyCash-RealEstate\mobile
eas submit -p ios --latest
Sign in with your Apple ID when asked. EAS creates the app record in App Store Connect if it does not exist (name, bundle id, SKU), creates an App Store Connect API key, and uploads the latest iOS production build. Apple then processes it (about 15–60 minutes; you get an email).
8b. TestFlight
- App Store Connect → Apps → SiteCash → TestFlight.
- The encryption question does not appear:
app.jsonalready declares the app uses only standard HTTPS. - Internal testing: add people from your App Store Connect team (up to 100) — available at once. External testing (anyone by email or public link): the first build needs a short Beta App Review.
- Testers install the TestFlight app and accept the invitation.
8c. App information
| Field | Value |
|---|---|
| Name / Subtitle | SiteCash – Site Petty Cash / Petty cash book for builders |
| Category | Business (secondary: Finance or Productivity) |
| Age rating | Answer "None" to all → 4+ |
| Pricing | Free, all countries (or only India) |
| Privacy policy URL | https://app.sitecash.in/privacy |
| App Privacy (data types) | Contact Info (name, email, phone), User Content (photos, other user content), Identifiers (user ID) — all linked to the user, purpose App Functionality, not used for tracking. |
8d. Prepare the version and submit
- App Store tab → version 1.0: screenshots (6.9-inch or 6.7-inch), promotional text, description, keywords (e.g. petty cash,expense,voucher,builder,construction,site,bill,approval,tally), support URL (your domain), marketing URL (optional).
- Build → Add Build → choose the tested build.
- App Review Information: sign-in required →
kiran@sunrise.example+ password; contact name, phone, email. Notes:SiteCash is a business app for construction companies. Accounts are created and paid for by the customer company on the SiteCash website; there is no sign-up or purchase in the app. Demo site user: kiran@sunrise.example. Demo accountant (can approve entries): neha@sunrise.example. Both use the password above. Office features (vendor bills, reports, Tally export) are on the website. - Version Release: "Manually release this version" (you choose the day) or "Automatically".
- Add for Review → Submit for Review. Status goes Waiting for Review → In Review → Pending Developer Release / Ready for Distribution, usually within 1–3 days.
Store text to paste
| App name (Play max 30 / Apple max 30) | SiteCash – Site Petty Cash |
| Short description (Play, max 80) | Site petty cash book with bill photos, approvals and cash requests. |
| Subtitle (Apple, max 30) | Petty cash book for builders |
| Promotional text (Apple, max 170) | Record site expenses with bill photos, even offline. Accountants approve from their phone. Works with the SiteCash website and Tally. |
Full description (both stores):
SiteCash is the petty cash book for construction sites. Site staff record every
expense and every rupee received from their phone, with a photo of the bill —
even without signal; entries upload when the phone is back online.
• Cash book per site with running balance and low-balance warnings
• Expenses, cash received and cash returned with bill photos
• Approvals: accountants approve or send entries back with a note
• Cash requests with the site's spending pace and a suggested amount
• Alerts on the phone for requests, approvals and low balance
• Works with the SiteCash website for vendor bills, reports and Tally export
A SiteCash company account is needed; your company's admin adds you.
Release notes for version 1.0.0: First release: site cash book, expenses with bill photos, approvals, cash requests, alerts and offline entries.
9. Updates
- Raise
"version"inmobile/app.json:1.0.1for fixes,1.1.0for new features. Commit and push. - Build:
eas build -p all --profile production(build numbers go up by themselves). - Upload:
eas submit -p android --latestandeas submit -p ios --latest. - Play Console: promote the release from internal testing to production (you can use a staged rollout, e.g. 20% of users first). App Store Connect: create the new version, choose the build, add "What's New", submit (you can use phased release over 7 days).
/api/mobile/v1) keeps working the same way. If an API change would break older app versions, add a new version path (/api/mobile/v2) and keep the old one until users have updated. App code changes always need a new store version (instant over-the-air updates are not set up).Yearly: Google Play requires apps to target a recent Android version (the deadline is usually each August), and Apple requires builds made with a recent Xcode. Upgrade the Expo SDK about once a year (npx expo install expo@latest --fix, then follow Expo's upgrade notes), test, and release an update.
10. After launch
- Crashes and errors: Play Console → Android vitals; App Store Connect → TestFlight and Analytics → Crashes. Server errors: your server logs.
- Reviews: answer store reviews from both consoles.
- Keep active: Apple Developer membership (yearly), the demo company's plan, and the Firebase project.
- Tell customers: owners can share the store links with site staff; staff log in with their existing SiteCash email and password.
Troubleshooting
| Problem | Why | Fix |
|---|---|---|
| Installed app cannot connect, but the website works | Build uses a wrong or http:// address, or the server is older | eas env:list production; fix with eas env:set and rebuild. Deploy the latest server and migrations. |
| iOS build: bundle identifier not available | Another Apple account owns com.sitecash.app | Change ios.bundleIdentifier to your own and build again. |
| Play: "package name already exists" / "used by another app" | The id is taken | Change android.package, add it in Firebase, replace google-services.json, rebuild. |
| Play: "Version code … has already been used" | A build number was reused (e.g. after a manual upload) | eas build:version:set -p android to a higher number, then rebuild. |
| Play: "signed with the wrong key" | The bundle was signed with a different keystore | Build with EAS using the same project credentials; never replace the keystore after the first upload (restore your backup if needed). |
| No notifications in the store app | Missing FCM key or APNs key, or PUSH_MODE=off | eas credentials (Android: FCM V1 key; iOS: push key); check the server setting; check the phone allows notifications for SiteCash. |
| Review: "unable to sign in" / demo account | Demo login wrong, or the demo company is view-only | Test the demo login on a store build; extend its plan in Platform admin; update the review notes. |
| Review: account deletion (Apple 5.1.1 / Play policy) | Reviewer looks for deletion | Point to More → Delete my account in the app and the web page /account-deletion. |
| Review: payments (Apple 3.1.1) | Reviewer thinks access is sold outside the App Store | Reply that SiteCash is a business service bought by companies for their staff on the web, with no purchases or price mentions in the app. |
| A build fails | Many causes | Open the failed build on expo.dev, read the red step; run npx expo-doctor in mobile/. |
Developing and testing the app: Development setup. The technical API contract: docs/mobile-api.md in the code.