We checked our cookieless analytics against Google Analytics. One of our numbers was wrong.
Both tools on one real site for a week. The numbers looked wildly apart, and only one of the three reasons was anybody's fault — ours.
Someone running both Google Analytics and our Site Insights on the same site sent us two screenshots and asked why the numbers disagreed so badly. Google said 683 active users and 8.9K events. We said 623 visitors and 972 pageviews.
A nine-times gap on one metric is the kind of thing that makes you distrust both tools. It turned out to be three separate things wearing a trenchcoat, and only the last one was a real defect — in ours.
The 9x gap was not a gap
Google Analytics 4's headline "Event count" is every event it records, not pageviews. With Enhanced Measurement switched on that includes page_view, session_start, first_visit, user_engagement, scroll, outbound clicks and file downloads. Thirteen events per user is unremarkable.
We record three event names: pageview, leave, error. Comparing 8.9K GA4 events against 972 of our pageviews is comparing a total to one of its addends. The number to hold against ours is GA4's Views, in Reports → Pages and screens.
This is not a criticism of GA4. It is a warning about dashboard headlines generally: the big number on the front of any analytics tool is chosen to look impressive, and two tools rarely choose the same one.
The second gap was a calendar
The site's first event in our database landed at 22:14 UTC on a Thursday. Google had been collecting for weeks.
So of the seven days being compared, we had zero data for the first and 100 minutes of the second. Our "last 7 days" is also a rolling window ending now, while GA4's is seven complete days ending yesterday — so the two windows did not even share endpoints.
Compared over the five days both tools were actually collecting, they agree closely. Ours runs slightly ahead, which is what you would expect: ad blockers block Google Analytics far more aggressively than they block anything else.
| Day | Visitors | Pageviews |
|---|---|---|
| Day 1 (partial — snippet installed 22:14) | 8 | 11 |
| Day 2 | 94 | 152 |
| Day 3 | 121 | 182 |
| Day 4 | 117 | 177 |
| Day 5 | 140 | 219 |
| Day 6 | 88 | 136 |
The third one was ours
Our dashboard labelled the visitor count "unique, cookieless" on every window — 24 hours, 7 days, 30, 90. That claim is only true for the first one.
We identify a visitor with a salted hash, and the salt contains the UTC date. That is the whole privacy mechanism: there is no cookie, nothing is stored on the visitor's device, and the identifier cannot be linked to the same person tomorrow because tomorrow it is a different identifier. It is also unlinkable by us, which is the point.
The consequence is arithmetic. Someone who visits on three days is three hashes. We checked it against the real data rather than reasoning about it:
distinct visitor hashes over the window : 623 sum of the seven daily figures : 623
Why those two numbers are identical
Not a coincidence — an identity. A hash cannot repeat across days, so counting distinct hashes over a week is counting each day's visitors and adding them up. The window figure was always person-days and never unique people.
Which means we cannot tell you how many unique people visited your site last week. Not "have not built it yet" — cannot, structurally, and any change that made it possible would be the change that removes the privacy property people choose this for.
Over any window longer than a day the tile now reads "unique per day, summed", and the footnote explains that visitors are counted fresh each day because the hash cannot follow anyone past midnight. The 24-hour view is unchanged, because there the original claim was true.
What to do if you run both
Compare 24-hour windows. It is the only period where both tools mean the same thing by "visitor", because both deduplicate within a day and neither has to take a position on what happens at midnight.
Compare GA4's Views against pageviews, never its Event count. And check when each tool started collecting before you compare any total, which sounds obvious and is the reason two of these three discrepancies existed.
The honest summary is that the tools agreed and the labels did not. Two of the three discrepancies were us comparing different things; the third was our dashboard claiming more certainty than the method allows.
We would rather publish the number we can defend than the flattering one. A cookieless analytics tool that quietly reported unique visitors across a month would either be lying or would have stopped being cookieless.