Self-hosted product analytics that swallows 40 million events a day on three nodes.
Every team I worked with wanted product analytics, and none of them could send customer behaviour to a US-hosted SaaS without a data protection review that took a quarter.
The self-hosted options all assumed a Kubernetes cluster and a full-time operator. That is a fair assumption at five hundred engineers and an absurd one at twelve.
Pulse is one Go binary, one ClickHouse instance and a Next.js console. It runs under Docker Compose on a single box, and scales by adding two more of the same box.
Ingestion is append-only and batched at 200ms. The client SDK is 2.4kB, sends over sendBeacon, and never blocks navigation — the thing analytics scripts are most often guilty of.
Queries hit pre-aggregated materialised views for the common shapes (funnel, retention, breakdown) and fall through to raw scans only for arbitrary ones, which is what keeps three nodes enough.
A three-node deployment sustains 40 million events a day with p99 query times under 900ms across a 90-day window.
It has 6,200 GitHub stars and around 128,000 npm downloads a week for the client SDK. Eleven people other than me have commit access.
40M events/day
Sustained throughput
2.4 kB gzipped
Client SDK size
under 900ms
p99 query, 90-day window