Skip to content

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.

No cookies No localStorage IDs No fingerprints No stored IPs Daily-rotating hash Aggregates-only AI

What we collect

Every field, and why it exists.

FieldWhyStored?
Page pathTraffic reportsYes
Referrer host / sourceAttributionYes — host only, never the full URL
UTM parametersCampaignsYes
Country / regionGeo breakdownYes — IP discarded after lookup
Device, browser, OS, screen widthDevice reportsYes
Event name and optional propsGoalsYes
Actor and AI sourceAI trafficYes
Visitor hashUnique visitors for one UTC dayYes — unrecoverable, rotates daily
IP addressHash + geo onlyNever
Cookies / localStorage IDsNever
FingerprintsNever

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
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 parsing

Actors

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.

Collection manifest · GET /api/sites/{domain}/manifest
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.