Fathom Analytics on Joomla: the one line and where it goes
Fathom Analytics ships one script tag. That is the entire integration.
No tag manager, no data streams, no property setup, no events to define. One line and the dashboard fills up.
Which makes the Joomla situation almost funny. Fathom has no Joomla extension. It has a WordPress plugin, a Squarespace guide, a Webflow guide, a Ghost guide and a Shopify app. Joomla gets a paragraph telling you to paste the script into your template.
That paragraph is where the trouble starts, because in Joomla "paste it into your template" is advice with a trapdoor under it.
No time to read this?
Sign up, paste two lines of code and see your real traffic without a cookie banner. No credit card, live in minutes.
Get my free accountThe trapdoor
Joomla templates are updatable software.
Cassiopeia ships with Joomla core so it updates when Joomla updates. Commercial templates from the big vendors push updates several times a year. Whatever you edited inside the template directory gets replaced by whatever the vendor shipped.
Your script goes with it.
Nothing warns you. Joomla's update process does not diff your template files and ask whether you meant to keep that line. It writes the new version over the old one and reports success.
So the sequence goes like this. You paste the script in March. It works. You update Joomla in June on a Tuesday evening because there is a security release. The script is gone on Tuesday evening. You open Fathom in late July, notice the graph fell off a cliff and spend an hour assuming your traffic collapsed.
People put up with this because the payoff is real. Analytics that needs no cookie banner.
Why the usual fix does not apply
Joomla has template overrides, which are exactly the mechanism designed for this problem. You copy a layout into your template's html directory and Joomla uses your copy instead of the original and updates leave it alone.
Overrides cover component and module layouts. They do not cover the template's own index.php, which is the file holding your closing body tag.
You can fork the whole template into a child, which does survive updates properly. Now you maintain a template fork whose only modification is one line of JavaScript and you get to re-merge it every time the parent changes.
That is a lot of machinery for a script tag.
"It seems that perfection is attained not when there is nothing more to add, but when there is nothing more to remove."
Antoine de Saint-Exupéry, in Terre des Hommes (1939)
Fathom took that seriously and built an analytics tool with almost nothing in it. Then Joomla makes you build a template fork to hold it. Somewhere in there the simplicity got spent.
The Custom module route and the filter that eats it
The other common suggestion is a Custom HTML module. Create one, paste the script, publish it to a position, assign it to all menu items.
It works, right up until it does not, for two reasons.
The position has to render everywhere. Most template positions do not. Debug positions are close, footer positions usually appear on every page but not always and an error page or a component-only view will often render no modules at all. Every page that skips the position is a page you are not measuring and you cannot see the gap from inside your own analytics.
Joomla's text filters strip script tags. Global Configuration sets a filter per user group. Super Users default to No Filtering so your paste works. Everyone else gets a blacklist that removes <script> on save.
That second one is genuinely nasty because it is delayed and silent. You paste it as a Super User, it works for months, then someone with an Administrator account opens that module to fix a typo, presses Save and Joomla quietly deletes the script. No warning, no error, no entry in any log you look at.
Whatever you paste in the end, the point is the five minutes a week you spend reading it.
What actually works
A system plugin.
Not because plugins are fashionable but because of where they run. A system plugin can act on the finished page after the template has done its work, which means it does not live in the template, does not depend on a position, does not pass through the text filter and does not care what your template looks like.
Template updates cannot touch it. Position changes cannot break it. It runs on every front end page including the ones that render no modules at all.
If you want Fathom specifically, that is the shape of thing to look for on the directory: a maintained generic script-injection plugin. Check its last update date and its supported Joomla versions before you install it, because the analytics category has a lot of extensions that stopped in 2019.
What Fathom costs
Fathom starts around 15 USD a month for 100,000 page views. There is a trial and no free tier.
It is good software and the people behind it are serious about privacy. It is also a subscription for something a small site might reasonably want to pay nothing for and that is the single most common reason people stay on GA4 despite disliking every minute of it.
Where StatJolt fits in
Same one-line philosophy, with the Joomla part actually built.
The Joomla plugin is the system plugin described above. You paste your code into one field in the plugin settings. It writes the code into the finished page before the closing body tag, on every front end page, regardless of template, position or user group. Update Joomla as often as you like. Nothing you did lives in the template.
It is cookieless so no banner and it collects no personal data. It writes nothing to your Joomla database beyond its own settings.
It is 0 EUR until 2027 at any traffic volume and stays free for low traffic sites afterwards. The price is a small badge on your site and you decide where it sits or hide it.
Core Web Vitals, funnels, user journeys and JavaScript error reporting are all included.
The short version
Fathom's script is one line and adding it to Joomla is genuinely easy. Just do not put it in your template, because your template is software that gets replaced.
Do not put it in a Custom module either, unless you are certain the position renders on every page and you accept that the next non-Super-User to save that module will delete it.
Use a system plugin. That is the only method in Joomla where the thing you set up in March is still there in December.
Replace GA4 in 2 minutes
Just paste the code and see how much clearer it gets. No cookies, no banner, no consent tool. 0 EUR until 2027, at any traffic level.
Or keep the other path: maintaining a consent tool, modelled data and half an hour a month spent digging through reports.
Get my free account