What the console says
crossorigin attribute, Chrome reported the 404 as a CORS block.The widget is one script from embed.tawk.to, and everything else loads from it. When the bubble does not appear, the browser console usually says why, in words that point the wrong way. This is what we saw and what tawk.to's help centre adds:
| What you see | Likely cause | Fix |
|---|---|---|
| CORS error and 404 for embed.tawk.to | Wrong or placeholder property / widget ID | Copy the Widget Code again |
| “violates the following Content Security Policy directive” | Your site's CSP leaves tawk.to out | Add tawk.to's domains |
| The widget loads badly or not at all, no clear error | A strict Referrer-Policy | strict-origin-when-cross-origin |
| Missing when no agent is online | Hide widget when offline, or the Scheduler | Widget Behavior settings |
| Missing only on mobile, or only on desktop | Hide widget on load in mobile / desktop | Widget Behavior settings |
| WordPress plugin installed, nothing shows | Third-party cookies blocked | See tawk.to's plugin note |
| Shows for you but not for others, or the other way round | Page cache | Clear the cache, test in a private window |
A CORS error that really means a wrong ID
tawk.to's snippet builds a script address from two parts: the property ID and the widget ID, as in https://embed.tawk.to/PROPERTY_ID/WIDGET_ID. We gave it an ID that does not exist. tawk.to answered 404, and Chrome logged “Access to script at 'https://embed.tawk.to/…/default' from origin … has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.” A placeholder ID left in the snippet, like PROPERTY_ID, gave the same error.
The snippet sets crossorigin on the script tag, so the browser treats the 404 page as a cross-origin response without permission and reports CORS instead of “not found”. Changing CORS settings on your own server will not help. Copy the snippet again: in tawk.to, select the property, go to Administration, then Chat Widget, and copy the Widget Code field. tawk.to's guide says to paste it just before the closing </body> tag.
If your site has more than one tawk.to property, check that the snippet belongs to the property you are watching in the dashboard.
Your Content Security Policy blocks tawk.to
If your site sends a Content-Security-Policy header, the browser loads scripts only from the sources it lists. On our test page with script-src 'self' 'unsafe-inline', Chrome refused the widget: “Loading the script 'https://embed.tawk.to/…' violates the following Content Security Policy directive”. Nothing appeared, and no request was sent at all.
tawk.to's help centre lists what to allow. Merge these sources into the policy you already have rather than replacing it. The 'self' entries are your own sources; the rest comes from tawk.to's list.
If the bubble shows but the chat window stays blank or images are missing, the script got through and one of the other directives, usually frame-src or connect-src, is still blocking. The console names the directive in each error.
Content-Security-Policy: script-src 'self' *.tawk.to cdn.jsdelivr.net; style-src 'self' *.tawk.to fonts.googleapis.com cdn.jsdelivr.net; frame-src *.tawk.to; font-src *.tawk.to fonts.gstatic.com; img-src 'self' *.tawk.to cdn.jsdelivr.net tawk.link s3.amazonaws.com; connect-src *.tawk.to wss://*.tawk.to; form-action *.tawk.to
The Referrer-Policy is too strict
tawk.to has a help article on this one: for the widget to load properly, the site's Referrer-Policy must be strict-origin-when-cross-origin or no-referrer-when-downgrade, so the widget can see which site it is on. A policy of no-referrer or same-origin, set by a security plugin, a firewall or a <meta name="referrer"> tag, hides that.
To check, open DevTools, go to Network, search for tawk.to, click the request with your widget ID and look for Referrer Policy under the General headers. We did not reproduce this case, because it needs a real tawk.to property.
The widget is hidden on purpose
If the console is clean, look at the dashboard before the code. In tawk.to, Administration, Chat Widget, Widget Behavior has visibility switches that remove the bubble without any error:
- Hide widget when offline hides it while the widget is offline.
- Widget offline when all agents offline makes it go offline when nobody is logged in. Together with the first switch, the bubble disappears whenever your team is away.
- Hide widget on load in desktop and Hide widget on load in mobile hide it on one kind of device. That is the usual answer to “tawk.to not showing on mobile”.
The Widget Scheduler sets online hours. tawk.to says the widget stays offline during scheduled offline periods even if an agent is logged in, and that the Scheduler overrides the all-agents-offline switch. So with “Hide widget when offline” on, a schedule in the wrong time zone hides the bubble during your own working day.
Installed with the WordPress plugin, still nothing
tawk.to has a separate note for its WordPress plugin: if the widget does not show after you install the plugin, you may need to enable third-party cookies. Their steps are per browser. After any change, tawk.to's install guide says to open the site in a private window, or clear the cache, and check that the widget appears. A page cache that still serves a copy from before you added the code is a common reason the bubble shows for you and not for visitors.
If you are choosing a chat widget anyway
Formgong's AI help chat is a script tag too, so some of this applies to it. If your site has a Content-Security-Policy, our chat needs the Formgong origin allowed in script-src and connect-src. It answers only on the domains you list for it; anywhere else it gets HTTP 403 and the panel says the chat is offline. The difference is who answers: our chat replies from the pages and text you give it, at any hour, and passes the conversation to you when a visitor asks for a person.
The same account covers contact forms that email you and post to Telegram, a review widget (we do not verify purchases, so you approve each review), and free templates with the form already connected.
Still no bubble?
Which line did your console show, or was the console empty? Write to support@formgong.com and tell us what you see. If it is a case we have not covered, we will check it and add it here.
Frequently asked questions
Why is my tawk.to widget not showing?
Check the browser console. A CORS error with a 404 means a wrong property or widget ID, a Content Security Policy error means your site blocks tawk.to, and no error usually means a setting such as Hide widget when offline.
Why does tawk.to show a CORS error?
On our test, a made-up property ID made embed.tawk.to answer 404, and Chrome reported it as a CORS block because the snippet loads the script with crossorigin. Copy the Widget Code again from Administration, Chat Widget.
Why is tawk.to not showing on mobile?
Check Hide widget on load in mobile under Administration, Chat Widget, Widget Behavior. It hides the bubble when the site loads on a phone.
Which Referrer-Policy does tawk.to need?
tawk.to's help centre says strict-origin-when-cross-origin or no-referrer-when-downgrade, so the widget can detect the page it is on.
Sources and documentation
Official references for this guide: tawk.to: Adding the tawk.to widget to your website, tawk.to: Resolving Content Security Policy issues, tawk.to: How to change the Referrer-Policy setting, tawk.to: Change how the widget behaves on your site, tawk.to: Using the Widget Scheduler. AI help chat, where data is stored.
Related guides
- Lovable form submissions to email and Telegram
- HTML contact form without a backend: a working example
- How to send website form submissions to Telegram
- Contact form not sending email? Check where it stops
- Managing website leads in Telegram without a CRM
- Form backend for Lovable, Bolt, v0, Cursor
- Telegram bot for a contact form: build or skip?
- GDPR form backend: 7 checks before you choose
- Lovable form not sending email? 6 fixes
- Netlify Forms not working? React and Bolt fixes
- Stop contact form spam without a CAPTCHA
- GitHub Pages contact form: a working setup
- Mailto Form in HTML: Why It Fails and What to Use
- HTML form to Google Sheets: 2 free methods
- Webflow form submission limit: what to do at 50
- Turnstile vs reCAPTCHA vs hCaptcha for forms
- Contact Form 7 and Elementor forms to Telegram
- Squarespace contact form not sending email?
- Shopify contact form: where do messages go?
- Google Form to Telegram: free Apps Script way
- Wix contact form not sending email? Fixes
- EU / GDPR Formspree alternatives compared
- HTML form action attribute explained
- How do HTML forms work? The HTTP request
- Types of Injection Attacks on Web Forms (2026)
- Indirect Prompt Injection in MCP
- MCP Rug Pull Attack: Detect Tool Changes
- Form without a backend: 7 ways that work
- Thank-you page after form submission (HTML)
- Indirect Prompt Injection Examples (2023–2026)
- Indirect Prompt Injection via Email
- What Is Tool Poisoning in MCP?
- WordPress contact form without a plugin
- Send email from frontend JavaScript
- How to Prevent Indirect Prompt Injection
- Honeypot Form Field: How to Add One That Works
- Contact Form with File Upload (HTML, No PHP)
- Angular contact form without a backend
- Send form submissions to Slack or Discord without Zapier
- Verify a form webhook signature (HMAC-SHA256)
- Contact forms that send nothing: 793 AI-built sites tested
- v0 contact form that actually sends: 3 ways
- How we tested AI-built contact forms, and 12 bugs we hit
- Cloudflare vs Netlify free plan: hosting that never pauses
- EmailJS 412 “Gmail_API: Invalid grant”: reconnect Gmail
- Resend “You can only send testing emails”: verify a domain
- Supabase Edge Function blocked by CORS policy: 3 causes
- Formspree “Form not found” and other errors: fixes
- Web3Forms errors: “Invalid access key” and 403 explained
- How to add customer reviews to your website for free
- Getform not working? “This form has been deleted” and more
- Next.js contact form not working? 6 errors, reproduced
- Webflow form not sending email? What to check, tested
- FormSubmit not working? “This form needs Activation” fix
- Contact form “TypeError: Failed to fetch”: causes and fixes
- WooCommerce product enquiry form
- Contact Form 7 vs WPForms
- Gravity Forms alternative free
- WordPress contact form block
- 535-5.7.8 Username and Password not accepted (Gmail)
- 535 5.7.3 Authentication unsuccessful: Office 365 SMTP
- Nodemailer “Missing credentials for "PLAIN"”: the fix
- Nodemailer “Greeting never received”: port 465 fix
- Nodemailer SSL “wrong version number”: the port fix
- Nodemailer “self-signed certificate in certificate chain”
- Nodemailer ECONNREFUSED 127.0.0.1:587: missing SMTP host
- SendGrid “authorization grant is invalid”: 401 fix
- Mailgun 401 Forbidden: why the API rejects your key
- “Edge Function returned a non-2xx status code”: the fix
- Next.js “Body exceeded 1 MB limit”: Server Action fix
- Unexpected token '<', "<!DOCTYPE "... is not valid JSON
- “TypeError: Body is unusable”: body has already been read
- Turnstile “timeout-or-duplicate” and other siteverify errors
- Turnstile vs hCaptcha vs reCAPTCHA: speed and size tested
- Judge.me reviews not showing on Shopify: how to fix it
- Judge.me review carousel not showing: how to fix it
- Yotpo reviews not showing on Shopify? Check the app embed
- Loox reviews not showing on product page: how to fix
- Shopify reviews not showing: what to check first
- How to show reviews on Shopify
- GDPR for website forms: what each type of form needs
- WooCommerce reviews not showing: how to fix it
- Stamped.io reviews not showing on Shopify: how to fix it
- Etsy reviews not showing: why and what to do
- Trustpilot widget not loading: how to fix TrustBox
- Yotpo problems in 2026: what merchants report
- Contact Form 7 “error trying to send your message” fix
- Elementor form “Your submission failed because of an error”
- Framer form not sending email or not working: what to check
- Carrd contact form not working: plans, spam and errors
- Google review link not working: what customers see and why
- How to add questions and answers to your product page
- “Failed to send a request to the Edge Function”: fixes
- Next.js “Failed to find Server Action”: what it means
- Brevo “unauthorized: Key not found” 401: the fix
- Amazon SES “Email address is not verified”: the fix
- Shopify contact form not working: how to fix it
- Judge.me alternative for WooCommerce after the 2025 shutdown
- Free WooCommerce review plugins compared on the free version
- WooCommerce review reminder emails without a paid plugin
- Add Voice Recording to a Website Form
- Contact Form 7 spam: how to stop it
- WPForms not sending email: how to fix it
- Contact form emails going to spam: how to fix it
- HTML form not submitting: how to fix it
- Contact form not working: how to find the fault
- Webflow form spam: how to stop it
- Website form to Notion: how to set it up
- Website form to WhatsApp: what works and what does not