Guide

Cookieless analytics, explained

How analytics works when nothing is written to the device — the three approaches, where the line with fingerprinting sits, and the measurement cost nobody puts on the marketing page.

What cookieless actually means

Cookieless analytics is analytics that measures your traffic without storing a persistent identifier on the visitor’s device — no cookie, no localStorage entry, nothing that survives the page. The term is slightly misleading: the cookie was never the point. What matters legally and ethically is whether something on the device can be read back later to recognise the same person, and a localStorage key does that just as well as a cookie does.

That distinction is why the ePrivacy Directive — the rule that actually produces consent banners — is written about storing or accessing information on a user’s device, not about cookies specifically. Remove the storage and you remove that trigger. You do not remove GDPR, which governs what you then do with the data. The two are separate questions and conflating them is the most common mistake in this area; the GDPR compliance guide works through both.

The three ways to measure without cookies

Every cookieless tool takes one of three approaches, and they are not equivalent. Vendors tend to use the same word for all three.

1. No identifier at all

The simplest option: record the event, attach no identity, and report only aggregate counts. You get pageviews, top pages, referrers and totals. You cannot get unique visitors, sessions, funnels or retention, because every one of those requires knowing that two events came from the same person. This is honest and cheap, and it is why the most privacy-aggressive tools report so few metrics.

2. A rotating, derived identifier

The middle path, and the one most privacy-focused analytics tools actually use. The server derives an identifier from data the HTTP request already carries — typically the IP address and User-Agent — by running it through a keyed hash with a secret that rotates on a schedule, usually daily. Within the day, the same visitor produces the same identifier, so sessions and unique counts work. Once the secret is rotated and destroyed, the identifiers become unlinkable, and yesterday’s visitor cannot be matched to today’s.

The rotation is doing the real work here. A plain hash of an IP address is not anonymisation: there are only about four billion IPv4 addresses, so anyone holding the hashes can compute the hash of every possible address and match them back in minutes. A secret salt defeats that, and rotating and deleting the salt is what makes the guarantee hold over time rather than just until the secret leaks.

3. Fingerprinting

The one to be careful about. A fingerprint combines device characteristics — screen resolution, installed fonts, canvas rendering quirks, hardware concurrency — into an identifier engineered to be stable, so the same device is recognisable weeks or months later. It stores nothing on the device, so it is technically cookieless, and it is routinely sold under that label.

Rotation is the whole distinction. A rotating identifier is designed to stop working; a fingerprint is designed not to. Everything else about them is similar, which is exactly why the word “cookieless” cannot be trusted on its own.

Regulators settled this a while ago. The Article 29 Working Party’s Opinion 9/2014 held that fingerprinting falls inside the scope of the same ePrivacy rule that governs cookies, and the EDPB’s Guidelines 2/2023 restated it — Article 5(3) is not about cookies specifically, and reaches tracking pixels, tracking links and device fingerprinting alike. Adopting a fingerprinting tool to escape a consent banner therefore tends to land you in a worse position than the cookie you were avoiding, not a better one.

What cookieless costs you in measurement

This is the part the category’s marketing pages skip, and it is the reason cookieless has historically belonged to web analytics rather than product analytics. A daily-rotating identifier is a new person every midnight. If you feed those identifiers into metrics that count people, the numbers do not degrade gracefully — they break in specific, predictable ways:

  • Unique users inflate. A visitor who comes back on five days is counted as five people. The longer the reporting window, the worse the error.
  • Per-user averages deflate. The denominator is inflated by the same factor, so “events per user” drifts toward one.
  • Funnels leak at every day boundary. A signup flow that spans a night sees the person who came back to finish as a stranger who started at step two.
  • Retention collapses to zero. Retention cohorts ask whether the same person returned on a later day. With rotating identifiers, the answer is structurally no — the metric returns approximately zero regardless of how good your product is.
  • User flows fragment. Path analysis stitches one person’s journey; rotating identifiers cut it nightly.

What does not break is just as important. Total event counts are fine — a consent-declining visitor’s pageview is still a pageview, and excluding it would under-count your traffic. Session metrics are fine too, because a session is stitched from activity within a short window and never needs to know who the person is across days.

So the correct handling is not better hashing. It is to keep cookieless traffic in the metrics that count events and sessions, and keep it out of the metrics that count people — and to be explicit about which is which, so nobody reads an inflated unique-user chart as growth. What cookieless tracking does to funnels and retention works through each metric and the split in full.

Does it remove the consent banner?

For the analytics itself, often yes — if nothing is stored on or read from the device, there is nothing for the ePrivacy storage rule to attach to. That is a real and meaningful reduction in obligation, and it is why cookieless tools can report on close to 100% of traffic while consent-gated tools see only the share of visitors who click accept.

