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

Revenue per day
0 1,250 2,500 3,750 5,000 17 Jul 20 Jul 23 Jul 26 Jul 29 Jul 1 Aug 4 Aug 7 Aug 10 Aug 13 Aug
Orders by plan
ReportsHQ: reports that build themselves scale: 431 (34%) starter: 341 (27%) 1,284 total
  • 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.

All documentation

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