Chat Widget Not Showing on Your Website? 12 Causes and Fixes
A chat widget that is installed but not showing usually has one of 12 causes, from caches and allowed domains to ad blockers and CSP. A check and fix for each.

Short answer
A chat widget that is installed but not showing usually fails at one of twelve points, as of October 2026: an unpublished or cached page, a misplaced or mangled snippet, a wrong account ID, a tag-manager tag that never fired, a domain missing from the allowed list, a vendor visibility rule, an ad blocker, a consent manager, a Content Security Policy, a script-delaying plugin, a duplicate script, or CSS covering the launcher. Check them in that order.
You pasted the snippet, saved, refreshed, and the corner of the page is empty. Or the launcher shows for you, and a customer writes in to say there is no chat. Your browser can usually tell the causes apart in about a minute.
This guide is for site owners and the freelancers and agencies who install chat widgets for them: a 60-second triage, twelve causes with a check and a fix each, then the mobile, editor, Content Security Policy and testing cases. It applies to any widget, live chat or AI support agent, with PepoChat's messages as worked examples.
PepoChat is our product; its behaviour below was checked in its code and documentation on 22 October 2026. Other vendors' behaviour comes from their own documentation, read the same day.
How do you find out why a chat widget is not showing?
You can find out why a chat widget is not showing in about 60 seconds with three browser views: View Page Source shows whether the snippet reached the page, the Network tab shows whether the script loaded, and the Console shows what stopped it.
- Open the live page in a private window. It starts without your logins, cookies and, in most browsers, extensions, so you see what a new visitor sees.
- Search the page source. Press Ctrl+U (Cmd+Option+U in Chrome on a Mac) and search for the vendor's domain, such as
widget.pepochat.com. Tag managers and some builders add scripts later, so also search the Elements panel. - Watch the Network tab. Open DevTools with F12, choose Network, reload and filter by the vendor's domain. No request means the script never ran,
net::ERR_BLOCKED_BY_CLIENTmeans an extension blocked it,(blocked:csp)means a security policy did, and a 403 usually means a domain rule. - Read the Console. Messages that name the vendor explain most of the rest, such as a line containing "violates the following Content Security Policy directive".
- Find the launcher element. Search the Elements panel for it; PepoChat's has the id
echo-widget-button. If it exists but you cannot see it, something on the page covers or moves it.