Two caveats worth stating plainly. First, GDPR still applies to the processing: an IP address is generally personal data, so using one as a hash input is processing that needs a lawful basis, transparency and minimisation, even when the input is never stored. Second, a banner covers your whole site, not one vendor — embedded video, ad pixels, chat widgets and A/B testing tools routinely set their own identifiers, and any one of them puts the banner back. Requirements vary by jurisdiction; this is general guidance, not legal advice.

How Pug does it

Pug’s Web SDK defaults to cookieless. It has three consent states and the default is the middle one: events flow, nothing is written to the device, and identify() is disabled, so an install that never mentions consent still stores no identifier before it has a basis to.

// the default — no configuration needed to stay cookieless
init(projectId, { apiKey })

// once the user agrees, via clear affirmative action:
optInTracking()

Server-side, a visitor with no stored identity is given an ephemeral one derived from the request: a keyed hash (HMAC-SHA256) of the project, IP address and User-Agent, under a salt that changes every day. The IP and User-Agent are hash inputs only — they are never stored on the event and never returned by the API. The day’s salt is held under a TTL and deleted when it expires, and that deletion is the guarantee: once it is gone, the identifiers minted with it can no longer be linked to any IP or User-Agent, or to each other, by anyone. Sessions are stitched server-side on a 30-minute inactivity window, so session metrics stay correct without any device storage.

These identifiers carry a reserved cookieless- prefix so every part of the system can recognise them from the value alone. That is what makes the measurement rule above enforceable rather than aspirational: they are excluded by default from unique users, per-user averages, funnels, retention, user flows and user-level top-K, and always included in total event counts and every session metric. The query API carries an include_cookieless flag for the cases where you deliberately want them back in. In the events table and live feed they render as cookieless with no profile link, because there is no profile to link to — an ephemeral identifier is not a person, and the interface should not imply otherwise.

When a visitor does consent, identify() merges their anonymous history into a real profile, and identity resolution takes over from there. Cookieless is the floor, not the ceiling.

Choosing an approach

  • Ask what the identifier is derived from, and how often it rotates. “Cookieless” with no rotation is fingerprinting with better branding.
  • Ask whether the salt is deleted or merely changed. A retained history of old salts re-links everything it was supposed to separate.
  • Ask whether IP and User-Agent are stored. Using them as hash inputs is very different from keeping them on the event.
  • Check how unique users are counted. If a tool reports uniques from rotating identifiers without saying so, its headline number is inflated and you will not be told by how much.
  • Decide what you need people-level metrics for. If funnels and retention drive your decisions, plan for a consent path rather than expecting cookieless to cover it.
  • Control where it runs. Self-hosting means the IP never reaches a third party at all, which is a stronger claim than any hashing scheme.

Cookieless is a genuinely good default — it lets you measure honestly on day one, with nothing on the device and nothing to consent to. It just is not a free replacement for identity, and any tool that tells you otherwise is either not counting people or not telling you how. For the broader practice around it, see privacy-first analytics, and for auditing what your events actually carry, the free PII event auditor.

FAQ

Common questions

What is cookieless analytics?

Analytics that measures traffic without storing a persistent identifier on the visitor’s device. Instead of writing a cookie or a localStorage entry, the tool either counts events with no identifier at all, or derives a short-lived one server-side from data the request already carries — typically a keyed hash of IP and User-Agent that is rotated and discarded on a schedule.

Is cookieless analytics GDPR compliant?

Not automatically. Cookieless removes the ePrivacy “storage” trigger that makes most analytics need a consent banner, but GDPR still applies to any processing of personal data that follows, so you still need a lawful basis, transparency, and data minimisation. A rotating identifier that is genuinely unlinkable after rotation is a much stronger position than a persistent one — but the assessment is yours to make with your own counsel.

Is cookieless tracking the same as fingerprinting?

No, though both derive an identifier from request data rather than storage. The difference is persistence: a fingerprint is built to stay stable so the same device is recognisable weeks later, which regulators have treated as personal data requiring consent. A rotating cookieless identifier is built to stop working — once the day’s secret is deleted, the identifiers from that day can no longer be linked to a device or to each other.

Does cookieless analytics break funnels and retention?

It breaks them if you count the rotating identifiers as people. A funnel spanning two days sees one visitor as two strangers, and a retention cohort measured on rotating identifiers returns approximately zero by construction. The fix is not better hashing — it is excluding those identifiers from any metric that counts people, while still counting their events in totals and session metrics.

Do I still need a cookie banner with cookieless analytics?

Often not for the analytics itself, since there is nothing being stored or read on the device to consent to. But a banner is about your whole site, not one tool — embedded video, ad pixels, chat widgets and A/B testing frequently store their own identifiers. Requirements also vary by jurisdiction. Confirm against your own legal advice rather than a vendor’s marketing page.

Cookieless by default, without the blind spot

Pug starts cookieless, counts consent-declined traffic honestly, and is free and open source under AGPL-3.0.

Questions? Email [email protected]