Features · Operate
Unlimited sites per workspace, invite your team, switch between properties without logging out. Every query is scoped to the site before it runs.
Access is checked before a metric is computed, not filtered afterwards. A site you cannot reach returns 404, never 403 — a 403 confirms the site exists.
gate:tenant-leak fails the build if a query can run without a resolved site id. Isolation is a test, not a convention.
Group client sites in one workspace and hand each client a report whose numbers they can check themselves.
Privacy mode, vertical and digest subscriptions are all per site, not per account.
The evidence
resolveSite(user, siteId) → not a member? 404 (identical to "no such site") → member? site row + allow-list → every metric query WHERE site_id = ? (always a parameter)
There is no code path that reaches the events table without a resolved site id.