Northwind's customers were exporting CSVs to answer basic questions about their own products. Pulse replaced that ritual with a dashboard that answers in under a second — and it had to feel that fast on day one, not after a caching layer matured.
The brief
The existing analytics page was a batch job wearing a UI. Charts rendered from hourly rollups, filters triggered full reloads, and anything unusual meant a support ticket. We set three constraints up front: every query returns in under a second, every view is shareable as a URL, and the interface never shows a spinner longer than 300 milliseconds.
Designing for the query, not the chart
Most analytics tools start with a wall of charts and let you drill down. Pulse inverts that: the primary surface is a query bar with structured tokens — event, filter, range, breakdown — and the chart is a consequence. Power users compose queries like sentences. New users click any token to see its options. The two audiences share one interface instead of a simple mode and an advanced mode drifting apart.
The token grammar came out of watching seven customer sessions. People didn't say show me a line chart — they said how many teams hit the rate limit last week. The interface now reads the way people already ask.
The engineering half
Queries compile to ClickHouse and stream back over a WebSocket. The first byte usually lands before the chart's entry animation finishes, which makes the product feel instant even when the query takes 400 milliseconds. Results are normal-form JSON, so the same payload powers the chart, the table view, and the CSV export nobody had to build twice.
- P95 query latency: 640ms across 2.1 billion events
- Dashboard loads went from 8.2s to 900ms
- Analytics-related support tickets down 70% in the first quarter
Pulse is the first internal tool our customers actually screenshot and post. That never happened with the old dashboards.— VP of Product, Northwind
What I'd do differently
The token grammar shipped English-only, and the assumptions run deeper than strings. Retrofitting locale-aware date grammar was a week of unpicking things that should have been parameters from the start. Next time, the grammar is data on day one.