Chat widgetHow-toWebsite builders

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.

PepoChat TeamPublished Last verified 13 min read
A young man in glasses holds his head in both hands while staring at an open laptop at his desk

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.

  1. 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.
  2. 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.
  3. 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_CLIENT means an extension blocked it, (blocked:csp) means a security policy did, and a 403 usually means a domain rule.
  4. 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".
  5. 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.
Close-up of a dark screen showing markup with div and span elements and className attributes in blue, green and orange syntax colors
Start with the page itself: if the widget's script address is in neither View Page Source nor the Elements panel, the cause is publishing, placement or a tag manager, not the vendor.

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 seeWhereWhat it meansFix
"data-organization-id attribute is required" and no launcherConsoleThe snippet has no IDCopy the snippet again from Widget Setup
"Organization not valid"Chat windowThe ID in the snippet is wrongCopy the snippet again from Widget Setup
"This website is not allowed to use this chat widget."Chat windowThe page's domain is not on Allowed DomainsAdd the hostname in Widget Customization
"Chat is not available in your region."Chat windowThe visitor's country is on Blocked countriesRemove the country code if it was a mistake
"The chat couldn't load"Chat window, 15 seconds after openingThe chat frame never arrived: a network problem between the visitor and PepoChatRetry, and look for widget.pepochat.com in the Network tab
"The chat is taking too long to load"Chat window, after 30 secondsThe widget could not reach PepoChat's backendCheck the connection and retry
"Echo Widget: already initialized"Console warningA second copy of the snippet was ignoredRemove 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.

#CauseSymptomOne-minute checkFix
1Page not republished, or a cache serves the old copyYou see the widget while logged in; visitors do notSearch the live page's source in a private window for the vendor's domainPublish, then purge the plugin, host and CDN caches
2Snippet missing, misplaced or mangledWidget on one page only, code printed as text, or nothing at allCompare the source of two pages; look for curly quotes, a missing </script> or an http:// addressPaste the vendor's snippet into the site-wide footer or custom-code setting
3Wrong account IDNothing, or an error inside the chat windowCompare the ID in the source with the vendor's dashboardCopy the snippet again from the dashboard
4Tag manager never fired the tagScript absent from both source and ElementsPreview mode: did the chat tag fire?Use an All Pages trigger, then submit and publish
5Domain not on the allowed listLauncher missing or chat refuses to start; a 403 in the Network tabCompare the exact hostname with the vendor's allowed or trusted domainsAdd the hostname, plus staging and preview hosts
6A vendor setting hides itMissing on some pages, devices, hours or countries, or everywhere after a plan lapsedRead the vendor's visibility, audience and billing settingsChange the rule, or renew the plan
7Ad blocker or privacy toolMissing in one browser onlyPrivate window with extensions off; look for net::ERR_BLOCKED_BY_CLIENTNothing to fix for visitors; add a fallback contact link
8Consent managerMissing until the visitor accepts cookies, or for everyone who declinesReject all cookies, then inspect the script tag for type="text/plain"File the widget under the right category, or use click-to-load
9Content Security PolicyNo 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
10Performance plugin delays the scriptLauncher appears only after you scroll or move the mouse, never in speed testsSwitch off the delay option and reloadExclude the vendor's script from the delay
11Script loads twice, or an app removes itTwo launchers, old settings, or the launcher gone after navigationCount the vendor's script tags in ElementsKeep one install method; load once at the app root
12CSS or another element covers itLauncher in Elements but not on screen, or at the bottom of the pageInspect the launcher's position and z-indexMove 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').

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.

A hand holds up a smartphone with a blank white screen in a sunny office with a large green plant behind it
An empty corner on a phone is usually a device setting or a sticky bar rather than a broken install, so check both before touching the code.

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.

  1. 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.
  2. An unlinked test page. Paste the snippet into one page that nothing links to, marked noindex.
  3. 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>
  1. 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

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.