Reports that build themselves
Send the events your application already emits. The Commerce, Users and Content reports appear with real numbers in them, and the builder is there when you want something of your own.
50,000 events a month on the free plan. No card.
Revenue
$84,537
+18.4% vs previous period
Orders
1,284
+9.2% vs previous period
- pro 40%
- scale 34%
- starter 27%
A sample report, drawn by the same components the product uses. The numbers are made up; the charts are not.
Three steps, and you write none of the reporting
Send what already happens
Install the package for your framework and the events your application already emits are translated and forwarded. Or post JSON to one endpoint. Either way you are not writing tracking calls.
Reports appear on their own
When a project starts sending events the standard taxonomy recognises, the matching reports are created and published with real numbers already in them. Nothing to configure.
Then make them yours
Drag blocks onto a grid, pick a measure and a dimension, and watch each one redraw. Publish when it is right, so a half finished edit is never what a teammate opens.
From a Stacks app
// app/Events.ts
import { listen } from '@reportshq/stacks'
export default {
...listen(),
}
Or from anything that speaks HTTP
curl -X POST https://reportshq.org/ingest \
-H "X-ReportsHQ-Key: rhq_your_project_key" \
-H "Content-Type: application/json" \
-d '{"events":[{"name":"commerce.order.created","value":4250,"currency":"USD"}]}'
What you get
A builder that behaves
Twelve columns, drag to move, corner to resize, keyboard for everything. Blocks push each other out of the way while you hold them, and the server settles the layout so two blocks can never share a cell.
Every block explains itself
One sentence, derived from the query the block actually runs. Two charts called Revenue can count different things, and a reader deserves to know which one they are looking at.
Share without an account
A link shows one published report and nothing around it. Revoke it and it stops working on the next request. Embed it in your own page if you would rather.
Delivered on a schedule
The headline numbers by email, daily, weekly or monthly, in your own timezone, with a spreadsheet attached if you want one. The hour stays the hour after the clocks change.
Yours to host
A Stacks application with public source. Run it yourself and every tier limit falls away, because there is nothing left to enforce them against.
Honest about its numbers
Comparisons say when there was no previous period rather than inventing a percentage. Bounded dimensions say what went into Other. Sampling keeps whole people, so funnels still mean something.
Written down, not implied
The ingest contract, the event taxonomy and the limits are documented, including the parts that refuse things. Every bound the API enforces is stated.
The ingest contract
The endpoint, the batch limits, and what happens to an event that fails validation. Nothing is dropped without a reason you can read.
The event taxonomy
The names that make a report create itself, and how to send something the standard set does not cover.
Limits and retention
What each plan carries, the grace band past a quota, and what survives when raw events are pruned.
Send one event and see
The onboarding screen waits for your first event and tells you the moment it lands. If it is an order or a signup, a report is already being built for it.
Create an account