Simplytics

Setup guides

One script tag in the <head> of your site, the same on every platform. What differs is which file or settings panel it goes in.

<script async src="https://simplytics.dev/track.js" data-key="YOUR_SITE_KEY"></script>

Where your key comes from

Swap YOUR_SITE_KEY for your own key, which is on your dashboard beside each site. One key covers the whole site.

Is the key a secret?

No. It is a public identifier and 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.

Pick your platform

Not listed? If you can put a <script> tag in your pages’ <head>, the tag above is the whole installation. Follow the HTML guide.

What if my platform forbids custom code?

Then Simplytics cannot be installed on it, and neither can any analytics tool that needs a script.

Check that it is working

  1. Deploy, then open any page of your site in a normal browser window.
  2. Open your dashboard. The visit appears within seconds.
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.com and example.com are treated as the same site, but blog.example.com is not — add it as its own site.
  • Not deployed yet. Views from localhost or 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.dev in both script-src and connect-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. Do not fire anything yourself — that double-counts.

Which navigations count, and which do not

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.