First release checklist
The one-time work before your very first submission: what needs a human’s identity, money or judgement, or has no API at all.
Everything the submit pipeline scripts is off this list. What remains is short, and most of it can be started before the app is finished.
Accounts and money
- Apple Developer Program enrolment, $99 a year. Enrolment can take days and nothing else starts without it
- Google Play Developer account, $25 once
- Store banking and tax agreements. Required before any paid distribution or in-app
purchase, and a version sits blocked without them.
asc web agreements statusreads Apple’s; accepting them is a website job on both stores - The Play app record. Not in Google’s API, and unlike Apple there is no web-session
fallback either. Play Console → Create app, with the package name from
config.js’sgeneral.androidPackageName
Credentials
Covered in full on Store credentials.
- The App Store Connect API key. Generate the
.p8, note the Key ID and Issuer ID, and move the file to~/.appstoreconnect/. Apple offers that download once, and it lands in~/Downloadswhere a terminal cannot read it. Read the credentials page before you click Generate - The Google Play service account, saved to
credentials/google-play-service-account.json, with Release and store-presence access granted to that address in Play Console brew install asc, thenasc auth doctor- An Apple ID web session for the two steps with no public API, the app record and App
Privacy:
asc web auth login --apple-id you@example.com
The App Store app record
- Create the app record. Not in Apple’s public API either:
asc web apps create --name … --bundle-id … --sku …, or My Apps → New App on the website. Put the numeric Apple ID it gives you intoeas.json’sascAppId - Pricing and availability. The first setup cannot go through the public API. Set a
price tier and territories in App Store Connect;
asc pricinghandles later edits - In-app purchase products, if you sell anything. RevenueCat does not create them. They
have to exist in App Store Connect and Play Console first, and
asc iap setupandasc subscriptions setupcover the App Store side once pricing exists
The question only you can answer
Content rights. declarations.config.json ships it unanswered and the script refuses to
guess, because both answers assert something. See
Age rating and content rights.
Play Console work with no API
- The IARC content-rating questionnaire, target audience, ads, and the news, government
and financial-app flags. Record the answers in
play.config.json’splayConsoleOnlyblock, then enter them at Play Console → Policy → App content - The closed-testing period, for new personal developer accounts. A continuous test with real testers is required before production opens, and the threshold changes, so check Play Console
- Play pricing and in-app products.
inappproductsandmonetization.subscriptionsare real endpoints, but nothing in the repo wires them up
Already scripted
Listed so nobody goes looking for these by hand.
| Was manual | Now |
|---|---|
| App Store text metadata, categories, review contact | scripts/listing.mjs |
| Screenshot upload per display size, iPad included | scripts/listing.mjs |
| The App Privacy questionnaire | scripts/privacy.mjs |
| The Play Data safety form | scripts/play-privacy.mjs, from the same source file |
| Play listing text, feature graphic, screenshots | scripts/play-listing.mjs |
| Promoting a build between Play tracks | scripts/play-release.mjs |
| Age rating | scripts/declarations.mjs |
| Version records, attaching the build | asc versions create and attach-build |
| Submitting for review | asc review submit, on an explicit go |
| The first Android upload | eas submit -p android creates the first internal-track release |
| App icon size and alpha checks | scripts/preflight.mjs |
Run node .claude/skills/submit/scripts/preflight.mjs before spending a build and submit
cycle. It reports what on this list is still open.
Next
Once this list is done, every later release is the pipeline on Submit to the stores, and nothing here comes back.