What does the chat window's message mean?
When the launcher appears and the window shows a message, the vendor is naming the cause. PepoChat's messages, as of October 2026:
| What you see | Where | What it means | Fix |
|---|---|---|---|
| "data-organization-id attribute is required" and no launcher | Console | The snippet has no ID | Copy the snippet again from Widget Setup |
| "Organization not valid" | Chat window | The ID in the snippet is wrong | Copy the snippet again from Widget Setup |
| "This website is not allowed to use this chat widget." | Chat window | The page's domain is not on Allowed Domains | Add the hostname in Widget Customization |
| "Chat is not available in your region." | Chat window | The visitor's country is on Blocked countries | Remove the country code if it was a mistake |
| "The chat couldn't load" | Chat window, 15 seconds after opening | The chat frame never arrived: a network problem between the visitor and PepoChat | Retry, and look for widget.pepochat.com in the Network tab |
| "The chat is taking too long to load" | Chat window, after 30 seconds | The widget could not reach PepoChat's backend | Check the connection and retry |
| "Echo Widget: already initialized" | Console warning | A second copy of the snippet was ignored | Remove the extra copy |
Messages read in PepoChat's loader, widget and backend code on 22 October 2026.
What are the 12 causes of a chat widget not showing?
A chat widget that is installed but invisible usually fails at one of twelve points between your page and the vendor's servers, and each has a one-minute check. Causes 1 to 4 keep the snippet off the page, 5 and 6 are account rules, 7 to 9 are blockers, and 10 to 12 are conflicts on a page where the script did load.
| # | Cause | Symptom | One-minute check | Fix |
|---|---|---|---|---|
| 1 | Page not republished, or a cache serves the old copy | You see the widget while logged in; visitors do not | Search the live page's source in a private window for the vendor's domain | Publish, then purge the plugin, host and CDN caches |
| 2 | Snippet missing, misplaced or mangled | Widget on one page only, code printed as text, or nothing at all | Compare the source of two pages; look for curly quotes, a missing </script> or an http:// address | Paste the vendor's snippet into the site-wide footer or custom-code setting |
| 3 | Wrong account ID | Nothing, or an error inside the chat window | Compare the ID in the source with the vendor's dashboard | Copy the snippet again from the dashboard |
| 4 | Tag manager never fired the tag | Script absent from both source and Elements | Preview mode: did the chat tag fire? | Use an All Pages trigger, then submit and publish |
| 5 | Domain not on the allowed list | Launcher missing or chat refuses to start; a 403 in the Network tab | Compare the exact hostname with the vendor's allowed or trusted domains | Add the hostname, plus staging and preview hosts |
| 6 | A vendor setting hides it | Missing on some pages, devices, hours or countries, or everywhere after a plan lapsed | Read the vendor's visibility, audience and billing settings | Change the rule, or renew the plan |
| 7 | Ad blocker or privacy tool | Missing in one browser only | Private window with extensions off; look for net::ERR_BLOCKED_BY_CLIENT | Nothing to fix for visitors; add a fallback contact link |
| 8 | Consent manager | Missing until the visitor accepts cookies, or for everyone who declines | Reject all cookies, then inspect the script tag for type="text/plain" | File the widget under the right category, or use click-to-load |
| 9 | Content Security Policy | No launcher (script refused) or an empty window (frame refused) | Console line containing "violates the following Content Security Policy directive" | Add the vendor's origins to script-src and frame-src |
| 10 | Performance plugin delays the script | Launcher appears only after you scroll or move the mouse, never in speed tests | Switch off the delay option and reload | Exclude the vendor's script from the delay |
| 11 | Script loads twice, or an app removes it | Two launchers, old settings, or the launcher gone after navigation | Count the vendor's script tags in Elements | Keep one install method; load once at the app root |
| 12 | CSS or another element covers it | Launcher in Elements but not on screen, or at the bottom of the page | Inspect the launcher's position and z-index | Move the launcher, lower the other element, or remove a body transform |
Vendor behaviour checked on 22 October 2026 in each vendor's own documentation and in PepoChat's code.
Why is the chat widget missing from the page source?
A chat widget is missing from the page source when its snippet never reached the published HTML: the page was not republished, a cache served an older copy, the code went to the wrong place, or a tag manager never added it.
1. The page was not republished, or a cache serves the old copy
Webflow and Framer apply new custom code only when you publish. Caches in plugins, hosts and CDNs keep serving pages saved before the snippet existed, and logged-in pages usually bypass them, so you see the widget while visitors do not. Tidio's WordPress guide also says to disable caching plugins such as W3 Total Cache temporarily.
Publish, then purge every layer. PepoChat's WordPress plugin clears the common page caches, including LiteSpeed, WP Rocket and W3 Total Cache, when you save its settings.
2. The snippet is missing, misplaced or mangled
Code pasted into one page's embed block shows the widget on that page only; site-wide code belongs in the builder's footer or custom-code setting, or in the theme before </body>. A visual text block can print the code as text, and copying through a word processor can turn straight quotes into curly ones, which breaks the attributes.
On Wix, an Embed HTML element runs code in a frame of its own, trapping the launcher in a box. A script address starting with http:// fails on an https page, because MDN's mixed content guide lists scripts as "blockable" content that browsers block rather than upgrade.
3. The account ID in the snippet is wrong
Every snippet carries an account identifier, such as Intercom's app_id, Tidio's public key or PepoChat's data-organization-id, and a typo or an ID from a test workspace loads nothing or an error. Intercom's troubleshooting article suggests reading the app_id inside the ping request in the Network tab. PepoChat still draws the launcher, and the window says "Organization not valid".
4. The tag manager never fired the tag
A tag manager adds the widget after the page loads, so it never appears in View Page Source, and the trigger and the published version decide whether it runs. Google's help says workspace changes must be published "to make those changes operational on your website", and Preview mode connects your site to Tag Assistant "so that you can inspect which tags fired and in which order", in the words of its preview and debug guide. A chat tag that did not fire needs an All Pages trigger, or a look at its consent checks.
Can an allowed-domains list or a vendor setting hide the widget?
Yes: many chat vendors refuse to run on a domain missing from the account's allowed list, and most offer visibility rules by page, device, hours, country or audience that hide the widget on purpose.
5. The domain is not on the allowed list
An allowed-domains list is an account setting naming the websites that may run your widget, so a copied snippet cannot spend your quota elsewhere. Intercom calls them trusted domains: when yours is missing, "the Messenger won't load and you'll see a 403 error in your browser console". In our chat widget page-speed test on 19 October 2026, Intercom, LiveChat and Smartsupp all refused to start on an unlisted domain.
PepoChat draws the launcher anyway and explains the refusal inside the window, without spending an AI reply. Its list treats example.com as covering www.example.com and other subdomains, but www.example.com as only itself; staging and preview hosts are easy to forget.
6. A vendor setting hides the widget on purpose
Tidio's hide or disable guide documents a display switch set separately for desktop and mobile, an option that hides the widget whenever all agents are offline, page rules matched by "contains" or "exact" URL, and country rules. Intercom adds audience rules for its launcher, and says you "won't be able to use the Messenger" without a trial or subscription.
PepoChat's WordPress plugin can hide the widget for logged-in users, which also hides it from you while you test. The PepoChat dashboard has no page or device rules, and blocked countries leave the launcher visible while the window says "Chat is not available in your region." A Free workspace past its 200 monthly AI replies keeps the widget too; new conversations go to the team inbox.
Do ad blockers block chat widgets?
Some ad blockers block chat widgets: as of October 2026, uBlock Origin's optional EasyList Chat Widgets list blocks the scripts of Intercom, Tidio, Crisp, tawk.to and many other vendors, its AdGuard Widgets list covers many of the same, and both are off by default.
The lists uBlock Origin enables by default, such as EasyList and EasyPrivacy, target ads and trackers; on 22 October 2026 they mostly left chat widgets alone, blocking a few vendors' analytics addresses. EasyList Chat Widgets, 288 rules last changed on 9 October 2026, also names LiveChat, HubSpot's chat, Freshchat, Gorgias, Help Scout, Zendesk's messaging widget and Chatbase's embed. AdGuard's filter documentation says its Widgets filter "blocks third-party widgets: online assistants, live support chats, etc."
Lists change every few days and any vendor can be added, so no widget can promise to get past them. Test in a private window without extensions, or in a second browser.
You cannot change your visitors' extensions, but a plain link can open the chat when it loaded and your contact page when it did not:
<a href="/contact" onclick="if (window.EchoWidget) { window.EchoWidget.show(); return false; }">Chat with us</a>
The example uses PepoChat's EchoWidget.show(); Intercom's equivalent is Intercom('show').
Can a cookie consent banner stop a chat widget from loading?
Yes: a consent manager that blocks scripts automatically holds back a chat widget it files under preferences, statistics or marketing until the visitor accepts that category, so visitors who decline, or ignore the banner, never see it.
A consent management platform (CMP) is the tool that shows your cookie banner and records each visitor's choice. Cookiebot's help center says its auto-blocking "prevents HTML elements from loading that can be the source of tracking", guided by its scans of your site. A script marked data-cookieconsent="ignore" escapes the blocking, and may then set tracking without consent.
To check, reject all cookies in a private window and inspect the widget's script tag: type="text/plain" usually means a consent manager is holding it. Choose the category deliberately; the guide to chat widget cookie consent covers what needs consent and a click-to-load pattern, as information rather than legal advice. PepoChat sets no cookies on your site.
What is Content Security Policy and why does it hide a widget?
Content Security Policy (CSP) is a set of rules your site sends to the browser naming the origins allowed to supply scripts, frames and other resources, and a widget whose origins are missing is refused, so its launcher never draws or its window stays empty.
MDN's CSP guide describes it as instructions "which instruct the browser to place restrictions on the things that the code comprising the site is allowed to do", sent in a Content-Security-Policy header or a meta tag. Security plugins, hosts and frameworks often add one quietly.
Two directives matter for most widgets: script-src for the loader, and frame-src for a chat window in an iframe, which falls back to child-src and then default-src when absent. Widgets that run in your page rather than a frame may also need connect-src or img-src; the Console names every refused address.
PepoChat needs one origin in two directives, because the chat's own requests happen inside its frame:
Content-Security-Policy: script-src 'self' https://widget.pepochat.com; frame-src https://widget.pepochat.com
Merge those sources into your existing policy. If only frame-src leaves it out, the launcher appears but the window shows a browser error or stays blank.
A nonce is a random value the server writes into the policy and onto each script tag it trusts, and MDN says it "must be different for every HTTP response". With 'strict-dynamic' in the policy, MDN adds, "any allowlist or source expressions such as 'self' or 'unsafe-inline' will be ignored", so adding the vendor's domain changes nothing: the pasted tag needs the page's nonce. Try changes under a Content-Security-Policy-Report-Only header first, which reports violations without enforcing them.
Which code conflicts hide a widget that did load?
Three conflicts hide a chat widget whose script did load: an optimisation plugin that delays it until the visitor interacts, a second copy or a single-page app that removes it, and page CSS that covers or moves the launcher.
10. A performance plugin delays the script
WP Rocket's Delay JavaScript execution works by "delaying the loading of all JavaScript files and inline scripts until there is a user interaction", such as scrolling, a touch or a click. The launcher then appears only after the first interaction, and never in speed tests or screenshots. Exclude the vendor's domain under Excluded JavaScript Files, or add the nowprocket attribute to the tag.
Cloudflare's Rocket Loader defers all JavaScript until after rendering; its documentation says to put data-cfasync="false" before the src attribute to make it skip a script.
11. The script loads twice, or a single-page app removes it
Two installs, such as a plugin plus pasted code, can stack two launchers or break the second copy; Tidio asks for "only one installation method - the Plugin or the javascript code". PepoChat's loader keeps the first copy and logs "Echo Widget: already initialized" for the second, so the first copy's ID and data-position win.
A single-page app is a site built with React, Vue or a similar framework that swaps content without loading new pages. A component that adds the widget on one route and removes it on unmount takes the launcher away as visitors navigate. Load the script once at the app root, as the script tag install guide shows.
12. CSS or another fixed element covers the launcher
When the launcher exists in the Elements panel but not on screen, page CSS is winning. A fixed element in the same corner with a higher z-index covers it: cookie banners, sticky add-to-cart bars, back-to-top buttons and Webflow's "Made in Webflow" badge are the usual suspects. PepoChat's launcher sits 20 pixels from the corner with a z-index of 999,999.
MDN's position reference adds a subtler case: a fixed element is placed against the viewport "unless any ancestor has transform, perspective, or filter property set to something other than none". A theme that sets transform on the body therefore pins the launcher to the bottom of the page, not the screen. Use data-position="bottom-left", lower the other element or remove the transform.
Why does the chat widget show on desktop but not on mobile?
A chat widget usually shows on desktop but not on mobile because of a mobile-only setting or element: a vendor's device switch, a sticky bar or cookie banner over the corner, or a content blocker on the phone.
Tidio's display switch is set "separately for the desktop version and for the mobile version", and other vendors have similar options. Mobile themes put add-to-cart bars, bottom navigation and cookie banners where launchers sit, and a full-width bar with a higher z-index hides a launcher in either corner, so the bar has to move or drop below it.
Test on a real phone: desktop device emulation copies the screen size and touch, not the phone's browser, toolbars or content blockers.

