Skip to content

Sales & revenue reporting

What you’ll build: a revenue view your team reads each morning — current MRR and churn with week-over-week deltas, plus the booking trend — posted by a nightly job against your billing data.

pulsedeck.app / dashboards / revenue
SCREENSHOT

Finished revenue dashboard: MRR and churn metric cards above a 30-day MRR area chart.

Drop an image into public/shots/ and pass src.

  • PulseDeck running (Quickstart).
  • A registered source and its pd_… API key.
  • Read access to your billing data (Stripe, your database, a spreadsheet export — whatever the job can query).
  • Category: revenue
  • Stream: daily

A nightly job computes the numbers and posts metric blocks for the KPIs and a chart block for the trend. Keep the same metric keys every run (mrr, churn) — PulseDeck tracks them over time automatically, which is what powers deltas and the chart widget.

Terminal window
curl -X POST http://localhost:3001/api/v1/reports \
-H "Authorization: Bearer pd_xxxxx" \
-H "Idempotency-Key: revenue-2026-06-23" \
-H "Content-Type: application/json" \
-d @revenue.json
{
"version": "1.0",
"source": { "id": "src_…" },
"category": { "slug": "revenue" },
"stream": { "slug": "daily" },
"report": {
"title": "Revenue — 2026-06-23",
"summary": "MRR up 2.1% WoW; churn steady.",
"severity": "info",
"occurred_at": "2026-06-23T06:00:00Z",
"tags": ["revenue", "daily"]
},
"blocks": [
{
"id": "mrr", "type": "metric",
"key": "mrr", "label": "MRR", "value": 48200,
"unit": "USD", "format": "currency", "precision": 0,
"trend": "up", "sentiment": "positive",
"delta": 1000, "comparison_label": "vs last week"
},
{
"id": "churn", "type": "metric",
"key": "churn", "label": "Churn", "value": 1.8,
"unit": "%", "format": "percent", "precision": 1,
"trend": "flat", "sentiment": "neutral"
},
{
"id": "bookings", "type": "chart", "variant": "bar",
"title": "Bookings this week",
"labels": ["Mon", "Tue", "Wed", "Thu", "Fri"],
"series": [{ "name": "Bookings", "data": [12, 18, 9, 22, 15] }]
}
]
}

Add metric widgets for the headline numbers (each shows the latest value and its delta versus the previous report) and a chart widget for the 30-day MRR trend:

{
"version": 1,
"widgets": [
{ "id": "m1", "type": "metric", "span": "third", "row": 0,
"config": { "streamId": "str_daily", "metricKey": "mrr", "label": "MRR" } },
{ "id": "m2", "type": "metric", "span": "third", "row": 0,
"config": { "streamId": "str_daily", "metricKey": "churn", "label": "Churn" } },
{ "id": "c1", "type": "chart", "span": "full", "row": 1,
"config": { "streamId": "str_daily", "metricKey": "mrr", "variant": "area", "range": "30d" } }
]
}
pulsedeck.app / dashboards / revenue / edit
SCREENSHOT

Builder showing two metric widgets in the top row and a full-width MRR chart below.

Drop an image into public/shots/ and pass src.

  • More KPIs — add metric blocks for new customers, ARPU, trials; one widget each.
  • Weekly digest — also post a weekly stream every Monday for a wider view.
  • Per-client revenue (agencies) — one workspace per client, the same job posting each client’s numbers to their revenue/daily stream.