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.
Finished revenue dashboard: MRR and churn metric cards above a 30-day MRR area chart.
Drop an image into public/shots/ and pass src.
What you’ll need
Section titled “What you’ll need”- 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).
1. Plan the structure
Section titled “1. Plan the structure”- Category:
revenue - Stream:
daily
2. Send the report
Section titled “2. Send the report”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.
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] }] } ]}3. Build the dashboard
Section titled “3. Build the dashboard”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" } } ]}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.
Make it your own
Section titled “Make it your own”- More KPIs — add metric blocks for new customers, ARPU, trials; one widget each.
- Weekly digest — also post a
weeklystream 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/dailystream.