Skip to content
GitHub
Get started →

Orb not appearing

Nine times out of ten, one of the following is wrong.

Fast diagnosis

Open DevTools → Network tab → reload the page. Look for spelo.js:

ObservationLikely cause
No request for spelo.js at allThe <script> tag isn’t on this page
404 on spelo.jsWrong src URL (e.g. typo in spelo.ai)
200 on spelo.js but no orbdata-site-id wrong, or Origin not registered
Request pending foreverCSP blocking the fetch
spelo.js 200, then /config 403Origin mismatch — the site’s URL ≠ registered domain

Checklist

  1. Is the <script> tag on the page?

    View page source (Cmd-U / Ctrl-U). Search for spelo.ai. Must be present. If it isn’t, your install is missing — see Install guides.

  2. Is data-site-id the right value?

    Compare against Dashboard → Site detail → Install. Case-sensitive. No leading/trailing whitespace.

  3. Does the registered domain match?

    Dashboard → Site detail → Domain. Must match the URL you’re loading the site from — including subdomain. www.example.comexample.comapp.example.com.

    To allow multiple, add each as a separate domain (or use a wildcard: *.example.com).

  4. Is the site disabled on this path?

    Check enabled / disabled pages. If the current URL matches a disabled_pages pattern, the orb intentionally won’t show.

  5. Is CSP blocking?

    DevTools console shows messages like “Refused to load the script ‘https://spelo.ai/spelo.js’ because it violates the following Content Security Policy directive…”

    Add to your CSP:

    script-src 'self' https://spelo.ai;
    connect-src 'self' https://api.spelo.ai https://api.openai.com wss://*;
    media-src 'self' blob:;
  6. Is another script crashing first?

    The widget waits for DOMContentLoaded, then mounts. If an earlier script throws and halts the page, the widget won’t mount. Open DevTools → Console and fix the first red error.

  7. Is the browser supported?

    Widget requires: WebRTC, WebAudio, Shadow DOM, ES2020. That means:

    • Chrome / Edge 90+
    • Firefox 90+
    • Safari 14.1+
    • No IE at all
  8. Is this inside an iframe?

    The widget self-disables inside iframes (voice in iframes is unreliable due to mic-permission delegation). Install on the top-level page instead.

  9. Is this HTTP (not HTTPS)?

    Voice requires HTTPS in modern browsers. http://localhost is a special case that works. http://192.168.1.50 won’t — use https:// with a self-signed cert if you need to test on a LAN device.

  10. Has the page finished loading?

    If your site has heavy JS that takes 5+ seconds to hydrate, the widget might be waiting for DOMContentLoaded to happen. It should still appear, just slowly. If the page never fires DOMContentLoaded (broken), the widget won’t mount. Fix the crashing JS.

Special cases

WordPress + caching plugins

Some caching plugins defer or minify external scripts. Make sure spelo.js is excluded from deferral/minification. See the caching plugin’s “Excluded URLs” settings.

Shopify Online Store 2.0 + App Embeds

The App Embed block must be enabled. Shopify admin → Themes → Customize → App embeds → toggle on Spelo.

Next.js + Strict CSP with nonces

Next.js’s default CSP template uses 'strict-dynamic' which breaks external scripts. Either:

  • Allow https://spelo.ai explicitly in script-src
  • Use the nonce middleware and attach the nonce to the <Script> component via the nonce prop

See Install on Next.js.

SPA — orb shows on first load but disappears on route change

The <script> must be in a persistent layout component, not a leaf page. See the framework’s install guide.

Still stuck?

Open DevTools, copy the full console output, and email support@spelo.ai with:

  • Your site_id
  • The URL of a page where the orb is missing
  • The console output (screenshot or text)
  • Your browser + OS

We usually respond within hours for paid plans.