Determine whether an app is ready to submit, then drive the current App Store release flow with asc, including validation, staging, review submission, first-time availability, subscriptions, IAP, Game Center, and App Privacy checks.
Installs into .claude/skills of the current project.
Are you the author of Asc Release Flow?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/camillescholtz-asc-release-flow)
---
name: asc-release-flow
description: Determine whether an app is ready to submit, then drive the current App Store release flow with asc, including validation, staging, review submission, first-time availability, subscriptions, IAP, Game Center, and App Privacy checks.
---
# 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 `./Store` when using metadata-driven staging.
- Treat `asc web ...` commands as optional experimental escape hatches for flows not covered by the public API.
## Answer order
1. Say whether the app is ready right now.
2. Name the blocking issues.
3. Separate public-API fixes from web-session or manual fixes.
4. 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 experimental web-session commands.
## Canonical current path
### 1. Readiness check
Use `asc validate`; the old submit-preflight shortcut is not part of the current CLI.
```bash
asc validate --app "APP_ID" --version "1.2.3" --platform IOS --output table
```
Use strict mode when warnings should block automation:
```bash
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:
```bash
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.
```bash
asc release stage \
--app "APP_ID" \
--version "1.2.3" \
--build "BUILD_ID" \
--metadata-dir "./Store/version/1.2.3" \
--dry-run \
--output table
```
Apply the staging mutations after the plan looks correct:
```bash
asc release stage \
--app "APP_ID" \
--version "1.2.3" \
--build "BUILD_ID" \
--metadata-dir "./Store/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.
```bash
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.
```bash
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
```bash
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:
```bash
asc pricing availability view --app "APP_ID"
```
Bootstrap the first availability record with the experimental web-session flow:
```bash
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:
```bash
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:
```bash
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:
```bash
asc web review subscriptions list --app "APP_ID"
```
Attach a group for first review:
```bash
asc web review subscriptions attach-group \
--app "APP_ID" \
--group-id "GROUP_ID" \
--confirm
```
Attach one subscription instead:
```bash
asc web review subscriptions attach \
--app "APP_ID" \
--subscription-id "SUB_ID" \
--confirm
```
For later reviews, submit subscriptions through the public review path:
```bash
asc subscriptions review submit --subscription-id "SUB_ID" --confirm
```
### In-app purchases need review readiness or first-version inclusion
```bash
asc validate iap --app "APP_ID" --output table
```
Upload missing review screenshots:
```bash
asc iap review-screenshots create --iap-id "IAP_ID" --file "./review.png"
```
For IAPs on a published app:
```bash
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 an experimental web-session escape hatch that mirrors the App Store Connect web flow:
```bash
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 uses unofficial Apple web-session endpoints.
### Game Center needs app-version and review-submission items
```bash
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:
```bash
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.
```bash
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 experimental web-session commands, confirm App Privacy manually in App Store Connect:
```text
https://appstoreconnect.apple.com/apps/APP_ID/appPrivacy
```
### Review details are incomplete
```bash
asc review details-for-version --version-id "VERSION_ID"
```
Create or update details:
```bash
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.