Skip to content

Submitting your app

Download listing folder on the Store submission page gives you a zip laid out exactly the way fastlane reads it. You upload it yourself, from your own developer account.

The practical effect is small: one command from your own machine instead of a button here. What it protects is the thing that gets template-built apps rejected — the app must be yours: your developer account, your name on the listing, your support URL.

For the App Store:

metadata/en-US/name.txt, subtitle.txt, description.txt, keywords.txt, …
metadata/copyright.txt, primary_category.txt
metadata/review_information/first_name.txt, demo_user.txt, demo_password.txt, notes.txt
screenshots/en-US/ ← your generated screenshots, numbered in order
review-notes.txt ← the same notes, loose, for pasting by hand
README.txt

For Google Play:

metadata/android/en-US/title.txt, short_description.txt, full_description.txt
metadata/android/en-US/images/ ← generated screenshots, plus your icon and feature graphic
app-access.txt ← the test account, to paste into the console
README.txt

Each file’s name matches the field name in the console, so you can copy them in by hand instead if you prefer.

Screenshots are included if you have generated them. If you have not, the folder holds a README listing the exact dimensions each store requires, so you can drop your own in before uploading.

That is deliberate. deliver reads a present-but-empty file as “clear this field”, so shipping an empty subtitle.txt would erase a subtitle you had already set in App Store Connect. An absent file leaves the existing value alone.

Terminal window
brew install fastlane
cd <the unzipped folder>
fastlane deliver init # asks for your Apple ID and bundle identifier
fastlane deliver --verify_only # shows what it would send, sends nothing
fastlane deliver # uploads

--verify_only is worth running first every time. It catches a rejected field in seconds rather than after an upload.

You need a Play Console service-account key first — Play Console → Setup → API access → create a service account, then download its JSON.

Terminal window
cd <the unzipped folder>
fastlane supply \
--package_name com.example.app \
--json_key /path/to/key.json \
--skip_upload_apk --skip_upload_aab

The two --skip_upload flags send the listing only. Upload the bundle itself separately — and note that it must be signed with your own upload key first, which Memberside does not yet do. See Android signing.

The demo password you entered is decrypted into metadata/review_information/demo_password.txt (App Store) or app-access.txt (Play). That is the one place it leaves Memberside.

Play has no listing field for it, so app-access.txt sits outside the metadata/ tree — paste it into Play Console under App content → App access.

SymptomCauseFix
deliver complains about missing screenshotsNone have been generated, and none were added by handTake screenshots, or add your own at the sizes the folder’s README lists
deliver init overwrites your metadataIt pulls the current listing down from App Store ConnectRun it in an empty folder first, then copy your files over
Play rejects the bundle, not the listingThe .aab is debug-signedSign it with your own upload key — see Android signing
A screenshot is rejected by PlayPlay caps the long side at twice the short sideFrame the screen on a shorter canvas rather than cropping it
A field uploads emptyIts file was empty rather than absentDo not create files for fields you want left alone
The download failsThe export is built when you clickTry again; if it persists, get in touch