Ad platforms report clicks, the shop reports revenue, and nobody joins the two. Grain does exactly that join.
- Ad spend against revenue in one path, down to a single campaign
- Attribution with three models — first, last and linear touch — on window functions with a 30-day window
- Funnel and cohorts, with a drill-down to one person's whole path
- A desktop of panels that resize and remember their layout
- Charts drawn as SVG on the server, no chart library, no client bundle
- 12.6M events in the demo; aggregates answer in 26–109 ms
- Node 24 with TypeScript and no build step, embedded DuckDB