Widget isn't showing on your site, or shows only for logged-in users, or shows blank when you open it. This page is the symptom → cause → fix flowchart. Run the checks in order; most installs hit the first one and skip the rest.
Cause: page cache. WordPress caching plugins (W3 Total Cache, WP Rocket, LiteSpeed Cache, WP Super Cache), hosting- level page cache (Hostinger, SiteGround, Cloudways, Kinsta), or Cloudflare APO all serve anonymous visitors a cached HTML snapshot taken BEFORE you installed Pitchbar. Logged-in users bypass page cache, so they always hit fresh PHP and see the widget.
Fix:
widget.js. Present = fixed.Walkthrough:
Base URL, API Token, Agent ID.
Missing any one of them = the plugin's shouldRender()
gate returns false and nothing renders.
post +
page. If your front page is a custom post type
(e.g. landing, product) and you
haven't ticked it, the widget skips that page. Tick the box.
widget.js:
Base URL setting points at a host that doesn't serve widget.js. Should be your Pitchbar install root (e.g. https://pitchbar.your-domain.com).<script async src=…widget.js…>. Missing tag = the shouldRender() gate failed; re-check the previous 3 items.Widget retries the SSE stream 3 times then surfaces this generic bubble. The real error is logged server-side; the bubble is intentionally vague so visitors don't see raw provider errors.
Tail your Laravel logs while reproducing in the widget:
tail -f storage/logs/laravel.log
Common patterns and their fixes:
Workers AI 401: ... — Cloudflare API token rejected.
See Cloudflare 401 troubleshooting.
Vectorize ... expected N dimensions, got M — embed model and index dim mismatch.
See Vector dim recovery.
Workers AI timeout — Cloudflare flaky. Retry; if persistent, switch
CLOUDFLARE_CHAT_MODEL to a smaller variant.
message_quota_exceeded — workspace plan cap reached. Upgrade workspace plan.
conversation_not_found — widget JWT is older than the
conversations.cleared_at on its conversation row. Visitor needs to refresh the page so the widget reissues
a fresh JWT via the next /api/v1/widget/init.
Theme conflict. Some themes set iframe { display: none !important } or use a global
z-index reset. The Pitchbar widget renders inside a Shadow DOM but its mount point is a
<div> on the host page.
Fix: add this CSS to your theme's Additional CSS:
#pitchbar-root,
#pitchbar-root * {
display: revert !important;
visibility: visible !important;
z-index: 2147483647 !important;
}
Reach out at support@pitchbar.app with:
tail -200 storage/logs/laravel.log (or browser Console output if the script never reached your server).