Add analytics to WordPress without cookies
One script tag, about 1.8 KB compressed. It sets no cookies, so there is no consent banner to add, and it needs no build step, no package and no configuration beyond the key.
Where the tag goes
Appearance → Theme File Editor → header.php, before </head>. A header-snippet plugin does the same job and survives theme updates, which editing the theme does not.
<script async src="https://simplytics.dev/track.js" data-key="YOUR_SITE_KEY"></script>
Where your key comes from
The data-key in the tag above is a placeholder. Your own key is on your dashboard next to each site you add, and it is the same key for every page of that site. It is a public identifier, not a secret — it ships in the tag on every page you track — but a tag carrying YOUR_SITE_KEY reports nothing at all, so swap it before you deploy.
Check that it is working
- Deploy the change, then open any page of your own site in a normal browser window.
- Open your Simplytics dashboard. The visit appears within seconds — there is no processing delay to wait out.
Nothing after 60 seconds?
- Your own ad blocker. Most block any script with "analytics" in the path, and they block it silently. Try a private window with the blocker off, or just open the site on your phone.
- A subdomain.
www.example.comandexample.comare treated as the same site, butblog.example.comis not — add it as its own site. - Not deployed yet. Views from
localhostor a preview URL are refused: the hostname in the browser has to match a site on this account. - A Content-Security-Policy. If your site sends one, it needs
https://simplytics.devin bothscript-srcandconnect-src— the tag loads from there and the beacon posts back to it. - Your own browser is opted out. Brave and DuckDuckGo send Global Privacy Control for everyone by default, and the tag stops before making any request when it sees it. Your visit is not counted, which looks identical to a broken install. Test in a browser that does not send it, or see the opt-out page.
Single-page navigation
Client-side navigations are counted automatically. The tag patches history.pushState, history.replaceState and popstate, and re-counts whenever the path changes — so you do not need to fire anything yourself, and you should not: an extra call on top of this double-counts. Changes to only the query string or only the # fragment are ignored, which also means a router that navigates by # alone is not counted automatically.
30 days free, no card. See what it costs after that.
Other platforms: HTML · Next.js · Nuxt · Astro · SvelteKit · Hugo · Ghost · Webflow · Framer · Squarespace · Shopify