Skip to content

Widget not loading

These six checks cover common causes of a missing launcher. Walk the diagnostic top-to-bottom and keep the network and console evidence from the first failing check.

Test in an incognito window

Before anything else, open your storefront in an incognito or private window. If the widget shows up there but not in your normal browser, compare extensions, consent state, cached configuration and cookies. A private-window difference is a diagnostic clue, not proof of the cause.

Diagnostic

  1. Is the loader script in the DOM?

    Open DevTools → Elements. Search (Cmd+F) for /widget/loader/. The embed is a single script tag of the form <script src=".../widget/loader/<storeId>.js" defer>. If it is missing, check whether you use the web component or a direct inline iframe instead; those placements do not require this loader tag. Re-enable the Shopify App Embed or paste the snippet - see Embed codes.
  2. Did the loader fetch?

    DevTools → Network → filter on loader. You should see loader/<storeId>.js with HTTP 200. If you see:
    • (blocked) or net::ERR_BLOCKED_BY_CLIENT - an ad blocker or browser extension killed it. Test in incognito.
    • 400 / 404 - the store ID in the URL is wrong or the store no longer exists. Re-copy the snippet from the current dashboard.
  3. Are the widget API calls succeeding?

    Open the chat once, then look for /api/v1/widget/ requests in the Network tab.
    • 200 - the API is fine. If the launcher still doesn’t appear, jump to step 6 (CSS).
    • 401 UNAUTHORIZED - the widget key is missing or invalid (it was rotated, or a stale cached loader is serving the old key). Hard-refresh; if it persists, re-copy the embed from the dashboard.
    • 429 RATE_LIMIT_EXCEEDED - widget API limits hit (20 requests / 10 s, 6 chat messages / 30 s per key + IP). Wait and retry; if it’s constant, talk to support.
    • 503 - rate-limit infrastructure is degraded or unconfigured. Check the support team.
  4. Is the store ID right?

    From DevTools console run:
    js
    document.querySelector('script[src*="/widget/loader/"]').src
    // → the UUID in the path is your store ID
    If the value is the wrong store (e.g. a staging tenant), update the embed.
  5. Did the loader actually boot?

    In the console:
    js
    window.__salespilotWidgetLoaded  // true means the loader ran
    If undefined, the script never executed - see steps 1-2. (It also stays undefined if a second copy bailed out because the first already loaded - one tag per page.)
  6. Is something hiding the launcher?

    The widget mounts a launcher button plus an iframe container marked [data-zubby-root]. If they exist but are invisible:
    • An aggressive display: none or visibility: hidden from a theme rule (rare).
    • The launcher is positioned off-screen - check the position and offset settings in Growth → Widget Designer.
    • A theme overlay sitting on top - the launcher renders at a very high z-index (2147483600), so anything covering it is possibly another overlay. Inspect the covering element and test a targeted layout fix. Do not remove consent or payment controls just to reveal chat.

Shopify-specific

  • App Embed isn’t toggled. Re-open the theme editor and make sure the toggle is on AND the theme is saved.
  • Preview mode vs. live theme. The Shopify theme editor previews a copy of your theme. Make sure you’re editing the live theme, not a backup.
  • Password-protected storefront. The widget only loads on rendered storefront pages - enter the storefront password first, then test on the actual page.

WooCommerce-specific

  • Plugin deactivated. Confirm Zubby is in Plugins → Installed and active.
  • Theme doesn’t call wp_footer(). Custom themes occasionally drop the call. Add it back, or paste the universal snippet manually.
  • Caching layer. Object cache plugins (W3 Total Cache, WP Rocket) can serve stale HTML. Purge after install.

Still stuck

Email hello@zubbyai.com with:

  • A sanitized HAR from the failed load. Remove cookies, authorization headers, tokens and personal request/response data before sharing.
  • Console errors.
  • Your store ID and the storefront URL.

Support timing depends on the account agreement and current queue; this guide does not promise a response or fix time.

Rule out intentional suppression first

Check audience rules, hidden paths, mobile rules, the plugin’s checkout setting and any holdout assignment. Confirm the store is active, the conversation allowance is available and the AI cost cap has not been reached. Test on an eligible product page. Read the failed request’s response body as well as its status; a hidden launcher and an unavailable AI reply can have different causes.

Missing something, or found an error on this page?

Contact support and include the URL of this page (/docs/troubleshooting/widget-not-loading).