Short answer: create a Custom HTML module, paste the script tag into it, publish it to a footer or debug module position, and set its menu assignment to all pages. The Joomla-specific trap is text filtering, which strips script tags from the editor unless your user group is allowed raw HTML. Clear the Joomla cache afterwards.
Joomla's module system is well suited to this
Joomla is built around modules published to template positions. A chat widget is a natural fit: one module, one position, assigned to every menu item.
The advantage over editing template files is that it is reversible by anyone with backend access, it survives template updates, and you can unpublish it instantly if something goes wrong. For a floating widget you might want to turn off during a sale or a site issue, that toggle is genuinely useful.
The install
In the Joomla administrator, go to the modules area for your site and create a new module. Choose the Custom module type, which in most versions is labelled Custom or Custom HTML.
Give it a name only you will see, like "Chat widget". Set the module to show no title, because you do not want a stray heading appearing in your footer.
Now paste the script tag into the module's content editor. Before you do, read the next section, because this is where Joomla will quietly defeat you.
Set the position to a footer position from your template, or a position that renders on every page. If your template has a dedicated debug or hidden position that still outputs, that works too. What matters is that the position is actually rendered by the template on every page.
Under menu assignment, choose to show the module on all pages. Save and publish.
Text filters will eat your script tag
Joomla filters HTML input based on user group, and by default it removes script tags from content submitted through the editor. You will paste your code, save, reopen the module, and find it gone. No error, no warning.
Two things to check.
First, the editor itself. WYSIWYG editors can mangle raw HTML. Switch the editor to none or to a plain code view for your user account, or use the editor's source or code view before pasting.
Second, the global text filters configuration. In the global configuration there is a text filter setting per user group. Super Users are typically configured with no filtering, but this is a setting a security-minded administrator may have tightened. If script tags are being stripped for you, this is where to look.
Do not loosen filtering for lower-privileged groups just to make this work. Add the module as a Super User instead.
The template override alternative
You can add the script to your template's index file, before the closing body tag. This works, and on a custom template maintained in git it is defensible.
The downside is the usual one: a template update can overwrite it, and there is no admin toggle. If you go this way, use a proper template override rather than editing a core or third-party template directly.
For most Joomla sites the module is the better answer.
Verify it went live
Open your site in a private browser window, logged out. Joomla admins are often logged into the front end too, and module assignment plus caching can behave differently for logged-in users.
Check the home page and a couple of interior pages, including an article. If you assigned the module to all pages this should be uniform, but Joomla menu assignment has edge cases with pages that are not attached to a menu item.
View the page source and search for the script tag. Not there means the text filter stripped it, the module is unpublished, or the position is not rendered by your template. There but no bubble means a browser-side error, so open the console.
Common gotchas
The script vanished on save. Text filters. See above.
The position does not exist in your template. Joomla will happily let you assign a module to a position your template never outputs. Use your template's position preview to confirm which positions actually render.
Module unpublished. Easy to miss. Check the status column in the module list.
Joomla cache and page cache plugin. Clear the cache from the maintenance area, and if the page cache plugin is enabled, clear that too. Then reload logged out.
Third-party caching or a CDN. Purge it, or wait for it to expire.
Menu assignment gaps. If some pages are reached without a menu item, verify the widget is there too rather than assuming.
Making it worth having
The install is the boring part. What decides whether the widget earns its place is the setup.
Crawl your site so it learns your actual services, hours and policies rather than answering in generalities. Add a knowledge file for anything that lives in a document instead of a page. Test in a playground before you go live, so the first person to try it is you and not a customer.
Then decide what happens with a good enquiry. A widget that answers well and lets the person wander off has done half a job. Collect their details, either conversationally or through an in-chat form with the fields you need, and get it into an inbox your team checks, with a pipeline so nothing sits untouched. Speed matters here more than most owners expect, which is the subject of how fast should you respond to leads.
Frequently asked questions
Does this need an extension from the Joomla directory?
No. The core Custom module type is sufficient.
Will it work on Joomla 3 and Joomla 4 or 5?
The Custom module and position assignment pattern exists across these versions. Administrator menu wording changed noticeably between major versions, so if labels do not match, look for the site modules manager.
Can I show it only on certain pages?
Yes, through the module's menu assignment, which lets you pick specific menu items.
Will it clash with my template CSS?
No. The widget renders inside a Shadow DOM, which isolates its styling completely.
What if I get stuck?
Clerkzo offers done-for-you setup, and the embed code is the same single script tag regardless of platform.