Revenue
Module: revenue. See README.md for authentication and ranges.
| Endpoint | Scope | Permission | What it does |
|---|---|---|---|
GET /apps/{app}/revenue/overview |
read | revenue.read |
MRR, ARR, churn and movement for a range |
Revenue is read-only and derives from the billing connectors configured in the console (Stripe, Polar, RevenueCat). Nothing here writes to a payment provider.
?range=7d|30d|90d|12m|custom:YYYY-MM-DD..YYYY-MM-DD (default 30d)
{
"currency": "EUR",
"range": { "from": "…", "to": "…", "key": "30d" },
"totals": {
"mrrCents": 1420000, "arrCents": 17040000,
"activeSubscriptions": 412, "trialing": 38,
"newCents": 96000, "expansionCents": 22000, "contractionCents": 8000,
"churnCents": 31000, "churnedSubscriptions": 9, "newSubscriptions": 27,
"paymentsCents": 1380000, "refundsCents": 4200,
"netNewMrrCents": 79000, "arpaCents": 3446
},
"previous": { "…": "the equally long window before this one" },
"deltas": { "mrr": 5.9, "activeSubscriptions": 4.3 },
"series": { "mrr": [{ "t": "…", "value": 1400000 }] },
"topPlans": [{ "label": "Pro monthly", "value": 820000, "secondary": 210 }],
"otherCurrencies": [{ "currency": "USD", "mrrCents": 210000, "paymentsCents": 198000 }],
"hasConnectors": true
}
Every amount is in cents of the reporting currency. Subscriptions billed in
another currency are converted for the headline and also reported untouched in
otherCurrencies, so a conversion rate never silently becomes the story.
hasConnectors: false with zeros means nothing is connected yet — not that
revenue is zero. Say which when reporting.
A deployment built without the revenue module answers 501 not_available.