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.

If you’d rather not, the Memberside team can do the submission for you, still from your account — see Managed services.

The practical effect is small: one command from your own machine instead of a button here. On iPhone it is smaller still, because the build itself is delivered for you — what you upload is the listing around it. What this 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.

The binary is already there. With an App Store Connect key on your site, each iOS build goes to TestFlight on its own, so what follows uploads your metadata and screenshots, not the app. If a build never arrived, How iOS builds work covers the Transporter fallback.

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. The build list can do that for you: see Sending builds to Google Play.

The .aab has to be signed with your own upload key, which Memberside does once that key is set up — a build without one is signed for testing and Play will refuse it. 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 listingThat build was signed for testing rather than with your upload keySet up your key, then build again — 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