Skip to main content

Submit for review

You have an app running on your development store. This is the step that lets other merchants install it.

A version pins the contract, not the code​

Submitting creates a version: your hosted URL, the permissions you request, your webhook topics, and your App Store listing. It does not touch your code.

That means:

  • Deploying does not need us. Ship on a Friday. Tanqory neither sees your code nor needs to.
  • Changing the contract does. A new scope, a new origin, a new webhook topic — those are what merchants agreed to, so those are what get reviewed.

Only one version may await review at a time. Submitting a second while the first is open is refused rather than queued.

Every scope needs a reason​

This is the part people are unprepared for. A submission is rejected before it reaches a human if any requested permission has no justification:

Explain why you need orders.edit, customers.view_payment_methods. Reviewers approve scopes, not apps.

Write the reason a merchant would want, not the reason your code has. "To show the order total on the dashboard card" is reviewable. "Needed by the SDK" is not.

See Permissions for the full catalog. Asking for fewer is faster to approve and less likely to be declined at the merchant's install screen — they see the list, not your reasoning.

Preflight runs first​

Three machine checks, and they exist because they are the things a reviewer cannot check by hand:

CheckWhat it means
app-url-reachableYour origin answers
frame-ancestorsYour CSP admits the Tanqory dashboard
x-frame-optionsNothing older is contradicting it

A warning does not block. A failure does.

The x-frame-options check catches the single most common way an app fails silently: the header has no allow-list form, so SAMEORIGIN overrides your Content-Security-Policy: frame-ancestors in browsers that still read it, and the dashboard shows a blank frame with no error.

Then a person reads it​

The substance of a review is scope justification — whether what you asked for matches what you do. The outcome is PUBLISHED or REJECTED.

A rejection always carries a reason. The platform refuses to record one without: "A rejection the developer cannot act on wastes both sides' time." Fix and submit again.

Changing your mind​

Withdraw pulls a pending version out of review — it does not remove your app from the marketplace.

  • If you already have a live version, the app returns to PUBLISHED and merchants keep running the version they had.
  • If you never had one, it returns to DRAFT.

Adding a scope later does not break anyone​

When an approved version asks for more than a merchant already granted, their installation moves to PENDING_REAUTH. Your app keeps working on the permissions they agreed to until they agree to the rest.

Handle that state. It is not an error, and it is not rare — it is what happens every time you grow.

The states​

StateBelongs toMeans
DRAFTthe appCreated, never submitted. Test-installable on your own development stores.
IN_REVIEWa versionSubmitted. Only one at a time.
PUBLISHEDthe appOn the marketplace. Merchants may install.
REJECTEDa versionTurned down, with a reason. Fix and resubmit.
LIVEan installA merchant is running it on the scopes they granted.
PENDING_REAUTHan installYou asked for more than this merchant granted. Still running on the old set.