agentleFS
beydemirfurkanbeydemirfurkan/appstore-release/skills/app-store-rejection/SKILL.md

app-store-rejection

Skill4 starsChanged 34 days agoMITView on GitHub

Recover from an App Store rejection — read what App Review said, map the guideline to a concrete fix (metadata, screenshots, binary, age rating, subscriptions, review notes), apply it through the App Store Connect API, reply, and resubmit. Use when the user says "Apple rejected my app", "guideline 2.1 / 2.3 / 4.0 / 5.1.1 / 3.1.1", "metadata rejected", "binary rejected", "how do I respond to App Review", "resubmit", or when an App Store readiness check reports the rejected verdict.

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈1

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If the user believes the rejection is wrong, say so politely with specifics — what the reviewer saw, what the app actually does — never …

    line 85
  2. Very specific:

    Put a working demo account and exact steps in review.notes whenever anything is behind a login.

    line 109
  3. Very specific:

    Run asc preflight before every new build: these three are among what it checks.

    line 112

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Rejection → fix → resubmit

You say: "Apple rejected my app — what now?" · "Resubmit after fixing guideline 2.1."

It does: Reads the rejection with you, maps the guideline to the layer that needs fixing — listing, screenshots, rating, products or binary — applies the fix, and resubmits.

A rejection is a to-do list from App Review. The loop: read it → classify it → fix the right layer → reply → resubmit. Classify before you touch anything: the wrong layer costs a whole review cycle. Never resubmit unchanged hoping for a different reviewer.

Running the CLI

node <skill-dir>/scripts/asc.mjs <command> [flags]

<skill-dir> is the directory you loaded this SKILL.md from. Below, asc means that line. Credentials come from the environment only.

1. Confirm the state

asc check

Verdict rejected (finding submission.rejected) means the version is editable again. METADATA_REJECTED means only the listing needs to change — no new build. REJECTED usually means the binary.

2. Get the message — the user has to

The rejection text lives in App Store Connect → the app → App Review (Messages). Apple exposes no API for it. Ask the user to paste the full message, including the guideline numbers and any screenshots the reviewer attached.

3. Classify, then fix the right layer

First, which kind of rejection it is:

version state METADATA_REJECTED?
├─ yes → the listing only. No new build.
│        edit the config → asc release --dry-run → asc release → reply → asc submit --submit --resolved
└─ no (REJECTED) → read the guideline:
     ├─ 2.3.x, 5.1.1(i) privacy policy URL → listing; the build may stay
     ├─ 2.1 "could not sign in / find the feature" → review info: demo account, steps in review.notes
     ├─ App Privacy answers don't match → the user edits App Privacy in App Store Connect
     └─ anything about what the app does → the binary: fix → new build number → asc attach-build

Map each cited guideline with references/guidelines.md. Then fix at the right layer:

LayerExamplesHow
Listingdescription, keywords, screenshots, name, subtitleEdit the config → asc release --dry-run → asc release
Age ratingrating too low for contentapp-store-age-rating skill → asc age-rating
Subscriptionspaywall terms, missing linksapp-store-subscriptions skill; paywall changes need a new build
Review inforeviewer could not log in, could not find a featureasc review-info --draft-notes, demo account → asc review-info
App Privacydata use mismatchUser edits App Privacy in App Store Connect and republishes
Binarycrash, broken feature, missing account deletion, private APIFix the code → asc preflight → new build → asc attach-build

For a binary fix the version number can stay; the build number must increase. Run asc preflight on the fixed project before building: it catches the next rejection of the same kind.

4. Reply in App Store Connect

Draft the reply for the user to paste under the rejection in App Review. Three short parts, facts only:

UNDERSTANDING
Guideline 5.1.1(v): the app lets people create an account but had no way to delete it.

CHANGES MADE
Settings → Account → Delete Account now deletes the account and its data on our server.
Build 1.2.0 (43) contains this change and nothing else.

HOW TO VERIFY
Sign in with the demo account in App Review Information, open Settings → Account,
tap Delete Account, confirm. Signing in again with the same account then fails.

If the user believes the rejection is wrong, say so politely with specifics — what the reviewer saw, what the app actually does — never argue in the listing.

Appeal or expedite? They are different requests:

  • Appeal (App Review Board, developer.apple.com/contact/app-store/?topic=appeal) — the rejection misreads the app and a clear reply has not helped. Suggest it; never file it for the user.
  • Expedited review (developer.apple.com/contact/app-store/?topic=expedite) — the fix is in, and a critical bug or a dated event makes waiting costly. It asks for speed, not a different verdict. Use it sparingly.

Under pressure. "It must go out today" does not change what App Review accepts: fix the cited issue, resubmit, and offer expedited review if the reason is real. A third rejection for the same guideline means the reply is not landing — re-read the message with the user, change the approach, and consider the appeal. A 4.3 (spam) rejection is the hardest to reverse: it needs a materially different app, not new wording.

5. Resubmit

asc release                    # if the fix was metadata, screenshots, rating or products
asc submit --submit --resolved # ask the user first

--resolved is the user's word that what App Review asked for is addressed — the API cannot read Resolution Center to check. It resubmits the same review submission, marking its rejected items resolved. Without it, submit stops and says to read Resolution Center; with other blockers still open, it says to run release first.

A binary fix means a new build first (eas build, eas submit, then asc attach-build).

Then follow it: asc check --wait 30 — exit 0 approved, 5 rejected again, 8 still in review.

Avoiding the next one

  • Put a working demo account and exact steps in review.notes whenever anything is behind a login.
  • Account creation in the app ⇒ account deletion in the app (5.1.1(v)).
  • Third-party sign-in ⇒ offer Sign in with Apple or an equivalent privacy-preserving option (4.8).
  • Run asc preflight before every new build: these three are among what it checks.
  • Screenshots and description must match the build under review (2.3).

Checked against the App Store Review Guidelines of June 8, 2026.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.