Übersicht
| Endpunkt | Inhalt |
|---|---|
GET /api/analytics/finance/recurring | Kennzahlen, MRR-Waterfall mit Ursachen, gebundener und bekannter MRR, MRR-Tabelle, Snapshot-Stand, Definitionen |
GET /api/analytics/finance/customers | Aktive Konten, ARPA, NRR und GRR, Kohorten, Kundenkonzentration, Logo-Bewegungen, Verloren nach Kündigungsgrund, Segmentvergleich |
GET /api/analytics/finance/liquidity | Netto-Cash, offene und überfällige Forderungen, DSO, Cashflow mit Rechnungsprognose, Forderungsalter, Forderungstabelle, Zahlungsverhalten, Abgleich Vertrag und Rechnung |
GET /api/analytics/finance/revenue | Umsatz je Land, je Produkt, Top-Produkte, Umsatzdetails, ARR am Periodenende, Umsatz je Kunde und Produkt |
GET /api/analytics/finance/revenue/customers | weitere Seiten der Tabelle Umsatz je Kunde und Produkt |
GET /api/analytics/finance/overview | Cashflow, MRR-Bewegungen, Umsatz nach Klasse, Forderungen, Forderungsalter, Forderungstabelle |
GET /api/analytics/mrr-financials | die MRR-Tabelle: ein Wert je Zeile und Monat |
analytics:read. Jeder Datensatz enthält das meta-Objekt mit dem Stand der Berechnung und meta.forecast.
Gemeinsame Parameter
| Parameter | Bedeutung |
|---|---|
from, to | Zeitraum als YYYY-MM, höchstens 36 Monate. Ohne Angabe die letzten zwölf Monate bis zum laufenden. |
currency | ISO-4217-Code. Ohne Angabe die Standardwährung. |
scope | Ebene der Bewegungen: subscription, invoice_address, customer, organisation. Ohne Angabe die Einstellung der Organisation. |
segmentId | nur die Kunden eines gespeicherten Segments |
customerIds[], productIds[] | nur diese Kunden oder Produkte (Umsatz, Finanzübersicht, MRR-Tabelle) |
month wählt bei recurring den Monat des MRR-Waterfalls (ohne Angabe der letzte abgeschlossene Monat des Zeitraums). compareSegmentId und granularity (month, quarter) gelten für customers. page, pageSize (50, höchstens 100) und search blättern und suchen in der Tabelle Umsatz je Kunde und Produkt.
Die MRR-Tabelle
GET /api/analytics/mrr-financials liefert die Tabelle, die in der App unter Wiederkehrender Umsatz steht. months gibt die Spalten vor, jede Zeile unter rows hat genau einen Wert je Monat in derselben Reihenfolge.
curl "https://coreapi.io/api/analytics/mrr-financials?from=2026-07&to=2026-09&scope=customer" \
-H "Authorization: Bearer api_DEIN_TOKEN"
{
"months": [
"2026-07",
"2026-08",
"2026-09"
],
"rows": {
"one_off": [
{
"amount": "2050.00",
"currency": "EUR"
},
{
"amount": "1270.00",
"currency": "EUR"
},
{
"amount": "1470.00",
"currency": "EUR"
}
],
"variable": [
{
"amount": "1283.40",
"currency": "EUR"
},
{
"amount": "1270.80",
"currency": "EUR"
},
{
"amount": "1377.00",
"currency": "EUR"
}
],
"mrr_bop": [
{
"amount": "49076.90",
"currency": "EUR"
},
{
"amount": "51831.50",
"currency": "EUR"
},
{
"amount": "51846.00",
"currency": "EUR"
}
],
"mrr_eop": [
{
"amount": "51831.50",
"currency": "EUR"
},
{
"amount": "51846.00",
"currency": "EUR"
},
{
"amount": "53414.80",
"currency": "EUR"
}
],
"accounted_mrr": [
{
"amount": "51980.50",
"currency": "EUR"
},
{
"amount": "51767.00",
"currency": "EUR"
},
{
"amount": "53414.80",
"currency": "EUR"
}
],
"billing_gap": [
{
"amount": "-149.00",
"currency": "EUR"
},
{
"amount": "79.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"new": [
{
"amount": "1529.00",
"currency": "EUR"
},
{
"amount": "456.00",
"currency": "EUR"
},
{
"amount": "1976.00",
"currency": "EUR"
}
],
"expansion": [
{
"amount": "717.40",
"currency": "EUR"
},
{
"amount": "319.00",
"currency": "EUR"
},
{
"amount": "1281.70",
"currency": "EUR"
}
],
"contraction": [
{
"amount": "63.80",
"currency": "EUR"
},
{
"amount": "387.50",
"currency": "EUR"
},
{
"amount": "350.90",
"currency": "EUR"
}
],
"lost": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "373.00",
"currency": "EUR"
},
{
"amount": "1338.00",
"currency": "EUR"
}
],
"resurrecting": [
{
"amount": "572.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"arr_eop": [
{
"amount": "621978.00",
"currency": "EUR"
},
{
"amount": "622152.00",
"currency": "EUR"
},
{
"amount": "640977.60",
"currency": "EUR"
}
],
"revenue_churn_rate": [
"0.001300",
"0.014673",
"0.032575"
],
"mom_growth": [
"0.056128",
"0.000280",
"0.030259"
],
"cash_collected": [
{
"amount": "58028.29",
"currency": "EUR"
},
{
"amount": "71981.72",
"currency": "EUR"
},
{
"amount": "59869.28",
"currency": "EUR"
}
],
"cash_collected_this_month": [
{
"amount": "39628.84",
"currency": "EUR"
},
{
"amount": "45130.08",
"currency": "EUR"
},
{
"amount": "42103.00",
"currency": "EUR"
}
],
"cash_collected_other_months": [
{
"amount": "18399.45",
"currency": "EUR"
},
{
"amount": "26851.64",
"currency": "EUR"
},
{
"amount": "17766.28",
"currency": "EUR"
}
],
"cash_collected_unassigned": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"cash_refunded": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "113.65",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"cash_net": [
{
"amount": "58028.29",
"currency": "EUR"
},
{
"amount": "71868.07",
"currency": "EUR"
},
{
"amount": "59869.28",
"currency": "EUR"
}
],
"cash_forecast": [
null,
null,
null
],
"receivables_eop": [
{
"amount": "28729.46",
"currency": "EUR"
},
{
"amount": "21463.61",
"currency": "EUR"
},
{
"amount": "28656.90",
"currency": "EUR"
}
]
},
"totals": {
"one_off": {
"amount": "4790.00",
"currency": "EUR"
},
"variable": {
"amount": "3931.20",
"currency": "EUR"
},
"mrr_bop": {
"amount": "49076.90",
"currency": "EUR"
},
"mrr_eop": {
"amount": "53414.80",
"currency": "EUR"
},
"accounted_mrr": {
"amount": "53414.80",
"currency": "EUR"
},
"billing_gap": {
"amount": "0.00",
"currency": "EUR"
},
"new": {
"amount": "3961.00",
"currency": "EUR"
},
"expansion": {
"amount": "2318.10",
"currency": "EUR"
},
"contraction": {
"amount": "802.20",
"currency": "EUR"
},
"lost": {
"amount": "1711.00",
"currency": "EUR"
},
"resurrecting": {
"amount": "572.00",
"currency": "EUR"
},
"arr_eop": {
"amount": "640977.60",
"currency": "EUR"
},
"revenue_churn_rate": null,
"mom_growth": null,
"cash_collected": {
"amount": "189879.29",
"currency": "EUR"
},
"cash_collected_this_month": {
"amount": "126861.92",
"currency": "EUR"
},
"cash_collected_other_months": {
"amount": "63017.37",
"currency": "EUR"
},
"cash_collected_unassigned": {
"amount": "0.00",
"currency": "EUR"
},
"cash_refunded": {
"amount": "113.65",
"currency": "EUR"
},
"cash_net": {
"amount": "189765.64",
"currency": "EUR"
},
"cash_forecast": {
"amount": "0.00",
"currency": "EUR"
},
"receivables_eop": {
"amount": "28656.90",
"currency": "EUR"
}
},
"reasons": {
"new": {
"contract_start": [
{
"amount": "800.00",
"currency": "EUR"
},
{
"amount": "456.00",
"currency": "EUR"
},
{
"amount": "1392.00",
"currency": "EUR"
}
],
"trial_conversion": [
{
"amount": "729.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "584.00",
"currency": "EUR"
}
]
},
"expansion": {
"quantity_change": [
{
"amount": "632.20",
"currency": "EUR"
},
{
"amount": "319.00",
"currency": "EUR"
},
{
"amount": "1132.70",
"currency": "EUR"
}
],
"product_added": [
{
"amount": "149.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "149.00",
"currency": "EUR"
}
],
"discount_start": [
{
"amount": "-63.80",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
]
},
"contraction": {
"quantity_change": [
{
"amount": "-63.80",
"currency": "EUR"
},
{
"amount": "-159.50",
"currency": "EUR"
},
{
"amount": "-350.90",
"currency": "EUR"
}
],
"product_removed": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "-228.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
]
},
"lost": {
"contract_end": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "-373.00",
"currency": "EUR"
},
{
"amount": "-1338.00",
"currency": "EUR"
}
]
},
"resurrecting": {
"reactivation": [
{
"amount": "572.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
]
},
"billing_gap": {
"price_mismatch": [
{
"amount": "-149.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"not_yet_billed": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "79.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
]
}
},
"meta": {
"asOf": "2026-10-01T04:00:00+00:00",
"buildId": "0199c0de-0000-7000-8000-00000000b001",
"scope": "customer",
"currency": "EUR",
"from": "2026-07",
"to": "2026-09",
"findings": {
"error": 0,
"warning": 6,
"info": 9
},
"filtersNotApplied": [],
"notSnapshotted": [
"one_off",
"variable",
"accounted_mrr",
"billing_gap",
"cash_collected",
"cash_collected_this_month",
"cash_collected_other_months",
"cash_collected_unassigned",
"cash_refunded",
"cash_net",
"cash_forecast",
"receivables_eop"
],
"projectedFrom": null,
"forecast": {
"incomplete": false,
"failedSubscriptions": 0
},
"build": {
"status": "succeeded",
"builtAt": "2026-10-01T04:00:00+00:00",
"buildId": "0199c0de-0000-7000-8000-00000000b001",
"failed": null
},
"dataBuildId": "0199c0de-0000-7000-8000-00000000b001"
},
"reasonLabels": {
"contract_end": "Vertragsende",
"contract_start": "Vertragsbeginn",
"discount_start": "Rabatt beginnt",
"not_yet_billed": "Rechnung ausstehend",
"price_mismatch": "Rechnungsbetrag weicht ab",
"product_added": "Produkt hinzugefügt",
"product_removed": "Produkt entfernt",
"quantity_change": "Mengenänderung",
"reactivation": "Reaktivierung",
"trial_conversion": "Testphase beendet"
}
}
| Zeile | Bedeutung |
|---|---|
mrr_bop, mrr_eop | MRR am Ende des Vormonats und am Ende des Monats |
new, expansion, contraction, lost, resurrecting | die fünf Bewegungen; Kontraktion und Verloren sind positive Beträge, die den MRR senken |
arr_eop | MRR am Monatsende mal 12, die eine ARR aller Seiten |
revenue_churn_rate, mom_growth | (Kontraktion + Verloren) / MRR zu Beginn und (Ende − Beginn) / Beginn, als Rate |
accounted_mrr | wiederkehrende Rechnungspositionen nach Leistungszeitraum (30/360) |
billing_gap | Differenz Vertrag zu Rechnung: mrr_eop − accounted_mrr, die Ursachen stehen unter reasons.billing_gap |
one_off, variable | Nettoumsatz einmaliger und nutzungsabhängiger Positionen der im Monat abgeschlossenen Belege |
cash_collected | Zahlungseingang nach Zahldatum, aufgeteilt in cash_collected_this_month, cash_collected_other_months und cash_collected_unassigned |
cash_refunded, cash_refunded_refund, cash_refunded_chargeback, cash_refunded_payout, cash_net | Zahlungsausgang mit seinen Teilen Erstattungen, Rücklastschriften und Auszahlungen, und Zahlungseingang abzüglich Zahlungsausgang |
cash_forecast | Rechnungsprognose brutto, nur für den laufenden und spätere Monate |
receivables_eop | offene Forderungen am Monatsende |
not_yet_billed die ganze Differenz Vertrag zu Rechnung von 79,00 €.
totals ist die Summenspalte. Bewegungen und Zahlungen werden über den Zeitraum addiert: Neu ergibt von Juli bis September 3.961,00 €. Bestände wie mrr_eop, accounted_mrr und receivables_eop zeigen den letzten Monat, mrr_bop den ersten. Raten haben keine Summe.
reasons teilt die Bewegungen nach Ursachen auf, mit Vorzeichen. reasonLabels nennt für jeden Schlüssel aus reasons den deutschen Namen, den auch die Karte Ursachen der Bewegungen und die Excel-Bücher zeigen. Jede Ursache ist eine eigene Unterzeile: Hinzugefügte und entfernte Produkte werden nie verrechnet, und „Sonstiges” gibt es nur für einen unbekannten Schlüssel. Eine Ursache kann gegenläufig sein: Im Juli enthält die Expansion einen beginnenden Rabatt über −63,80 €.
Wiederkehrender Umsatz
GET /api/analytics/finance/recurring liefert alles für die Seite Wiederkehrender Umsatz in einer Antwort.
curl "https://coreapi.io/api/analytics/finance/recurring?from=2026-07&to=2026-09&month=2026-09" \
-H "Authorization: Bearer api_DEIN_TOKEN"
Im Beispiel ist
mrrWire auf die MRR-Zeilen gekürzt, backlog.events auf drei Ereignisse, definitions auf zwei Einträge ohne Änderungsverlauf und movementMonths auf den gewählten Monat. Die API liefert mrrWire vollständig in der Form der MRR-Tabelle oben, movementMonths für jeden Monat des Zeitraums und den ganzen Definitionskatalog.{
"tenantName": "Taktwerk GmbH",
"currency": "EUR",
"asOf": "2026-10-01T04:00:00+00:00",
"months": [
"2026-07",
"2026-08",
"2026-09"
],
"mrrWire": {
"months": [
"2026-07",
"2026-08",
"2026-09"
],
"rows": {
"mrr_bop": [
{
"amount": "49076.90",
"currency": "EUR"
},
{
"amount": "51831.50",
"currency": "EUR"
},
{
"amount": "51846.00",
"currency": "EUR"
}
],
"mrr_eop": [
{
"amount": "51831.50",
"currency": "EUR"
},
{
"amount": "51846.00",
"currency": "EUR"
},
{
"amount": "53414.80",
"currency": "EUR"
}
],
"accounted_mrr": [
{
"amount": "51980.50",
"currency": "EUR"
},
{
"amount": "51767.00",
"currency": "EUR"
},
{
"amount": "53414.80",
"currency": "EUR"
}
],
"billing_gap": [
{
"amount": "-149.00",
"currency": "EUR"
},
{
"amount": "79.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"new": [
{
"amount": "1529.00",
"currency": "EUR"
},
{
"amount": "456.00",
"currency": "EUR"
},
{
"amount": "1976.00",
"currency": "EUR"
}
],
"expansion": [
{
"amount": "717.40",
"currency": "EUR"
},
{
"amount": "319.00",
"currency": "EUR"
},
{
"amount": "1281.70",
"currency": "EUR"
}
],
"contraction": [
{
"amount": "63.80",
"currency": "EUR"
},
{
"amount": "387.50",
"currency": "EUR"
},
{
"amount": "350.90",
"currency": "EUR"
}
],
"lost": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "373.00",
"currency": "EUR"
},
{
"amount": "1338.00",
"currency": "EUR"
}
],
"resurrecting": [
{
"amount": "572.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
]
},
"totals": {
"mrr_bop": {
"amount": "49076.90",
"currency": "EUR"
},
"mrr_eop": {
"amount": "53414.80",
"currency": "EUR"
},
"accounted_mrr": {
"amount": "53414.80",
"currency": "EUR"
},
"billing_gap": {
"amount": "0.00",
"currency": "EUR"
},
"new": {
"amount": "3961.00",
"currency": "EUR"
},
"expansion": {
"amount": "2318.10",
"currency": "EUR"
},
"contraction": {
"amount": "802.20",
"currency": "EUR"
},
"lost": {
"amount": "1711.00",
"currency": "EUR"
},
"resurrecting": {
"amount": "572.00",
"currency": "EUR"
}
},
"reasons": {
"lost": {
"contract_end": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "-373.00",
"currency": "EUR"
},
{
"amount": "-1338.00",
"currency": "EUR"
}
]
}
},
"meta": {
"asOf": "2026-10-01T04:00:00+00:00",
"buildId": "0199c0de-0000-7000-8000-00000000b001",
"scope": "customer",
"currency": "EUR",
"from": "2026-07",
"to": "2026-09",
"findings": {
"error": 0,
"warning": 6,
"info": 9
},
"filtersNotApplied": [],
"notSnapshotted": [
"one_off",
"variable",
"accounted_mrr",
"billing_gap",
"cash_collected",
"cash_collected_this_month",
"cash_collected_other_months",
"cash_collected_unassigned",
"cash_refunded",
"cash_net",
"cash_forecast",
"receivables_eop"
],
"projectedFrom": null,
"forecast": {
"incomplete": false,
"failedSubscriptions": 0
},
"build": {
"status": "succeeded",
"builtAt": "2026-10-01T04:00:00+00:00",
"buildId": "0199c0de-0000-7000-8000-00000000b001",
"failed": null
},
"dataBuildId": "0199c0de-0000-7000-8000-00000000b001"
},
"reasonLabels": {
"contract_end": "Vertragsende"
}
},
"recurring": {
"kpis": [
{
"id": "mrr",
"title": "MRR",
"valueKind": "money",
"value": "53414.80",
"delta": "1568.80",
"better": "up",
"sparkline": [
"32074.00",
"33728.00",
"35406.00",
"39440.90",
"44674.40",
"45797.40",
"46869.70",
"47533.40",
"49076.90",
"51831.50",
"51846.00",
"53414.80"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "arr",
"title": "ARR",
"valueKind": "money",
"value": "640977.60",
"delta": "18825.60",
"better": "up",
"sparkline": [
"384888.00",
"404736.00",
"424872.00",
"473290.80",
"536092.80",
"549568.80",
"562436.40",
"570400.80",
"588922.80",
"621978.00",
"622152.00",
"640977.60"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "net_new",
"title": "Netto-Neu-MRR",
"valueKind": "money",
"value": "1568.80",
"delta": "1554.30",
"better": "up",
"sparkline": [
"1318.00",
"1654.00",
"1678.00",
"4034.90",
"5233.50",
"1123.00",
"1072.30",
"663.70",
"1543.50",
"2754.60",
"14.50",
"1568.80"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "quick_ratio",
"title": "Quick Ratio",
"valueKind": "ratio",
"value": "1.93",
"delta": "0.91",
"better": "up",
"sparkline": [
"3.43",
"58.03",
"12.26",
"6.23",
"7.17",
"5.93",
"2.96",
"1.49",
"2.78",
"44.18",
"1.02",
"1.93"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "accounted_mrr",
"title": "Accounted MRR",
"valueKind": "money",
"value": "53414.80",
"delta": "1647.80",
"better": "up",
"sparkline": [
"32074.00",
"33728.00",
"35406.00",
"38976.90",
"44674.40",
"45797.40",
"46710.20",
"47533.40",
"48887.30",
"51980.50",
"51767.00",
"53414.80"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
}
],
"movementMonths": [
{
"month": "2026-09",
"bop": "51846.00",
"eop": "53414.80",
"steps": [
{
"key": "new",
"value": "1976.00",
"accounts": 3
},
{
"key": "expansion",
"value": "1281.70",
"accounts": 5
},
{
"key": "resurrecting",
"value": "0.00",
"accounts": 0
},
{
"key": "contraction",
"value": "-350.90",
"accounts": 1
},
{
"key": "lost",
"value": "-1338.00",
"accounts": 1
}
],
"reasons": [
{
"movement": "new",
"reason": "contract_start",
"amount": "1392.00",
"accounts": 2,
"label": "Vertragsbeginn"
},
{
"movement": "new",
"reason": "trial_conversion",
"amount": "584.00",
"accounts": 1,
"label": "Testphase beendet"
},
{
"movement": "expansion",
"reason": "quantity_change",
"amount": "1132.70",
"accounts": 4,
"label": "Mengenänderung"
},
{
"movement": "expansion",
"reason": "product_added",
"amount": "149.00",
"accounts": 1,
"label": "Produkt hinzugefügt"
},
{
"movement": "contraction",
"reason": "quantity_change",
"amount": "-350.90",
"accounts": 1,
"label": "Mengenänderung"
},
{
"movement": "lost",
"reason": "contract_end",
"amount": "-1338.00",
"accounts": 1,
"label": "Vertragsende"
}
]
}
],
"backlog": {
"asOfMonth": "2026-09",
"committed": "303835.60",
"averageRemainingMonths": "5.7",
"accounts": 53,
"buckets": [
{
"key": "lt3",
"amount": "16966.20"
},
{
"key": "3to6",
"amount": "54560.30"
},
{
"key": "6to12",
"amount": "186126.10"
},
{
"key": "gt12",
"amount": "46183.00"
}
],
"forward": [
{
"month": "2026-09",
"mrr": "53414.80"
},
{
"month": "2026-10",
"mrr": "53530.80"
},
{
"month": "2026-11",
"mrr": "53052.30"
},
{
"month": "2026-12",
"mrr": "53251.30"
},
{
"month": "2027-01",
"mrr": "53635.10"
},
{
"month": "2027-02",
"mrr": "55325.80"
},
{
"month": "2027-03",
"mrr": "54898.80"
},
{
"month": "2027-04",
"mrr": "54898.80"
},
{
"month": "2027-05",
"mrr": "54898.80"
},
{
"month": "2027-06",
"mrr": "54898.80"
},
{
"month": "2027-07",
"mrr": "54898.80"
},
{
"month": "2027-08",
"mrr": "54898.80"
},
{
"month": "2027-09",
"mrr": "54898.80"
}
],
"events": [
{
"id": "0199c0de-0000-7000-8000-a00000000038-0",
"month": "2026-10",
"kind": "discount_end",
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000038",
"name": "Löwenzahn Apotheken OHG",
"number": "K-10038"
},
"accounts": 1,
"amount": "116.00",
"product": null,
"cancellationReason": null
},
{
"id": "0199c0de-0000-7000-8000-a00000000010-0",
"month": "2026-11",
"kind": "end",
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000010",
"name": "Kranich Sicherheitsdienste GmbH",
"number": "K-10010"
},
"accounts": 1,
"amount": "-478.50",
"cancellationReason": "competitor",
"product": null
},
{
"id": "0199c0de-0000-7000-8000-a00000000037-0",
"month": "2026-12",
"kind": "end",
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000037",
"name": "Isarwerk Studios GmbH",
"number": "K-10037"
},
"accounts": 1,
"amount": "-381.00",
"cancellationReason": "price",
"product": null
}
]
}
},
"selectedMonth": "2026-09",
"mrrCells": {
"mrr_eop": [
{
"snapshot": "51831.50",
"snapshotVersion": 1,
"restatement": null,
"snapshotAccounts": 50
},
{
"snapshot": "51646.00",
"snapshotVersion": 1,
"restatement": {
"delta": "200.00",
"accounts": 1,
"cause": "segment_added",
"causeLabel": "Konto hinzugekommen"
},
"snapshotAccounts": 50
},
{
"snapshot": "53414.80",
"snapshotVersion": 1,
"restatement": null,
"snapshotAccounts": 53
}
]
},
"definitions": {
"version": "v7",
"validFrom": "2026-10-22",
"entries": [
{
"id": "mrr_bop",
"title": "MRR (Periodenbeginn)",
"definition": "MRR am Ende des Vormonats.",
"formula": "MRR(Monatsende des Vormonats)"
},
{
"id": "arr",
"title": "ARR",
"definition": "MRR am Monatsende, auf ein Jahr gerechnet. Bei nutzungsabhängigen Produkten zählt die feste Gebühr je Intervall.",
"formula": "MRR × 12"
}
],
"changelog": []
},
"meta": {
"asOf": "2026-10-01T04:00:00+00:00",
"buildId": "0199c0de-0000-7000-8000-00000000b001",
"scope": "customer",
"currency": "EUR",
"from": "2026-07",
"to": "2026-09",
"findings": {
"error": 0,
"warning": 6,
"info": 9
},
"filtersNotApplied": [],
"notSnapshotted": [
"one_off",
"variable",
"accounted_mrr",
"billing_gap",
"cash_collected",
"cash_collected_this_month",
"cash_collected_other_months",
"cash_collected_unassigned",
"cash_refunded",
"cash_net",
"cash_forecast",
"receivables_eop"
],
"projectedFrom": null,
"forecast": {
"incomplete": false,
"failedSubscriptions": 0
},
"build": {
"status": "succeeded",
"builtAt": "2026-10-01T04:00:00+00:00",
"buildId": "0199c0de-0000-7000-8000-00000000b001",
"failed": null
},
"dataBuildId": "0199c0de-0000-7000-8000-00000000b001"
}
}
| Feld | Inhalt |
|---|---|
recurring.kpis | Kacheln mrr, arr, net_new, quick_ratio, accounted_mrr für den letzten abgeschlossenen Monat, mit Veränderung zum Vormonat, bis zu zwölf Verlaufspunkten, asOfMonth, monthComplete und current |
recurring.movementMonths | je Monat der Waterfall von bop zu eop mit den fünf Schritten und ihren Ursachen, jede Ursache mit label |
recurring.backlog | vertraglich gebundener MRR, die Restlaufzeit-Bänder, der bekannte MRR der nächsten zwölf Monate und die bekannten Ereignisse |
mrrCells | je festgehaltener Zeile und Monat der Snapshot-Wert, seine Version und ein möglicher Nachtrag |
definitions | der Katalog, nach dem die Zahlen berechnet sind |
valueKind sagt, wie ein Kachelwert zu lesen ist: money, rate, ratio, count oder days. better gibt die günstige Richtung an. Für DSO ist das down. Reicht der Zeitraum bis in den laufenden Monat, steht dessen bisheriger Wert in current, siehe Der laufende Monat. Die Accounted-MRR-Kachel vergleicht nur abgeschlossene Monate, ihr current.delta ist immer null.
mrrCells.mrr_eop zeigt im August den Nachtrag: Festgehalten sind 51.646,00 €, heute sind es 51.846,00 €. Die Differenz von +200,00 € mit der Ursache segment_added betrifft ein Konto.
Kundenbasis
GET /api/analytics/finance/customers liefert unter customers sieben Bereiche:
| Feld | Inhalt |
|---|---|
kpis | active, arpa, nrr, grr |
retention | NRR und GRR je Monat über zwölf Monate |
cohorts | das Kohorten-Dreieck: je Startmonat die Konten, der MRR bei Alter 0 und je Alter der MRR und die Bindung |
concentration | Anteile der größten Konten (top1, top2_5, top6_10, rest) und die zehn größten Konten |
logos | neue, reaktivierte und verlorene Konten je Monat |
churnReasons | verlorener MRR je Kündigungsgrund, die Anteile ergeben genau 1 |
segmentMetrics | alle Konten, das Segment und das Vergleichssegment nebeneinander |
{
"customers": {
"kpis": [
{
"id": "active",
"title": "Aktive Konten",
"valueKind": "count",
"value": "53",
"delta": "2",
"better": "up",
"sparkline": [
"31",
"33",
"36",
"38",
"38",
"40",
"43",
"45",
"46",
"50",
"51",
"53"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "arpa",
"title": "ARPA",
"valueKind": "money",
"value": "1007.83",
"delta": "-8.76",
"better": "up",
"sparkline": [
"1034.65",
"1022.06",
"983.50",
"1037.92",
"1175.64",
"1144.94",
"1089.99",
"1056.30",
"1066.89",
"1036.63",
"1016.59",
"1007.83"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "nrr",
"title": "NRR 12 Monate",
"valueKind": "rate",
"value": "1.154006",
"delta": "-0.028306",
"better": "up",
"sparkline": [
"1.015696",
"1.024772",
"1.107326",
"1.233321",
"1.174759",
"1.191093",
"1.478865",
"1.446721",
"1.362233",
"1.188678",
"1.182312",
"1.154006"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "grr",
"title": "GRR 12 Monate",
"valueKind": "rate",
"value": "0.900618",
"delta": "0.010610",
"better": "up",
"sparkline": [
"0.958077",
"0.962930",
"0.970780",
"0.998305",
"0.952305",
"0.955795",
"0.941343",
"0.926672",
"0.918567",
"0.874865",
"0.890008",
"0.900618"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
}
]
}
}
Liquidität
GET /api/analytics/finance/liquidity liefert die Zahlungs- und Forderungssicht. overviewWire hat die Form der Finanzübersicht (Cashflow, Forderungsalter, Forderungstabelle), liquidity die Kennzahlen, das Zahlungsverhalten und den Abgleich Vertrag und Rechnung. accountingClosed sagt je Monat, ob die Buchhaltung ihn abgeschlossen hat.
Ausschnitt liquidity für Juli bis September 2026:
{
"liquidity": {
"kpis": [
{
"id": "net_cash",
"title": "Netto-Cash",
"valueKind": "money",
"value": "189765.64",
"delta": null,
"better": "up",
"sparkline": [
"47884.85",
"33152.62",
"59627.57",
"38431.82",
"38174.97",
"74589.59",
"45482.29",
"74685.66",
"62296.08",
"58028.29",
"71868.07",
"59869.28"
],
"caption": "im Zeitraum",
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "outstanding",
"title": "Offene Forderungen",
"valueKind": "money",
"value": "28656.90",
"delta": "7193.29",
"better": "down",
"sparkline": [
"17218.71",
"27480.40",
"13176.32",
"24000.83",
"41076.71",
"23634.18",
"37015.98",
"21706.08",
"20844.90",
"28729.46",
"21463.61",
"28656.90"
],
"caption": "heute",
"asOfMonth": "2026-10",
"monthComplete": false,
"current": null
},
{
"id": "overdue",
"title": "Überfällig",
"valueKind": "money",
"value": "6922.26",
"delta": null,
"better": "down",
"sparkline": [],
"caption": "heute",
"asOfMonth": "2026-10",
"monthComplete": false,
"current": null
},
{
"id": "dso",
"title": "DSO 3 Monate",
"valueKind": "days",
"value": "13.3",
"delta": "3.0",
"better": "down",
"sparkline": [
"13.6",
"20.2",
"9.3",
"16.0",
"24.6",
"13.1",
"19.2",
"11.4",
"10.6",
"14.2",
"10.3",
"13.3"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
},
{
"id": "dso_12m",
"title": "DSO 12 Monate",
"valueKind": "days",
"value": "15.1",
"delta": "0.2",
"better": "down",
"sparkline": [
"16.4",
"16.2",
"15.9",
"15.8",
"16.0",
"15.7",
"15.6",
"15.4",
"15.2",
"15.1",
"14.9",
"15.1"
],
"caption": null,
"asOfMonth": "2026-09",
"monthComplete": true,
"current": null
}
],
"paymentBehaviour": {
"termDays": 14,
"months": [
{
"month": "2026-09",
"averageDays": {
"sepa_debit": "4.6",
"bank_transfer": "17.7",
"card": "0.8"
},
"openOverdueCount": 0
}
],
"summary": [
{
"method": "sepa_debit",
"averageDays": "6.4",
"withinTerm": "0.954167",
"invoices": 240
},
{
"method": "bank_transfer",
"averageDays": "22.2",
"withinTerm": "0.191919",
"invoices": 198
},
{
"method": "card",
"averageDays": "0.6",
"withinTerm": "1.000000",
"invoices": 43
}
]
},
"reconciliation": {
"totalDifference": "-70.00",
"rows": [
{
"id": "0199c0de-0000-7000-8000-d00000033002:2026-07",
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000033",
"number": "K-10033",
"name": "Eichenhof Senioren GmbH"
},
"subscription": {
"id": "0199c0de-0000-7000-8000-b00000000033",
"number": "ABO-2033"
},
"invoice": {
"id": "0199c0de-0000-7000-8000-000000000565",
"number": "RE-2026-0278"
},
"product": "Schichtplanung",
"month": "2026-07",
"contract": "149.00",
"billed": "298.00",
"difference": "-149.00",
"cause": "price_mismatch",
"causeLabel": "Rechnungsbetrag weicht ab",
"parts": [
{
"cause": "price_mismatch",
"causeLabel": "Rechnungsbetrag weicht ab",
"amount": "-149.00"
}
],
"invoices": [
{
"id": "0199c0de-0000-7000-8000-000000000565",
"number": "RE-2026-0278"
}
],
"findingId": "3f0b6d2e-8a41-5c77-9e20-1d4c7a9b5e33",
"belowTolerance": false,
"monthComplete": true
},
{
"id": "0199c0de-0000-7000-8000-d00000018003:2026-08",
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000018",
"number": "K-10018",
"name": "Havelland Reinigung GmbH"
},
"subscription": {
"id": "0199c0de-0000-7000-8000-b00000000018",
"number": "ABO-2018"
},
"invoice": null,
"product": "Lohnexport",
"month": "2026-08",
"contract": "79.00",
"billed": "0.00",
"difference": "79.00",
"cause": "not_yet_billed",
"causeLabel": "Rechnung ausstehend",
"parts": [
{
"cause": "not_yet_billed",
"causeLabel": "Rechnung ausstehend",
"amount": "79.00"
}
],
"invoices": [],
"findingId": "7a2c9e41-0d5b-5f18-8c63-2e9b4f1a0c18",
"belowTolerance": false,
"monthComplete": true
}
],
"monthTotals": {
"2026-07": "-149.00",
"2026-08": "79.00",
"2026-09": "0.00"
}
},
"dso": "13.3"
}
}
monthComplete: false.
Abgleich Vertrag und Rechnung. reconciliation enthält jede Position und jeden Monat, in dem Vertrag und Accounted MRR auseinanderliegen, also genau die Bestandteile der Zeile Differenz Vertrag zu Rechnung der MRR-Tabelle.
| Feld | Bedeutung |
|---|---|
id | stabile Kennung aus Position und Monat (item:month) |
contract, billed | MRR laut Vertrag am Monatsende und Accounted MRR der Position |
difference | Vertrag minus Rechnung; positiv heißt, es wurde weniger abgerechnet |
parts | alle Ursachen mit ihrem Anteil, sie ergeben difference |
invoices, invoice | die Belege hinter billed; invoice nur, wenn es genau einer ist |
findingId | der zugehörige Hinweis BILLED_VS_CONTRACT_DIFF, falls die Position über der Toleranz liegt |
belowTolerance | die Abweichung liegt innerhalb von max(2,00 €, 2 % des Vertrags) |
monthComplete | false für den laufenden Monat, Rechnungen können noch folgen |
monthTotals ist je Monat gleich der Zelle billing_gap der MRR-Tabelle, totalDifference ihre Summe: −149,00 + 79,00 + 0,00 = −70,00 €. Die Eichenhof Senioren GmbH hat im Juli 149,00 € im Vertrag und 298,00 € auf der Rechnung RE-2026-0278, die Havelland Reinigung GmbH im August 79,00 € im Vertrag und noch keine Rechnung. Die Erklärung eines Hinweises öffnest du mit GET /api/analytics/mrr-financials/findings/{findingId}.
Ausschnitt overviewWire.ageing, das Forderungsalter heute:
{
"ageing": {
"asOf": "2026-10-01T04:00:00+00:00",
"total": {
"amount": "28656.90",
"currency": "EUR"
},
"overdueTotal": {
"amount": "6922.26",
"currency": "EUR"
},
"buckets": [
{
"key": "not_due",
"amount": {
"amount": "21734.64",
"currency": "EUR"
},
"invoiceCount": 14,
"topCustomers": []
},
{
"key": "1_30",
"amount": {
"amount": "5044.44",
"currency": "EUR"
},
"invoiceCount": 6,
"topCustomers": [
{
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000015",
"name": "Ostwind Energie GmbH",
"number": "K-10015"
},
"amount": {
"amount": "1695.75",
"currency": "EUR"
},
"invoiceCount": 1
}
]
},
{
"key": "31_60",
"amount": {
"amount": "625.94",
"currency": "EUR"
},
"invoiceCount": 1,
"topCustomers": [
{
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000023",
"name": "Bergmann Personalservice GmbH",
"number": "K-10023"
},
"amount": {
"amount": "625.94",
"currency": "EUR"
},
"invoiceCount": 1
}
]
},
{
"key": "61_90",
"amount": {
"amount": "625.94",
"currency": "EUR"
},
"invoiceCount": 1,
"topCustomers": [
{
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000023",
"name": "Bergmann Personalservice GmbH",
"number": "K-10023"
},
"amount": {
"amount": "625.94",
"currency": "EUR"
},
"invoiceCount": 1
}
]
},
{
"key": "over_90",
"amount": {
"amount": "625.94",
"currency": "EUR"
},
"invoiceCount": 1,
"topCustomers": [
{
"customer": {
"id": "0199c0de-0000-7000-8000-c00000000023",
"name": "Bergmann Personalservice GmbH",
"number": "K-10023"
},
"amount": {
"amount": "625.94",
"currency": "EUR"
},
"invoiceCount": 1
}
]
}
],
"over365": {
"amount": "0.00",
"currency": "EUR"
}
}
}
not_due ist überfällig: 6.922,26 €.
Zahlungsverhalten und DSO gelten immer für die ganze Organisation. Mit einem Segment steht das in meta.filtersNotApplied.
Umsatz
GET /api/analytics/finance/revenue zeigt den abgerechneten Nettoumsatz aller Klassen nach dem Monat, in dem die Belege ausgestellt wurden: byCountry, byProduct, topProducts (die zehn größten), revenueDetails, arrAtPeriodEnd und byCustomerAndProduct. Gutschriften und Stornos zählen im Monat ihrer Ausstellung negativ.
Ausschnitt mit revenueDetails und arrAtPeriodEnd für Juli bis September 2026:
{
"revenueDetails": [
{
"currency": "EUR",
"recurring": [
{
"amount": "52310.20",
"currency": "EUR"
},
{
"amount": "51402.40",
"currency": "EUR"
},
{
"amount": "53866.90",
"currency": "EUR"
}
],
"oneOff": [
{
"amount": "2050.00",
"currency": "EUR"
},
{
"amount": "1270.00",
"currency": "EUR"
},
{
"amount": "1470.00",
"currency": "EUR"
}
],
"variable": [
{
"amount": "1283.40",
"currency": "EUR"
},
{
"amount": "1270.80",
"currency": "EUR"
},
{
"amount": "1377.00",
"currency": "EUR"
}
],
"total": [
{
"amount": "55643.60",
"currency": "EUR"
},
{
"amount": "53943.20",
"currency": "EUR"
},
{
"amount": "56713.90",
"currency": "EUR"
}
],
"totals": {
"recurring": {
"amount": "157579.50",
"currency": "EUR"
},
"oneOff": {
"amount": "4790.00",
"currency": "EUR"
},
"variable": {
"amount": "3931.20",
"currency": "EUR"
},
"total": {
"amount": "166300.70",
"currency": "EUR"
}
}
}
],
"arrAtPeriodEnd": {
"committed": [
{
"amount": "621978.00",
"currency": "EUR"
},
{
"amount": "622152.00",
"currency": "EUR"
},
{
"amount": "640977.60",
"currency": "EUR"
}
],
"variable": [
{
"amount": "14702.30",
"currency": "EUR"
},
{
"amount": "14859.10",
"currency": "EUR"
},
{
"amount": "15030.90",
"currency": "EUR"
}
],
"total": [
{
"amount": "621978.00",
"currency": "EUR"
},
{
"amount": "622152.00",
"currency": "EUR"
},
{
"amount": "640977.60",
"currency": "EUR"
}
]
}
}
revenueDetails teilt den Umsatz je Währung und Monat in wiederkehrend, einmalig und variabel. total ist ihre Summe, im September 53.866,90 + 1.470,00 + 1.377,00 = 56.713,90 €. totals.total über den Zeitraum ist gleich der Summe aller Länder und aller Produkte.
arrAtPeriodEnd.total ist dieselbe ARR wie auf allen anderen Seiten: MRR am Monatsende mal 12, im September 640.977,60 €. committed hat denselben Wert. variable ist eine eigene Reihe, der variable Umsatz der letzten zwölf Monate, und gehört nicht zur ARR. details wiederholt diese Reihen für jede Währung der Organisation.
byCustomerAndProduct enthält die erste Seite der Kundentabelle. Weitere Seiten lädst du über GET /api/analytics/finance/revenue/customers mit denselben Filtern und page. Die Reihenfolge ist stabil: Kunden sind absteigend nach Nettoumsatz sortiert, gleiche Beträge nach Kunden-ID.
accountingClosed markiert Monate, deren Buchungen abgeschlossen sind. Die Umsatzzahlen folgen den Belegdaten und können sich auch nach dem Abschluss noch ändern, zum Beispiel durch eine spätere Gutschrift. Eine solche Änderung erzeugt den Hinweis POST_CLOSE_CHANGE.
Finanzübersicht
GET /api/analytics/finance/overview liefert Cashflow, MRR-Bewegungen mit Vorzeichen, Umsatz nach Klasse (wiederkehrend, einmalig, variabel), offene Forderungen je Monatsende, das Forderungsalter und die Forderungstabelle. Die Liquiditätsseite enthält denselben Datensatz als overviewWire. Ausschnitt cashflow:
{
"cashflow": {
"collected": [
{
"amount": "58028.29",
"currency": "EUR"
},
{
"amount": "71981.72",
"currency": "EUR"
},
{
"amount": "59869.28",
"currency": "EUR"
}
],
"refunded": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "113.65",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
],
"net": [
{
"amount": "58028.29",
"currency": "EUR"
},
{
"amount": "71868.07",
"currency": "EUR"
},
{
"amount": "59869.28",
"currency": "EUR"
}
],
"forecastBilled": [
null,
null,
null
],
"collectedThisMonth": [
{
"amount": "39628.84",
"currency": "EUR"
},
{
"amount": "45130.08",
"currency": "EUR"
},
{
"amount": "42103.00",
"currency": "EUR"
}
],
"collectedOtherMonths": [
{
"amount": "18399.45",
"currency": "EUR"
},
{
"amount": "26851.64",
"currency": "EUR"
},
{
"amount": "17766.28",
"currency": "EUR"
}
],
"collectedUnassigned": [
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
},
{
"amount": "0.00",
"currency": "EUR"
}
]
}
}
forecastBilled ist für vergangene Monate null. Meldet meta.forecast.incomplete eine unvollständige Prognose, ist jeder Prognosewert eine Untergrenze.
Weiter
Drill-downs
Die Zeilen hinter einer Zelle der Datensätze.
Excel-Exporte
Jede Seite als Excel-Buch mit allen Rohdaten.