Determine whether an app is ready to submit, then drive the current App Store release flow with asc, including validation, staging, review submission,…
Release flow (readiness-first) Use this skill when the question is "Can my app be submitted now?" or when the user wants to prepare and submit an App Store version with the current asc command surface. Preconditions Resolve APP_ID, version string, VERSION_ID when needed, and BUILD_ID up front. Ensure auth is configured with asc auth login or ASC_* environment variables. Have canonical metadata in ./metadata when using metadata-driven staging. Treat asc web ... commands as optional web-session fallbacks for flows not covered by the public API. Answer order Say whether the app is ready right now. Name the blocking issues. Separate public-API fixes from web-session or manual fixes. Give the next exact command to run. Blockers usually fall into: API-fixable: build validity, metadata, screenshots, review details, content rights, encryption, version/build attachment, IAP readiness, Game Center version and review-submission items. Web-session-fixable: initial app availability bootstrap, first-review subscription attachment, App Privacy publish state. Manual fallback: first-time IAP selection on the app-version page when no CLI attach flow exists, or any flow the user does not want to run through web-session commands. Canonical current path 1. Readiness check Use asc validate; the old submit-preflight shortcut is not part of the current CLI. asc validate --app "APP_ID" --version "1.2.3" --platform IOS --output table Use strict mode when warnings should block automation: asc validate --app "APP_ID" --version "1.2.3" --platform IOS --strict --output table For apps selling digital goods, run the product readiness checks too: asc validate iap --app "APP_ID" --output table asc validate subscriptions --app "APP_ID" --output table 2. Stage without submitting Use asc release stage when the user wants to prepare the version, apply/copy metadata, attach the build, and validate, while stopping before review submission. asc release stage \ --app "APP_ID" \ --version "1.2.3" \ --build "BUILD_ID" \ --metadata-dir "./metadata/version/1.2.3" \ --dry-run \ --output table Apply the staging mutations after the plan looks correct: asc release stage \ --app "APP_ID" \ --version "1.2.3" \ --build "BUILD_ID" \ --metadata-dir "./metadata/version/1.2.3" \ --confirm Use --copy-metadata-from "1.2.2" instead of --metadata-dir when carrying metadata forward from an existing version. 3. Submit an already prepared version Use asc review submit for explicit App Store review submission. It wraps build attachment plus review submission creation. asc review submit --app "APP_ID" --version "1.2.3" --build "BUILD_ID" --dry-run --output table asc review submit --app "APP_ID" --version "1.2.3" --build "BUILD_ID" --confirm Use --version-id "VERSION_ID" instead of --version when you already resolved the exact version ID. 4. One-command upload and submit Use asc publish appstore when upload/build/local-build and submission should be one high-level flow. asc publish appstore --app "APP_ID" --ipa "./App.ipa" --version "1.2.3" --submit --dry-run --output table asc publish appstore --app "APP_ID" --ipa "./App.ipa" --version "1.2.3" --submit --confirm Add --wait when the command should wait for build processing before attaching/submitting. 5. Monitor and cancel asc status --app "APP_ID" asc submit status --version-id "VERSION_ID" asc submit status --id "SUBMISSION_ID" asc submit cancel --id "SUBMISSION_ID" --confirm First-time submission blockers Initial app availability does not exist Symptoms: asc pricing availability view --app "APP_ID" reports no availability. asc pricing availability edit ... cannot update because there is no existing availability record. Check: asc pricing availability view --app "APP_ID" Bootstrap the first availability record with the web-session flow: asc web apps availability create \ --app "APP_ID" \ --territory "USA,GBR" \ --available-in-new-territories true After bootstrap, use the public API for ongoing changes: asc pricing availability edit \ --app "APP_ID" \ --territory "USA,GBR" \ --available true \ --available-in-new-territories true Subscriptions are ready but not attached to first review Check subscription readiness first: asc validate subscriptions --app "APP_ID" --output table If diagnostics report missing metadata, fix those prerequisites before attaching. Common misses are broad pricing coverage, review screenshots, promotional images, and app/build evidence. List first-review subscription state: asc web review subscriptions list --app "APP_ID" Attach a group for first review: asc web review subscriptions attach-group \ --app "APP_ID" \ --group-id "GROUP_ID" \ --confirm Attach one subscription instead: asc web review subscriptions attach \ --app "APP_ID" \ --subscription-id "SUB_ID" \ --confirm For later reviews, submit subscriptions through the public review path: asc subscriptions review submit --subscription-id "SUB_ID" --confirm In-app purchases need review readiness or first-version inclusion asc validate iap --app "APP_ID" --output table Upload missing review screenshots: asc iap review-screenshots create --iap-id "IAP_ID" --file "./review.png" For IAPs on a published app: asc iap submit --iap-id "IAP_ID" --confirm For the first IAP on an app, or the first time adding a new IAP type, Apple may require selecting the IAP from the app version's "In-App Purchases and Subscriptions" section before submitting the app version. Prepare the IAP with localization, pricing, and review screenshot data first. For non-renewing IAPs that must be attached to the next app version review, the public API may reject the review item path. The CLI exposes a web-session fallback that mirrors the App Store Connect web flow: asc web review iaps attach --app "APP_ID" --iap-id "IAP_ID" --confirm Use this only for the web-only first-version selection gap, and call out that it requires an authenticated Apple web session. Game Center needs app-version and review-submission items asc game-center app-versions list --app "APP_ID" asc game-center app-versions create --app-store-version-id "VERSION_ID" If Game Center component versions must ship with the app version, use the explicit review-submission API so all items can be added before submission: asc review submissions-create --app "APP_ID" --platform IOS asc review items add --submission "SUBMISSION_ID" --item-type appStoreVersions --item-id "VERSION_ID" asc review items add --submission "SUBMISSION_ID" --item-type gameCenterLeaderboardVersions --item-id "GC_LEADERBOARD_VERSION_ID" asc review submissions-submit --id "SUBMISSION_ID" --confirm asc review items add also supports gameCenterAchievementVersions, gameCenterActivityVersions, gameCenterChallengeVersions, and gameCenterLeaderboardSetVersions. App Privacy is still unpublished The public API can surface privacy advisories, but it cannot fully verify App Privacy publish state. asc web privacy pull --app "APP_ID" --out "./privacy.json" asc web privacy plan --app "APP_ID" --file "./privacy.json" asc web privacy apply --app "APP_ID" --file "./privacy.json" asc web privacy publish --app "APP_ID" --confirm If the user avoids web-session commands, confirm App Privacy manually in App Store Connect: https://appstoreconnect.apple.com/apps/APP_ID/appPrivacy Review details are incomplete asc review details-for-version --version-id "VERSION_ID" Create or update details: asc review details-create \ --version-id "VERSION_ID" \ --contact-first-name "Dev" \ --contact-last-name "Support" \ --contact-email "dev@example.com" \ --contact-phone "+1 555 0100" \ --notes "Explain the reviewer access path here." asc review details-update \ --id "DETAIL_ID" \ --notes "Updated reviewer instructions." Only set demo-account fields when App Review truly needs demo credentials. Ready checklist An app is effectively ready when: asc validate --app "APP_ID" --version "VERSION" --platform IOS has no blocking issues. asc release stage --dry-run produces the expected plan, or asc release stage --confirm has successfully prepared the target version. The build is VALID and attached to the target version. Metadata, screenshots, app info, content rights, encryption, age rating, and review details are complete. App availability exists. Digital goods have localization, pricing, review screenshots, and any first-review attachments or manual selections handled. Game Center app-version and component review items are included when needed. App Privacy is confirmed or published. Notes Do not use the legacy submit-preflight, submit-create, or release-run shortcuts; they are not part of the current CLI. Use asc validate for readiness. Use asc release stage for pre-submit preparation. Use asc review submit for explicit App Store review submission. Use asc publish appstore --submit --confirm for high-level upload plus submission. Use asc status and asc submit status after submission.
don't have the plugin yet? install it then click "run inline in claude" again.
use this skill to answer "is my app ready to submit right now?" and to drive the full app store release flow with the asc cli. the skill guides you through readiness validation, metadata staging, build attachment, review submission, and monitoring. use it when you need explicit control over each release phase or when automation needs to stop before submission, validate, and wait for approval before going live.
app identity
authentication
asc auth login first to cache credentials. asc auth login uses OAuth and stores a session token. edge case: auth tokens expire after 20 minutes of inactivity; re-run login if you see 401 errors mid-workflow.metadata and assets
external resources
edge cases to prepare for
1. resolve identifiers up front
if you have app name only, look up APP_ID:
asc apps list --output json | grep -i "app-name"
if you have version string only, resolve VERSION_ID:
asc app-store-versions list --app "APP_ID" --output table
if you have ipa file only, upload it first to get BUILD_ID:
asc publish appstore --app "APP_ID" --ipa "./App.ipa" --dry-run --output table
output: APP_ID, VERSION, VERSION_ID (if needed), BUILD_ID (if submitting).
2. validate readiness (blocking check)
run the primary readiness check:
asc validate --app "APP_ID" --version "VERSION" --platform IOS --output table
examine the output table. success means no blocking issues in the "status" column. if you see warnings and want strict mode:
asc validate --app "APP_ID" --version "VERSION" --platform IOS --strict --output table
if selling digital goods, add targeted validation:
asc validate iap --app "APP_ID" --output table
asc validate subscriptions --app "APP_ID" --output table
output: validation report (table format shows issue type, severity, and remediation hint).
3. stage without submitting (pre-flight preparation)
when you want to apply metadata, attach build, and prepare the version without submitting for review yet:
preview the staging plan:
asc release stage \
--app "APP_ID" \
--version "VERSION" \
--build "BUILD_ID" \
--metadata-dir "./metadata/version/VERSION" \
--dry-run \
--output table
review the plan table (shows metadata mutations, build attachment, validation results). if the plan looks correct, apply it:
asc release stage \
--app "APP_ID" \
--version "VERSION" \
--build "BUILD_ID" \
--metadata-dir "./metadata/version/VERSION" \
--confirm
alternatively, copy metadata from a prior version instead of loading from disk:
asc release stage \
--app "APP_ID" \
--version "VERSION" \
--build "BUILD_ID" \
--copy-metadata-from "1.2.2" \
--confirm
output: staged version with metadata applied and build attached (asc release stage --confirm returns success message and version id).
4. handle first-time blockers (conditional)
see decision points section for full branching logic. apply only the remediation steps your app needs.
5. submit for review
for explicit review submission of an already-staged version:
asc review submit \
--app "APP_ID" \
--version "VERSION" \
--build "BUILD_ID" \
--dry-run \
--output table
asc review submit \
--app "APP_ID" \
--version "VERSION" \
--build "BUILD_ID" \
--confirm
or use VERSION_ID directly if already resolved:
asc review submit \
--version-id "VERSION_ID" \
--build "BUILD_ID" \
--confirm
output: submission id and review submission status (usually "PENDING_REVIEW").
6. one-command upload and submit (alternative to steps 3-5)
when you want upload, build processing, staging, and submission in one high-level call:
asc publish appstore \
--app "APP_ID" \
--ipa "./App.ipa" \
--version "VERSION" \
--submit \
--dry-run \
--output table
asc publish appstore \
--app "APP_ID" \
--ipa "./App.ipa" \
--version "VERSION" \
--submit \
--confirm
if build processing takes time, add polling:
asc publish appstore \
--app "APP_ID" \
--ipa "./App.ipa" \
--version "VERSION" \
--submit \
--wait \
--confirm
output: build id, submission id, and submission status.
7. monitor submission and cancel if needed
check app-level status:
asc status --app "APP_ID"
check version-specific submission state:
asc submit status --version-id "VERSION_ID"
asc submit status --id "SUBMISSION_ID"
cancel an in-flight submission:
asc submit cancel --id "SUBMISSION_ID" --confirm
output: submission status (PENDING_REVIEW, IN_REVIEW, READY_FOR_SALE, REJECTED, etc.).
if app has no initial availability record (first submission)
asc pricing availability view --app "APP_ID". if empty or error, availability does not exist.asc web apps availability create \
--app "APP_ID" \
--territory "USA,GBR" \
--available-in-new-territories true
asc pricing availability edit \
--app "APP_ID" \
--territory "USA,GBR" \
--available true
if app sells subscriptions and first review needs a group attached
asc validate subscriptions --app "APP_ID". if diagnostics pass but submission is blocked, list first-review state:asc web review subscriptions list --app "APP_ID"
asc web review subscriptions attach-group \
--app "APP_ID" \
--group-id "GROUP_ID" \
--confirm
or:asc web review subscriptions attach \
--app "APP_ID" \
--subscription-id "SUB_ID" \
--confirm
asc subscriptions review submit --subscription-id "SUB_ID" --confirm
if app sells iaps and readiness check reports missing review screenshots or incomplete localization
asc validate iap --app "APP_ID". if report lists missing review screenshots:asc iap review-screenshots create --iap-id "IAP_ID" --file "./review.png"
asc iap submit --iap-id "IAP_ID" --confirm
asc web review iaps attach --app "APP_ID" --iap-id "IAP_ID" --confirm
(note: this requires active authenticated web session; use only for first-version selection gap, not ongoing submissions.)if app integrates game center and review must ship with app-version and leaderboard/achievement versions
asc game-center app-versions list --app "APP_ID"
asc game-center app-versions create --app-store-version-id "VERSION_ID"
asc review submissions-create --app "APP_ID" --platform IOS
asc review items add --submission "SUBMISSION_ID" --item-type appStoreVersions --item-id "VERSION_ID"
asc review items add --submission "SUBMISSION_ID" --item-type gameCenterLeaderboardVersions --item-id "GC_LEADERBOARD_VERSION_ID"
asc review submissions-submit --id "SUBMISSION_ID" --confirm
(also supports gameCenterAchievementVersions, gameCenterActivityVersions, gameCenterChallengeVersions, gameCenterLeaderboardSetVersions.)if app privacy publish state is unknown or not yet published
asc web privacy pull --app "APP_ID" --out "./privacy.json"
asc web privacy plan --app "APP_ID" --file "./privacy.json"
asc web privacy apply --app "APP_ID" --file "./privacy.json"
asc web privacy publish --app "APP_ID" --confirm
if review details (contact name, email, phone, demo notes) are incomplete or missing
asc review details-for-version --version-id "VERSION_ID"
asc review details-create \
--version-id "VERSION_ID" \
--contact-first-name "Dev" \
--contact-last-name "Support" \
--contact-email "dev@example.com" \
--contact-phone "+1 555 0100" \
--notes "Explain the reviewer access path here."
or update existing:asc review details-update \
--id "DETAIL_ID" \
--notes "Updated reviewer instructions."
if readiness validation returns warnings but not blocking errors
asc validate --strict and fix all warnings before submission.if staging plan shows dry-run errors
if build is not yet valid (still processing)
asc status --app "APP_ID" shows current build state.if you receive 401 auth errors mid-workflow
asc auth login (will prompt for web oauth or use env vars if set).readiness check output
staging plan output
staged version output
submission output
monitoring output
ready checklist confirmation
validation succeeded: asc validate --app ... --output table returns clean table with no error-level issues, or explicit "readiness: passed" message.
staging succeeded: asc release stage --confirm returns "version X.Y.Z staged successfully" and version-id, build-id are echoed.
submission succeeded: asc review submit --confirm returns non-empty submission-id and status PENDING_REVIEW (or equivalent). you can now monitor submission progress.
submission in-flight: asc submit status --id "SUBMISSION_ID" --output table shows status != "PENDING_REVIEW" (e.g., "IN_REVIEW", "READY_FOR_SALE", "REJECTED"). check decision field for reviewer feedback if terminal state reached.
first-time blocker resolved: after running first-time remediation commands (availability bootstrap, subscription attach, iap attach, game center app-version create, app privacy publish), re-run asc validate; blocker should no longer appear in issue list.
one-command workflow succeeded: asc publish appstore --submit --confirm returns build-id, version-id, and submission-id all non-empty; submission status is PENDING_REVIEW or equivalent.
all checks green: review the ready checklist below. if every item is checked off and no asc commands return errors, the app is release-ready and waiting for app review decision.
an app is effectively ready for submission when:
asc validate --app "APP_ID" --version "VERSION" --platform IOS returns no error-level issues (warnings ok unless --strict is used)asc validate iap --app "APP_ID" returns no blocking issues if app sells iapsasc validate subscriptions --app "APP_ID" returns no blocking issues if app sells subscriptionsasc release stage --dry-run produces a clean plan (all actions "ok" status)asc release stage --confirm completes successfully (version-id and build-id confirmed)asc status --app "APP_ID" confirms build.state == "VALID")