Documentation menu

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.