Passing Shopify App Store Review the First Time
Review is not a formality at the end of a build. A large part of the checklist describes architecture, and discovering that after the app is written is how timelines slip.

On this page
Key takeaways
- The requirements checklist is public and substantially architectural — read it before building, not before submitting.
- The common rejection causes are consistent: mandatory webhooks, billing edge cases, an onboarding a reviewer cannot complete, and code injected into themes.
- Reviewers install your app on a fresh store with no data, which is the state most developers never test.
- Resubmission costs calendar time you cannot compress, which matters most when a launch date has been announced.
App review is commonly treated as an administrative step at the end of a build. That framing is why timelines slip.
A substantial share of Shopify's requirements describe architecture rather than presentation — how your app authenticates, how it bills, how it renders on a storefront, what it does when a merchant asks for their data. Discovering those after the app is written turns a fortnight of work into a rewrite.
Read the checklist first
Shopify publishes its requirements. Reading them at the start of a project costs an hour and changes design decisions. Reading them before submission costs weeks.
What reviewers actually do
Understanding the process makes the requirements easier to anticipate.
A reviewer installs your app on a fresh development store. No products, no orders, no customers, no configuration. They follow your onboarding as a merchant would, try the core function, check billing, and look at what your app does to the storefront.
That fresh-store state is the one most developers never test. Your development environment has data because you have been building against it for months. A reviewer's does not, and an app that assumes existing products or prior configuration will fail immediately in a way you have never seen.
The recurring rejection causes
Consistent enough to be worth listing plainly.
Mandatory compliance webhooks missing or incomplete. Customer data request, customer redaction, shop redaction. Required, easy to implement, and routinely left until last.
Billing edge cases unhandled. Trials, upgrades, downgrades, failed payments, what happens when a merchant cancels mid-cycle. Billing is where apps look finished and are not.
Onboarding a reviewer cannot complete. Requires an external account, assumes existing data, has a step that fails silently on an empty store, or simply does not explain what to do first.
Storefront code injected into themes. Writing snippets into theme files rather than using theme app extensions. This is both a rejection cause and the thing merchants complain about most, since injected code frequently survives uninstall.
Insufficient documentation. A reviewer who cannot work out what your app does, or how to test it on an empty store, will reject it — and they are right to.
OAuth handled incorrectly. Particularly around reinstalls and scope changes, which are the paths developers test least of all.
Requirement area and what actually fails
| Area | Common failure |
|---|---|
| Compliance webhooks | Not implemented, or return the wrong status |
| Billing | Downgrades and cancellations unhandled |
| Onboarding | Assumes data that a fresh store lacks |
| Storefront rendering | Theme file injection instead of app extensions |
| OAuth | Reinstall and scope change paths untested |
| Documentation | Missing, or written for developers not reviewers |
| Performance | Storefront weight not measured |
| Uninstall | Leaves code or data behind |
Test on an empty store
The single highest-value thing you can do before submitting, and it takes an afternoon.
Create a fresh development store. Install your app as a merchant would, from nothing. Then walk the whole path:
The fresh-store test
- Install the app with no products and no configuration
- Complete onboarding without consulting your own documentation
- Trigger the core function on an empty catalogue
- Add one product, and check the app behaves sensibly
- Subscribe to a paid plan, then downgrade, then cancel
- Uninstall, and inspect what remains in the theme and in your database
- Reinstall, and confirm the previous state is handled correctly
Each of those steps corresponds to a rejection cause. Working through them yourself finds the problems before a reviewer does, and finding them yourself costs days rather than review cycles.
Build against the checklist continuously
The practical difference between a smooth review and a painful one is when the checklist enters the project.
At the start, it shapes architecture. You choose theme app extensions because you know injected code is a problem. You implement compliance webhooks in the first sprint because you know they are required. You design onboarding for an empty store because you know that is what a reviewer sees.
At the end, each of those becomes rework, and rework on foundational decisions is expensive.
There is no trick here beyond timing. The requirements are public and stable enough to plan against, and none of them are surprising once read. Treating them as design inputs rather than as a final exam is the whole technique.
Performance is part of it
Worth separating because developers under-weight it.
Any app rendering on a storefront adds requests and JavaScript to pages merchants care about. Reviewers look at this, and more importantly merchants look at it — an app that visibly costs Core Web Vitals is the first one removed during a cleanup, regardless of how good its features are.
Load only where your feature is used. Defer what you can. Measure on a realistic storefront with a real theme and other apps installed, not on a clean development store where yours is the only script on the page.
Documentation for a reviewer, not a developer
A specific and commonly missed distinction.
Your developer documentation explains how the app works. What a reviewer needs is different: what the app does, how to set it up on a fresh store, what to test, and how to reach you if something is unclear.
Write that separately and keep it short. A reviewer who can follow a clear five-step test path will do so; one who has to infer it will find something to reject.
The listing is reviewed too
Developers focus on the app and forget that the App Store listing is part of what gets assessed, and part of whether anyone installs afterwards.
Screenshots must show the actual app. Mockups, marketing renders and interfaces that do not match the shipped product are a rejection cause and, separately, produce uninstalls from merchants who expected something else.
The description must describe what it does, not what it will do next quarter. Claiming functionality that is not there fails review and generates support load if it slips through.
Pricing must match reality. What the listing says and what the billing API charges have to be the same, including trial length and what each tier includes.
Support contact must work. A reviewer may use it. So will merchants, and an unanswered support address is visible in your reviews within weeks.
Category and search terms should be honest. Listing in categories your app does not genuinely serve produces installs from merchants who will churn and leave a one-star review explaining why.
After approval, the work changes
Passing review is a milestone rather than an ending, and two things start immediately.
Merchants will use it in ways you did not anticipate. Themes you have never seen, apps you have never heard of touching the same surface, configurations you assumed were impossible. Building your app so it can be diagnosed from the outside — logs recording what it did for a given shop, a status view showing its own configuration — turns a multi-day support exchange into a two-minute answer.
Your reviews become your marketing. They are public and permanent, and how you respond to criticism is read by every prospective merchant. A one-star review answered helpfully demonstrates support in a way no listing copy can; the same review left unanswered is the first thing people see.
There is also the ongoing obligation nobody enjoys. Shopify versions its APIs and retires old ones on a published schedule, so an app that ships and is never touched again will eventually break on someone else's timetable. Decide early how you track deprecations and how often you upgrade, because an app carrying years of version debt is far harder to move than one kept current.
Keep a fresh install path working forever
The empty-store test is not only for review. Every merchant who installs your app is a fresh store, and it is the state you will keep breaking as you add features to the version you use daily. Re-run it before every significant release.
Plan for the resubmission you hope not to need
Even well-prepared apps sometimes come back with something.
Budget for at least one cycle in your timeline. This matters most when a launch date has been communicated — to a client, to a marketing plan, to a partner — because review time is calendar time you cannot compress by adding effort.
The other reason to leave slack: fixing a blocking issue sometimes reveals the next one, since a reviewer who could not get past step two has not yet seen step five.
When a rejection does arrive, read it literally and fix exactly what it names before resubmitting. Developers frequently interpret a specific rejection as a general criticism, rewrite more than was asked, and introduce something new. If the feedback is ambiguous, ask rather than guess — a clarifying question costs a day and a wrong guess costs a full cycle.
For the wider build considerations, see Shopify development. The public-versus-custom decision, which determines whether review applies at all, is covered in the same archive.
Frequently asked questions
- How long does Shopify app review take?
- It varies, and the number that hurts is not the first review but the round trip after a rejection.
- What are the most common reasons apps get rejected?
- Missing or incomplete mandatory webhooks, billing that does not handle required cases, an onboarding flow a reviewer cannot complete on a fresh store, insufficient documentation, and storefront features implemented by injecting code into themes rather than using theme app extensions.
- Do I need to implement GDPR webhooks?
- The mandatory compliance webhooks — customer data request, customer redaction and shop redaction — are required, and missing them is a straightforward rejection.
- Does my app need to work on every theme?
- It needs to work on the themes a reviewer will try, and in practice to work broadly across the ecosystem.
- Can I fix issues and resubmit quickly?
- You can resubmit, but each cycle takes time and reviewers may find new issues once a blocking one is resolved.



Comments