Custom-distribution app: merchant Install button disabled, AppAccessChangeQuery returns blocked:true with empty unmetInstallRequirements

We have a custom-distribution app that a merchant cannot install. The consent screen renders correctly, but the Install button is disabled and no reason is surfaced anywhere we can reach.

App

  • Custom distribution, bound to a single store
  • Non-embedded, authorization code grant (our backend builds /admin/oauth/authorize itself)
  • Current released version declares 11 access scopes

Merchant store
A live store on the Grow plan — not a development store.

Symptom
The permission screen renders in full. The Install button is rendered aria-disabled="true". No tooltip, no error banner, no console error, no failed network request. Both the store owner and a staff user see the identical screen, so this is not a “Manage and install apps” permission problem.

What the merchant found in the admin’s own response

"blocked": true,
"unmetInstallRequirements": [],
"primaryAlerts": [], "grantFooterAlerts": [], "grantSummaryAlerts": [],
"privacyPolicyUrl": null,
"supportEmail": null

blocked: true with an empty unmetInstallRequirements and no alerts.

Already ruled out

  • Distribution is configured (Custom, bound to that store; the install link exists and resolves)
  • The store owner is blocked too, so not an account-permission issue
  • Protected customer data — per Shopify staff guidance elsewhere on this forum, custom apps receive Level 1 and Level 2 automatically
  • Scope bloat — exactly 11 scopes: read_orders, read_products, read_inventory, read_locations, read_price_rules, read_discounts, write_products, write_discounts, write_draft_orders, write_publications, write_orders
  • The same app installs successfully on our own development store

Two configurations released, neither of which unblocked it

  1. [access_scopes] with the 11 scopes plus use_legacy_install_flow = true
  2. The same 11 scopes using managed installation (legacy flag removed)

Questions

  1. What sets blocked: true for an app on a given store when unmetInstallRequirements is empty? Is there anywhere a partner can see the server-side reason?

  2. privacyPolicyUrl and supportEmail are both null. Our app requests protected customer data and the merchant’s store is not a development store. Where does a custom-distribution app set those two fields? There is no App Store listing for a custom app, and we can find no field for either in the Partner Dashboard or the Dev Dashboard. If these are the block, we simply need somewhere to enter them.

This is blocking a live merchant onboarding, so any pointer to the specific setting would be very welcome. Happy to provide the client ID and store domain privately.

@mapdragon Likely the installation URL was stale. Can you get the URL from the Dev Dashboard again and try again? Make sure to use the URL within 5 minutes.