Privacy model
We measure audiences, not people.
This page is the plain-language version of the machine-readable manifest every Vector 5 site publishes. If the two ever disagree, the manifest is wrong and we want to know.
What we collect
Every field, and why it exists.
| Field | Why | Stored? |
|---|---|---|
| Page path | Traffic reports | Yes |
| Referrer host / source | Attribution | Yes — host only, never the full URL |
| UTM parameters | Campaigns | Yes |
| Country / region | Geo breakdown | Yes — IP discarded after lookup |
| Device, browser, OS, screen width | Device reports | Yes |
| Event name and optional props | Goals | Yes |
| Actor and AI source | AI traffic | Yes |
| Visitor hash | Unique visitors for one UTC day | Yes — unrecoverable, rotates daily |
| IP address | Hash + geo only | Never |
| Cookies / localStorage IDs | — | Never |
| Fingerprints | — | Never |
How unique visitors work
A hash that forgets you at midnight.
The salt rotates at 00:00 UTC per site. After hashing, the IP is dropped. A visitor who returns tomorrow is counted as new. That is intentional: it gives accurate daily uniques while making cross-day tracking impossible, even for us.
visitor_hash = SHA-256(daily_salt || site_id || ip || user_agent)
daily_salt rotates 00:00 UTC, per site, never logged
ip used once for the hash and a country lookup, then discarded
user_agent used for the hash and device/browser/OS parsingActors
Every event is tagged.
human
Browser visitor
human_via_ai
Human who arrived from an AI assistant
ai_agent
Headless agent acting for a person
ai_crawler
GPTBot, ClaudeBot, PerplexityBot and peers
bot
Other automated traffic
Crawler hits come from the server middleware. They never require JavaScript and never carry a visitor hash for a person.
What we cannot know
- Who a visitor is
- Whether they returned after midnight UTC
- Cross-site or cross-device identity
- Exact address (city is optional and off by default)
- Anything about visitors who block the request entirely
The same list is rendered inside every dashboard, next to the numbers, so nobody forgets what the numbers are not.
GET /api/sites/example.com/manifest
{
"name": "Vector 5 Analytics",
"site": "example.com",
"cookies": false,
"local_storage": false,
"fingerprinting": false,
"ip_stored": false,
"visitor_hash": "sha256(daily_salt || site_id || ip || user_agent); salt rotates 00:00 UTC",
"retention_days": 730,
"fields": ["path", "referrer_host", "utm", "country", "device",
"browser", "os", "actor", "ai_source", "event_name"],
"cannot_know": [
"Who a visitor is",
"Whether they returned after midnight UTC",
"Cross-site or cross-device identity",
"Exact address or city",
"Anything about visitors who block the request"
]
}AI insights
When enabled, insights are generated from rollups — counts, ratios, deltas. Event-level data is never sent to a model. With Ollama, nothing leaves your server at all.

