Skip to content

Cookieless analytics: how it counts and what you give up

What cookieless analytics means, how six tools count people without cookies, what each loses, and why no cookies doesn’t settle the consent question.

Published on 7 min read

“Cookieless” tells you one thing for certain: the tool doesn’t set a cookie. It doesn’t tell you how people get counted, what else is kept, or whether you still have to ask for consent. Those are the questions that matter, so while building Trailic I read what six tools say about themselves in their own docs and source code. Here’s what I found, checked in November 2026.

What the word covers

Three different techniques get sold under the same label.

Storage that isn’t a cookie. A script can keep an ID in localStorage and truthfully say it sets no cookies. For the visitor nothing changes: the ID lasts. The French regulator’s guidelines name local storage next to cookies among the technologies its rule covers.

Fingerprinting. Combine enough attributes of a browser and you get an ID that lasts without storing anything. The European Data Protection Board recalls that fingerprinting falls within the scope of Article 5(3) of the ePrivacy Directive, the rule behind cookie banners.

A short-lived hash computed on the server. Nothing is kept in the browser. The server hashes what every request already carries, with a salt that changes, so the ID dies by itself. This is what most privacy-minded tools mean by the word, and it’s what the rest of this post is about. See the glossary entry on cookieless tracking for the short version.

You’ll also meet Google’s consent mode. In its advanced form, tags load even when someone refuses, and send “measurements without cookies” along with the refusal, to feed a model. That’s a way of handling a refusal alongside a banner, so it belongs to a different discussion.

How six tools count

ToolWhat goes into the IDHow long it lasts
PlausibleDaily salt, site domain, address, user agent24 hours. The salt is rotated and deleted
PostHog, cookieless modeTeam ID, daily salt, address, user agent, hostnameA day. The salt is deleted once that day’s events are processed
Matomo, cookies disabledOperating system, browser, plugins, address (anonymised by default), language24 hours at most. The random seed is discarded each day
UmamiWebsite ID, address, user agent, salt, distinct ID if you set oneA month by default. SALT_ROTATION can make it a week or a day
Vercel Web Analytics“A hash created from the incoming request”. The docs don’t list the inputsA single day
TrailicDay’s salt, site, address, user agentA UTC day. The salt is derived from a secret, so it’s never deleted

Two differences are worth more than the shared recipe.

The first is the rotation. A month-long salt, Umami’s default, recognises someone across a month as long as their address and browser hold still. A daily salt can’t. That’s a real trade: better monthly counts against a longer period during which visits can be linked.

The second is what happens to the salt. Plausible and PostHog say they delete it. Trailic derives each day’s salt from TRAILIC_SECRET, so that the collector never has to read a database. The cost is that whoever holds the secret can recompute any past day. I go through that in how the daily salted hash works.

What you give up

Here’s an invented example to show the arithmetic. A thousand people visit your site in a month, on three separate days each on average.

Cookie that survives the monthDaily hash
Visitors on a given dayAbout rightAbout right, with errors in both directions
Visitors in the month1,0003,000, because days add up

The daily hash gives you person-days. It’s a fine trend line and a poor answer to “how many people”. PostHog’s docs describe the same effect as “high unique user counts beyond one day”, and Matomo says unique, new and returning visitors become inaccurate without cookies.

More broadly:

QuestionLasting IDDaily hash alone
Which pages get read today, from whereYesYes
How many different people this monthYesNo
New or returningYesNo
Pricing page to signup in one sittingYesYes
Clicked on Monday, signed up on ThursdayYesNo
Who’s still here four weeks laterYesOnly for people you identify
Session replay, surveysDepends on the toolPostHog turns both off without consent, because they rely on browser storage

And what you get in return: nothing written to the device, no ID that outlives the day, no way to follow someone from one site to another, and less to explain to your visitors.

A tool behind a banner also counts only the people who accept, while a tool without one counts everyone a blocker lets through. Vendors publish percentages on that gap. I don’t have a figure for your site, and neither do they. If it matters to you, run both for a few weeks and measure it.

Article 5(3) is about storing information on a device and gaining access to information stored on it. The EDPB’s guidelines say it “does not exclusively apply to cookies”, that JavaScript telling a browser to send information falls within it, and that collecting information through the user agent or the address can bring it into play. They also say that the article applying doesn’t always mean consent is needed.

So a hash on the server may well sit inside the rule and still be allowed without consent, depending on your country and on what you do with it. In France, the CNIL has an exemption with precise conditions. I went through them, criterion by criterion, in do analytics need a cookie banner. The decision is yours as the site’s owner, and this post isn’t legal advice.

Which one fits

You needWhat fits
Daily traffic, pages, referrersA daily hash is enough
Real monthly reachA lasting ID, with consent where the law asks for it, or a longer salt if you accept what it links
Funnels across days, retentionIdentify signed-in people, and treat that as personal data
Replay, heatmaps, feature flagsA mature tool such as PostHog. Trailic doesn’t have any of these today

What Trailic does

No cookies, ever, and nothing in browser storage before a site calls identify, which keeps the ID it was given in localStorage. About 1.5 KB gzipped in the browser. If you decide you want to ask first, the library holds everything in memory until you say so:

<Trailic siteKey="site_…" endpoint="https://your-instance.example/api/e" consent={accepted} />

The limits are stated plainly on the privacy approach page: everyone behind one address with the same browser is one visitor, which is a known undercount, and someone holding TRAILIC_SECRET who knows a person’s address and browser could compute their hash for a day.

Where Trailic stands

Trailic is a first version. It works end to end on a test instance with real browsers, a real assistant and five million synthetic events, but it hasn’t collected real traffic yet. Its Vercel Queues buffer has only run against a stand-in for that service, its data model may change, and there’s no upgrade path between versions. There’s no hosted version, and the library isn’t on npm yet: it lives in the repo at packages/trailic. The tools above are running on real traffic today. Don’t make Trailic your only analytics yet. The code is on GitHub, and I’d like to hear what’s wrong in the issues.

Sources

Related articles

The daily salted hash step by step, with code you can run, its error in both directions, and a plain table of what it stops and what it doesn’t.
When analytics need consent under ePrivacy and GDPR, why no cookies isn’t the test, and each condition of the CNIL exemption. General information.