How review works
- You submit an app version (what your app does: scopes, webhooks, extensions) and, for a public app, its listing (what merchants read). See Versions & review and App Store listing.
- Automated checks run at once. A failed check sends the case back to you as changes requested, with the reason on each check.
- A reviewer installs your app on a test store and works through the manual checks below.
- The reviewer approves, asks for changes, or rejects. Every decision and every message is posted to the review case thread, which you can answer.
Checklist
Install and authentication
- The app starts the OAuth install as soon as a merchant opens it: no sign-up form, no email step before authorization.
- Every redirect URI uses
https(nolocalhost, no tunnel URLs left fromdtc app dev). - Your app URL is deployed and publicly reachable.
- Embedded apps load inside the admin and authenticate with session tokens, not cookies.
- Reinstalling, and re-authorizing after a new version, work without the merchant losing data.
Scopes
- You request only the scopes your features use today.
- Each scope has a one-sentence justification of at least 10 characters saying what the app does with it. Merchants read this text on the consent screen.
- No
*oragent:admin. Apps never get super-scopes.
Webhooks
- Your endpoint verifies the
X-Webhook-Signatureon every request and answers401when it does not match. Review sends a request signed with the wrong secret to check this. - Your endpoint answers
2xxtoapp/health_check. - You handle
app/uninstalled: stop calling the API for that install, and stop charging. - You subscribe only to topics you use.
Privacy (mandatory for every public app)
- You handle all three compliance webhooks:
customers/data_request,customers/redactandshop/redact. Each answers2xx, or401for a bad signature. - You delete what you hold when asked (
customers/redact, andshop/redact48 hours after an uninstall), and send a merchant the data you hold when asked (customers/data_request), within 30 days. - Your privacy policy (an
httpsURL on your listing) says what data you collect, why, and how long you keep it, and matches your scope justifications.
Billing
- Every charge goes through the Billing API. No off-platform payment links, card forms or invoices for app fees.
- Merchants can change plans from inside the app without reinstalling.
- Your listing’s pricing matches your active pricing plans. At least one plan is set up.
- Test charges work on a development store.
Listing
- Tagline, intro, icon (square, at least 512 px), primary category and at least 3 screenshots, each with alt text.
- Screenshots show your real app UI. No reviews, ratings, prices or awards in images.
- Text describes only what the app does. No invented numbers, testimonials or “#1” claims.
- A support email or support URL that a person answers.
Storefront
- Storefront features use theme app blocks, embeds and pixels, never edits to the merchant’s theme code.
- Your blocks render nothing when they have nothing to show, and don’t slow the page down.
What gets an app rejected
See What gets an app rejected. The most common reasons are over-broad scopes, a webhook endpoint that accepts a bad signature, missing compliance webhooks, and billing outside the Billing API.After approval
- New versions go through the same review. Installs move to the new version automatically unless it asks for new scopes; those merchants are asked to approve the new scopes first.
- Keep your webhook endpoint healthy. Deliveries to an endpoint that keeps failing are paused and you are emailed; they resume on their own once your endpoint answers again.
- An app can be delisted or suspended when it breaks these guidelines. The reason is shown on your app in the Partner Dashboard.