Add analytics to Webflow without cookies
One script tag, about 1.8 KB compressed. No visitor cookies. Assess your site's notice and consent duties. No build step or package.
Where the tag goes
Site settings → Custom code → Head code, then publish. Custom code needs a paid site plan; if the field is missing, that is why.
<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.
Check that it is working
- Deploy, then open any page of your site in a normal browser window.
- 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.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. 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.
Other platforms: HTML · WordPress · Next.js · Nuxt · Astro · SvelteKit · Hugo · Ghost · Framer · Squarespace · Shopify