Measurement without a stored identifier.
How a pageview becomes a number in your dashboard, and exactly what is missing from that path.
One request, to your own endpoint
A script on your pages posts an event to the FunnelSights ingest endpoint — and to nothing else. The tracked page makes no third-party request, so there is no tag sharing your traffic onward. The script is about 8 KB gzipped, and you can proxy the endpoint through your own domain if you would rather it never leave your hostname.
How a visitor is recognised
A visitor is a hash, and only a hash:
visitor_id = blake2b(user_agent + ip + domain, key=daily_salt)
- Nothing is written to the visitor’s device — no cookie, no local storage.
- The IP address and user agent are used to compute the hash and are never stored.
- The salt rotates every 24 hours and is deleted after 48, so a day later those hashes cannot be recomputed — by anyone, including us.
- The domain is inside the hash, so the same person on two sites you track is stored as two different visitors, and the stored data cannot be joined across them.
What that costs you
A rotating salt means visitor counts are per-day. Someone who switches network or browser counts twice, a multi-day total sums daily distinct counts rather than deduplicating across them, and there is no cross-day user journey. That is the trade-off the design buys its guarantee with, and no configuration removes it. Visits and pageviews are exact counts, not estimates.
From event to report
Raw events land on a spine that a job rolls up into daily aggregates every 15 minutes. Reports read the aggregates, never the raw spine. Bots are dropped at ingest against the uap-core crawler database, and referrer spam against the Matomo spam list, so neither reaches your numbers in the first place.