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:
| Observation | Likely cause |
|---|---|
No request for spelo.js at all | The <script> tag isn’t on this page |
404 on spelo.js | Wrong src URL (e.g. typo in spelo.ai) |
200 on spelo.js but no orb | data-site-id wrong, or Origin not registered |
| Request pending forever | CSP blocking the fetch |
spelo.js 200, then /config 403 | Origin mismatch — the site’s URL ≠ registered domain |
Checklist
-
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. -
Is
data-site-idthe right value?Compare against Dashboard → Site detail → Install. Case-sensitive. No leading/trailing whitespace.
-
Does the registered domain match?
Dashboard → Site detail → Domain. Must match the URL you’re loading the site from — including subdomain.
www.example.com≠example.com≠app.example.com.To allow multiple, add each as a separate domain (or use a wildcard:
*.example.com). -
Is the site disabled on this path?
Check enabled / disabled pages. If the current URL matches a
disabled_pagespattern, the orb intentionally won’t show. -
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:; -
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. -
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
-
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.
-
Is this HTTP (not HTTPS)?
Voice requires HTTPS in modern browsers.
http://localhostis a special case that works.http://192.168.1.50won’t — usehttps://with a self-signed cert if you need to test on a LAN device. -
Has the page finished loading?
If your site has heavy JS that takes 5+ seconds to hydrate, the widget might be waiting for
DOMContentLoadedto happen. It should still appear, just slowly. If the page never firesDOMContentLoaded(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.aiexplicitly inscript-src - Use the
noncemiddleware and attach the nonce to the<Script>component via thenonceprop
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.