Why does Shopify Managed Pricing return a 404?

Hi Shopify community,

I’m implementing Shopify Managed Pricing for an embedded app and the hosted plan selection page is returning a Shopify Admin 404.

App context:

  • Embedded Shopify app

  • Managed Pricing is enabled

  • Public plan: Starter

  • Monthly: $4.99 USD

  • Annual: $49.99 USD

  • Free trial: 14 days

  • Listing language: English only

  • Store/admin user language: English

If there is no active subscription, the app shows an internal billing page at /app/billing. From there, the merchant can click a button that redirects server-side with target: “_top” to Shopify’s hosted Managed Pricing page.

That URL returns a Shopify Admin 404.

I understand the Welcome link should be /billing/return, but the 404 happens before any plan approval, so I don’t think the Welcome link is the cause.

Questions:

  1. Can the hosted Managed Pricing page return 404 while the app/listing is in review or draft state?

  2. Is there any way to verify the actual hosted pricing page status or pricing handle from CLI, Partner API, or Partner Dashboard while the app is under review?

  3. Besides the documented locale mismatch limitation, are there other known reasons why Managed Pricing returns 404?

  4. Can missing plan description/top features in the active listing language cause a 404 instead of simply showing no plans?

Any guidance would be appreciated.

Three common causes for Managed Pricing 404, in order of how often I’ve hit them:

  1. Listing not published. Even with Managed Pricing fully configured in Partner Dashboard, the hosted page only resolves once the listing is in Published state, not Saved or Unlisted. Worth confirming under Distribution.

  2. App handle mismatch. The URL format is /store/{store}/charges/{app-handle}/pricing_plans where {app-handle} is the slug on the public listing, not your client_id or internal app name. If the listing was renamed recently, the handle changes silently.

  3. Locale fall-through. With listing set to English only, if the merchant admin loads as en-CA or en-AU instead of plain en, the page can 404 looking for a matching locale.

Fastest isolation: open the constructed URL in a clean tab signed into the merchant admin, no embed, no host param. If it 404s there, it’s config. If it loads, the issue is in how the embed builds the redirect. Can you share the exact URL string being passed to target=_top?

Hi @HaroldAA. I ran into a very similar issue when first wiring up Managed Pricing, and a Shopify Admin 404 at that stage usually points to something structural rather than the return URL.

A few points based on experience:

App/listing state (draft or under review)

Yes. this can absolutely cause the hosted pricing page to 404. If Managed Pricing is tied to a public app that hasn’t been fully approved/published, Shopify may not expose the hosted pricing surface at all. In that case, the redirect works, but the destination doesn’t exist yet, so you get a 404. This is one of the most common causes.

Verifying the hosted pricing page / handle

There isn’t a clean way to directly “preview” or fetch the hosted pricing page via CLI or Partner API while the app is still in review. The Partner Dashboard is basically your only source of truth. What you can verify:

  • The plan is marked as “Active” (not draft)

  • Managed Pricing is actually enabled (not just configured)

  • The app is set as a public app (not custom/private)

  • The plan is attached to the correct app version

But there’s no exposed “pricing URL” or handle you can test independently before approval.

Other causes of 404 (besides locale mismatch)

From what I’ve seen, these are the real failure points:

  • App not approved / not published

  • Managed Pricing not fully enabled (UI toggle vs backend state mismatch)

  • No active plans (plans saved but not activated)

  • Incorrect app context (e.g., using a dev store or mismatched app install context)

  • Redirect not properly breaking out of iframe (you’re already using _top, so likely fine)

Locale mismatch usually results in empty plans or fallback behavior, not a hard 404.

Missing plan descriptions / features

No. That won’t cause a 404. At worst, Shopify will render a minimal or incomplete pricing page. A 404 means the page itself is unavailable, not that the content is invalid.

One thing worth double-checking

Make sure the store you’re testing on can actually access Managed Pricing. If you’re installing on a dev store or a store that doesn’t support billing flows in the same way, Shopify can silently fail with a 404 instead of giving a clear error.

Hope this helps :saluting_face:

Shopify Admin 404 on the Managed Pricing page typically means the billing service cannot resolve your app’s plan configuration.

  • Draft/Review State: Yes, a Draft status is the most common cause. Shopify often restricts the hosted pricing page until the app is Live or has been published at least once.

  • Listing Completeness: Missing plan descriptions or features in your App Listing can trigger a 404. Managed Pricing dynamically pulls this content to render the page if it’s empty, the page fails.

  • URL Structure: Verify your redirect uses the exact _top format: https://{shop}.myshopify.com/admin/billing/managed_pricing/plans?app_id={your_app_id} . A tiny mismatch in the app_id will 404.

  • Partner Dashboard: Ensure Managed Pricing is toggled ON under App Setup. If recently changed, wait 30 minutes for propagation.

Try testing on a Development Store. If it 404s there, your app_id or listing content is likely the culprit. If it only 404s on live stores, it’s the Under Review state restriction.

Here is the answers to your questions:

  1. Yes, draft/in-review apps cause 404sUntil the app is not published and live it will show 404 only

  2. Verifying pricing handleYou can check via the Partner Dashboard under App setup → Pricing to confirm your pricing handle is saved correctly. There’s no CLI command to verify the hosted page status directly. Partner API doesn’t expose this either currently.

  3. Other known 404 causes beyond locale mismatch:

App is unlisted, draft, or pending review

Pricing handle in your redirect URL doesn’t exactly match what’s set in Partner Dashboard

App hasn’t been installed through the official listing flow (direct install URLs bypass managed pricing)

The redirect URL is being constructed incorrectly — double-check it matches the format https://[shop].myshopify.com/admin/billing/[pricing-handle]

  1. Missing plan descriptionsYes, incomplete plan details in the active listing language can cause issues — Shopify expects all required fields populated before the page renders properly.

Most likely your issue: The app is still in review. Test the hosted page on a development store after your app is approved and publicly listed.

In the meantime, your internal /app/billing fallback is the right approach — keep it as the default until the app is live.