Scopes are granted per app version. A version bundles the scopes you request, a required justification for each, and your webhook topics. You submit a version for review; only an approved version can be installed, and any scope change means a new version and a new review.

Create and submit a version

Create a version, then submit it. Every entry in requested_scopes needs a non-empty string in scope_justifications.

Review states

A submission opens a review case that moves through a small state machine. Track it with GET /appstore/partner/review/cases/{id}. The common path is submitted → in_review → approved. A reviewer may route to changes_requested (you act, then it returns to review) or rejected.

Message the review team

Each case carries a thread you share with the reviewer. Use it to explain design decisions, respond to changes_requested, or ask questions. Decisions are also posted to the thread as system messages, so the case is a complete record.

Scope justifications are required

A submission with a missing or empty justification for any requested scope is rejected outright. Write one concrete sentence per scope stating what your app does with it — the merchant sees this exact text on the consent screen, so it must be honest and specific.

What gets an app rejected

  • Over-broad scopes — requesting catalog:write when you only read, or bundling scopes “just in case.” Ask for the minimum; each scope must earn its justification.
  • * or agent:admin — app tokens get no super-scope elevation, so these are never valid on a version. Request the exact resource scopes instead.
  • Weak webhook verification — the HMAC probe sends a bad signature and expects a 401. An endpoint that accepts it fails. See Webhooks.
  • Redirect URIs that don’t match — the authorize redirect_uri must be in the app’s exact allowlist; wildcards or mismatches are blocked.
  • Vague or missing justifications — see above.
  • Scopes the app doesn’t use — declaring topics or scopes the integration never exercises.
Before submitting, run the flow end-to-end on your own store: install with your requested scopes, confirm every Gateway call your app makes returns 200 (not 403 FORBIDDEN_SCOPE), and confirm your webhook endpoint returns 401 on a tampered signature and 200 on a valid one.

Next

Install flow (OAuth)

How merchants install an approved version.

Scopes

The full scope catalog.