How a visitor is identified
When an event arrives, tinyanalytics computes a short cookieless ID by hashing the visitor’s IP address and user agent together. The raw IP address is never stored — only the resulting hash, which can’t be reversed back into an IP. That ID is stable for as long as the visitor’s IP-and-browser pair is, which is what makes multi-day reports like Users, retention, and cohorts meaningful.It’s an accurate estimate — and honest about its limits
A cookieless ID can’t be exact, and tinyanalytics doesn’t pretend otherwise. There are two inherent, opposite kinds of error:- Undercounting — several people behind one network (a household or office) on the same browser build collapse into one visitor.
- Overcounting — one person moving from Wi-Fi to cellular, or updating their browser, can look like a new visitor.
How does tinyanalytics handle VPNs and privacy relays?
Some visitors browse through networks that change their IP between requests — VPNs, Cloudflare WARP, iCloud Private Relay, and corporate web proxies. Without a guard, a single person rotating IPs mid-visit would explode into many phantom visitors, splitting one session into several and corrupting bounce rate and channel attribution. tinyanalytics recognizes these rotating datacenter and hosting networks and steadies identity for them in two ways:- It derives the ID from a coarse network bucket (a
/24block for IPv4,/48for IPv6) instead of the exact rotating IP, so consecutive requests from the same relay land on the same visitor. - It can briefly re-attach a freshly rotated ID to the visitor it just belonged to, within a short window.
Turning a visitor into a known person
When your app callsidentify() with a stable ID, tinyanalytics attributes that visitor’s recent anonymous activity to the ID and counts them as one person from then on — across devices and sessions. Reports then key on the identified ID when there is one, and fall back to the cookieless ID when there isn’t, so a signed-in person on two devices is a single user everywhere.
identify() persists the user ID you provide in browser storage. Feature flags, groups, surveys, and browser opt-out also store purpose-specific state. Core anonymous analytics does not store an analytics ID in the browser. See Privacy & GDPR.Related
Privacy & GDPR
The privacy properties this design gives you.
Identify users
Attach a stable ID for exact identity.
How your data is handled
What’s stored, and what never is.
Metric definitions
How “users” and “sessions” are counted.