App Bridge CDN not loading (ERR_NAME_NOT_RESOLVED) — need help fixing DNS / CDN issue

Hey everyone

I’m facing an issue while working on my Shopify embedded app —
the console shows this repeatedly:

GET https://appbridge.shopifycdn.com/3/app.js net::ERR_NAME_NOT_RESOLVED  
Error: App Bridge CDN not loaded. Check CSP/ad-blockers.

I’ve tried using both:

  • https://cdn.shopify.com/shopifycloud/app-bridge.js :white_check_mark:

  • Fallback to https://appbridge.shopifycdn.com/3/app.js :cross_mark: (fails with DNS error)

It looks like a Shopify CDN DNS resolution issue, not related to ad-blockers or CSP, because this happens even in incognito mode and multiple networks.

Steps I already tried:

  1. Cleared cache + disabled all extensions

  2. Tried multiple browsers and networks

  3. Added fallback to unpkg (@shopify/app-bridge@3.7.0/umd/index.js)

  4. Still getting ERR_NAME_NOT_RESOLVED for appbridge.shopifycdn.com

Please guide how to fix or confirm if Shopify CDN domain is down / deprecated.
Do I need to switch permanently to the cdn.shopify.com endpoint?

Hey @rahul_rudra - if you take a look at the console, you’ll see that App Bridge is throwing an error, and the reason why:

For reference, the correct url is: https://cdn.shopify.com/shopifycloud/app-bridge.js

Hi @bkspace
Thanks — I dug into the console and reproduced the failure. Here’s what I’m seeing and what I need you to confirm:

What I see (console / runtime):

  • Init error: Error: app-bridge not found on window: timeout

  • document.querySelector('meta[name="shopify-api-key"]')?.contentundefined

  • !!window['app-bridge']false

  • !!window['app-bridge-utils'] || !!window['AppBridgeUtils']false

  • typeof (window['app-bridge-utils']?.getSessionToken || window['AppBridgeUtils']?.getSessionToken)'undefined'

  • typeof window.fetchWithSessionToken'undefined'

Why this matters:
Shopify’s embedded-app checks (“Using the latest App Bridge script” and “Using session tokens for user authentication”) will only pass if (A) the official App Bridge script is loaded into the page that actually initializes your UI (and exposed on window.app-bridge) and (B) app-bridge-utils.getSessionToken is available so your code can generate session tokens (or you provide a working fallback). Right now both are missing at runtime, so the session-token check cannot pass.