Usage stats
Venn can count how it's used: how many polls are made and of which kind, how many get answers, and how many end with a date. These counts show what's working and what to improve, without tracking anyone.
Stats are off until the server has a STATS_TOKEN. That token also unlocks the stats page.
What's counted, and what isn't
Each count is a number for one day. For example, "3 polls created on 2026-10-26 to vote on dinner times, with 4–7 options". That's all that's stored:
- No user, poll or answer IDs, so counts can't be joined up or traced to a person or poll.
- No names, titles, places, emails, IP addresses, user agents or times finer than the day.
- No cookies, no local IDs and no third-party scripts. Counts go to Venn's own server.
- Browsers that send Global Privacy Control or Do Not Track aren't counted at all.
Only the events and values listed in USAGE_EVENTS in src/usage.js are kept. The server drops anything else. The browser can't send the events the server counts itself (polls created, answers and so on).
| Event | Counted by | Properties |
|---|---|---|
poll.created |
Server | kind (pick, free), detail (times, allday, trips, days, parts, hours), plan (dinner, trip…), options (1, 2-3, 4-7, 8-15, 16+), email, copy |
poll.edited, poll.deleted, poll.finalized |
Server | kind |
answer.created |
Server | kind, copy (asked for an email copy) |
answer.updated, answer.deleted |
Server | kind |
notify.email, notify.webhook |
Server | none |
calendar.ics |
Server | none |
ai.used |
Server | feature (draft, answer, summary, message) |
view |
Browser | page (chooser, pick, free, poll), as on polls (guest, answered, organizer) |
share |
Browser | from (created, poll, card: the "It's set" picture), how (sheet, copy, download) |
Poll outcomes aren't counted. "Got answers", "date picked" and "guests per poll" are worked out when the stats are read, from the polls themselves.
Turning it on
Make a long random token, for example with
openssl rand -base64 32.Give it to the server as
STATS_TOKEN. On Cloudflare:npx wrangler secret put STATS_TOKENWith Node, set it as an environment variable.
Open
/statson your server and enter the token. It's kept in that browser until you choose "Forget the token on this device".The page shows the last 7, 30, 90 or 365 days: totals with the change on the period before, a trend chart a day (a week over a year) for polls, guest answers, poll views or shares, which days of the week are busiest, and what happened to the polls. It refreshes itself every few minutes while it's open.
GET /api/config reports "usage": true once stats are on. Browsers only send their counts then.
Reading the stats from code
curl -H "authorization: Bearer $STATS_TOKEN" "https://venn.example/api/stats?days=30"
It returns:
counts:[{ day, name, props, count }].outcomes: for each kind of poll (all,pick,pick/times,free/partsand so on),{ polls, hostAnswered, answered, finalized, medianGuests, guests }. These cover polls created in the period.guestsis a histogram of guest answers per poll.
days is 1 to 365, and 30 if left out.
Turning it off
Remove STATS_TOKEN. Counting stops at once. To delete what's been counted, run DELETE FROM usage_counts on the database.