Summary
Recently, the Shopify admin started loading our embedded app’s iframe at {app_url}/apps/{app-handle} (and {app_url}/apps/{client_id} immediately after installing from the developer dashboard) instead of at {app_url}/. Our app serves its SPA at the App URL root, so this new entry path has no matching server route and returns a 404 inside the app frame. It hits only a subset of shops/opens (looks random) and sometimes appears to “fix itself” on refresh, which made it hard to track down. This previously worked the app loaded at the App URL root.
App setup
- Embedded app, App URL =
https://OURDOMAIN/(root) embedded = true; auth via App Bridge session tokens + token exchange- App Bridge: unversioned
https://cdn.shopify.com/shopifycloud/app-bridge.js
Observed behavior
The initial iframe document request (captured from the browser network panel) is:
GET https://OURDOMAIN/apps/{app-handle}?embedded=1&hmac=…&host=…&id_token=…&locale=en&session=…&shop=SHOP.myshopify.com×tamp=…
Sec-Fetch-Dest: iframe
Referer: https://admin.shopify.com/
Immediately after installing via the developer dashboard, the same request uses the client_id instead of the handle:
GET https://OURDOMAIN/apps/{client_id}?embedded=1&…
Since the app only routes /, /settings, etc. (nothing under /apps/...), the server returns 404 and the merchant sees “404 Not Found” in the embedded frame.
Expected behavior
The iframe loads at {app_url}/?… (the configured App URL root), as before. We’d expect the admin’s /apps/{handle} path prefix to be stripped when building the iframe src, not forwarded into it.
Impact
- 404 on app open/install for affected shops.
- Intermittent across shops — consistent with a gradual rollout.
Questions
- Is forwarding the
/apps/{handle}(and/apps/{client_id}) prefix into the embedded iframesrcan intended change? - If intended, what’s the recommended handling — should apps now serve their UI under
/apps/{handle}/*, or is there a config / App Bridge base-path for this? - Was embedded-app entry-URL construction changed recently in the Spring '26 admin / new Dev Dashboard?
Current workaround
A server-side redirect from /apps/{anything} to the matching app path, preserving the full query string (shop, host, id_token, hmac, session, …), so the SPA loads at root and App Bridge authenticates normally.