Why does the widget show in the editor but not on the live site?
Most website builders run custom code only on the published site, so a widget missing from the editor is normal, while one that shows in a preview but not live usually means the change was never published or a cache serves the old page.
Wix runs custom code only on a published site with a Premium plan and a connected domain, Framer never runs it on the canvas, and Carrd's embeds show nothing in the builder, as our Wix guide and Webflow, Framer, Carrd and Ghost guide describe. Webflow does run code in the Designer's preview, but on Webflow's own address, where an allowed-domains list refuses the chat.
On Squarespace, the logged-in view can hide a launcher that visitors see, so the Squarespace guide suggests a private window. On WordPress, being logged in skips the page cache and may trigger a plugin's hide rule; Intercom tells WordPress users to log out before checking.
How do you test a chat widget before customers see it?
You can test a chat widget privately in four ways: a staging domain on the allowed list, an unlinked test page, a script that loads the widget only with a secret URL parameter, or the vendor's preview in its dashboard.
- A staging domain. Add it to the allowed list while you test, and remove it at launch. Intercom's Messenger cannot set its cookie on public-suffix domains such as herokuapp.com, so stage on your own domain.
- An unlinked test page. Paste the snippet into one page that nothing links to, marked noindex.
- A secret parameter. Put this before
</body>, and the widget loads only when the address contains?chattest=1:
<script>
if (new URLSearchParams(location.search).has("chattest")) {
var s = document.createElement("script");
s.src = "https://widget.pepochat.com/widget.js";
s.async = true;
s.setAttribute("data-organization-id", "YOUR_ORGANIZATION_ID");
document.body.appendChild(s);
}
</script>
- The vendor's preview. PepoChat's Test the agent drawer runs the real widget in the dashboard with free test replies, hidden from analytics, though bookings, actions and emails still run for real. It tests answers, not your installation, so do both.
When should you contact the widget vendor?
Contact the widget vendor once the triage shows the snippet on the page and nothing on your side blocking it, and send the page address, your browser and device, Console and Network screenshots, and the snippet as View Page Source shows it.
Say whether a private window reproduces it, and include your account ID but never passwords or API keys. Tidio also asks for a link to your website, and PepoChat for the exact error text.
What to do next
- Run the 60-second triage on your live site in a private window, then on a phone over mobile data.
- Using PepoChat? Keep its troubleshooting docs open as you work through the table.
- Create a free workspace to try a widget that explains its refusals: allowed domains, blocked countries and the Test the agent drawer are on every plan, including Free.
- Related guides: installing a chat widget with Google Tag Manager and which website builders allow a chat widget.
Frequently asked questions
- Why is my chat widget not showing on my website?
- Usually because the snippet never reached the live page, or something on the page blocks it. Open the published page in a private window, search View Page Source for the vendor's domain, then check the Network tab and Console. The common causes are an unpublished or cached page, a wrong ID, a domain missing from the allowed list, an ad blocker, a consent manager and a Content Security Policy.
- Do ad blockers block chat widgets?
- Some do. As of October 2026, the lists uBlock Origin enables by default mostly leave chat widgets alone, but its optional EasyList Chat Widgets list blocks the scripts of Intercom, Tidio, Crisp, tawk.to and many others. Any widget can be added to such lists, so test in a private window without extensions and give visitors a plain contact link as a fallback.
- Why does the widget show on desktop but not on mobile?
- Usually a mobile-only setting or element is responsible. Check the vendor's device settings first: Tidio, for example, has separate display switches for desktop and mobile. Then look for a sticky add-to-cart bar, bottom navigation or cookie banner covering the corner, and for a content blocker on the phone. Test on a real phone, because desktop device emulation does not reproduce the phone's browser.
- What is Content Security Policy and why does it hide my widget?
- Content Security Policy is a set of rules a site sends to the browser listing which origins may supply scripts, frames and other resources. If the widget's origins are missing, the browser refuses them and the Console logs a line containing 'violates the following Content Security Policy directive'. For PepoChat, add https://widget.pepochat.com to both script-src and frame-src.
- Why does the widget show in the editor but not on the live site?
- Usually the change was saved but never published, or a cache still serves the old page. Publish, purge the caches and test the live domain in a private window. The reverse is common too: Wix, Framer and Carrd run custom code only on the published site, while Webflow's preview runs it on Webflow's own address, where an allowed-domains list refuses to start the chat.
- How do I test a chat widget before customers see it?
- Use a staging domain on the widget's allowed list, an unlinked test page, or a small script that loads the widget only when the address contains a secret parameter. Most vendors also offer a preview in the dashboard. PepoChat's Test the agent drawer runs the real widget with free test replies, although bookings, integration actions and emails in a test chat still run for real.
Try this on your own site in ten minutes
PepoChat includes every feature on the free plan — 200 AI replies and 5 knowledge sources a month, no credit card.
Keep reading
Chatbase vs PepoChat: Which AI Support Agent Fits Your Team in 2026?
An honest side-by-side of Chatbase and PepoChat on pricing, free plan or trial, sources, handoff, booking, actions, channels and voice, and a pick by team type.
Intercom Fin Pricing Explained, and What a Flat-Plan Alternative Costs
What Intercom Fin's $0.99 per outcome adds up to once you count resolutions and seats, with a worked 2,000-conversation example and when a flat plan wins.
