Zum Hauptinhalt springen
Jede Zahl der Finanzberichte lässt sich bis zu den Positionen, Rechnungen und Zahlungen zurückverfolgen, aus denen sie besteht. Das erledigt ein einziger Endpunkt: GET /api/analytics/mrr-financials/details. Du nennst die Kennzahl (metric) und den Monat, die API liefert die Zeilen seitenweise und ihre Summe über alle Seiten.

Ein Beispiel

Im September 2026 hat die Taktwerk GmbH 1.338,00 € MRR verloren. Die Zeilen dahinter:
Das eine verlorene Konto ist die Steirerhof Catering GmbH mit zwei Positionen: Plattform über 1.189,00 € und Schichtplanung über 149,00 €, Kündigungsgrund closed. meta.sum ist −1.338,00 €, der negative Wert der Zelle rows.lost im September. Die Zelle zeigt den Verlust als positiven Betrag, die Zeilen tragen die Änderung mit Vorzeichen. Für alle anderen Kennzahlen ist meta.sum gleich dem Wert der Zelle.

Parameter

Der Drill-down übernimmt die Filter der Seite: currency, scope, segmentId, customerIds[], productIds[]. Schick dieselben Werte mit wie beim Datensatz, sonst passen Zeilen und Zelle nicht zusammen.

Kennzahlen

Das Feld kind jeder Zeile sagt, welche Felder gesetzt sind. Die Tabelle nennt für jede der 57 Kennzahlen die Art der Zeilen und die zusätzlichen Parameter.

Was eine Zeile bedeutet

amount ist immer der Anteil der Zeile an der Zelle. Die anderen Felder erklären, wie er zustande kommt. Accounted MRR. Die Rechnung RE-2026-0206 der Hafenkontor Spedition GmbH hat einen Leistungszeitraum vom 01.06. bis ausschließlich 01.07.2026. Alle 30 Tage liegen im Juni, der Anteil am Monat ist der volle Nettobetrag von 4.303,00 €:
Längere Leistungszeiträume teilt die Berechnung nach 30/360, damit jeder volle Monat gleich viel beiträgt. Eine Jahresrechnung über 1.200,00 € für das Kalenderjahr trägt in jedem Monat 30 von 360 Tagen bei, also 100,00 €. Die Beträge der Zeilen werden mit sechs Nachkommastellen gerechnet und erst in der Zelle gerundet. So ergibt die Summe der Zeilen die Zelle auch bei Beträgen wie 2.980,00 € / 12. Differenz Vertrag zu Rechnung. Eine billing_gap-Zeile vergleicht je Position den Vertrag (contractAmount), den erwarteten Rechnungsbetrag nach Vertragstagen im Monat (expectedAmount) und den Accounted MRR (accountedAmount). amount ist der Teil der Differenz, den die Ursache cause erklärt, gerechnet als Vertrag minus Rechnung:
Das Produkt Lohnexport der Havelland Reinigung GmbH hat im August 79,00 € im Vertrag, eine Rechnung für August gibt es noch nicht. Die Summe 79,00 € entspricht der Zelle billing_gap im August. Mit reason=not_yet_billed erhältst du nur die Zeilen einer Ursache. Für vergangene Monate ohne Rechnung unterscheidet die Berechnung zwei Ursachen. not_yet_billed (Rechnung ausstehend) heißt: Der nächste Abrechnungslauf rechnet den Monat ab, weil noch eine Abrechnungsposition offen ist oder das nächste Abrechnungsdatum vor dem Monatsende liegt. not_billed (Nicht abgerechnet) heißt: Kein Lauf wird den Monat abrechnen. Dazu entsteht je Position ein Hinweis NOT_BILLED mit den Monaten und dem Betrag. upcoming_invoice (Rechnung folgt) gilt nur für den laufenden und spätere Monate. Rechnungsprognose. Eine forecast-Zeile nennt die erwartete Rechnung mit Rechnungsdatum (invoiceDate), dem Bruttobetrag in amount und in from und to den Abrechnungszeitraum:
forecastKind sagt, woher die Zeile kommt: pending_billing_item (alle Abrechnungspositionen der Rechnung sind schon angelegt), projected (aus der Abrechnungsprognose hochgerechnet) oder pending_credit (eine offene Gutschrift, die einzige negative Prognosezeile). Holt der nächste Lauf vergangene Zeiträume nach, fasst die Prognose sie wie der Lauf zu einer Rechnung am heutigen Tag zusammen, und billableSince nennt den Tag, seit dem sie abrechenbar ist. Doppelte Rechnungen der Abrechnungsprognose zählen einmal und erzeugen den Hinweis FORECAST_DUPLICATE. Zahlungen. Jede Zahlungszeile nennt in invoiceMonth den Abschlussmonat der Rechnung, die sie bezahlt. Wird eine Rechnung überzahlt, teilt sich die Zahlung: Der Teil bis zum Bruttobetrag gehört zur Rechnung, der Rest zu cash_collected_unassigned. Korrekturen. Eine Korrektur besteht aus zwei Buchungen, die sich aufheben: der stornierten Buchung und ihrer Gegenbuchung. Ohne part liefert cash_correction beide, die Summe ist 0. Mit part=reversed erhältst du nur die stornierten Buchungen, mit part=counter nur die Gegenbuchungen. meta.sum ist dann der Wert der Zeile „Storniert“ oder „Gegenbuchung“:
Die Buchung über 119,00 € vom 21.04.2026 auf die Gutschrift GS-2026-0041 wurde am 28.04.2026 mit −119,00 € gegengebucht. counterpartTransactionId nennt diese Gegenbuchung, part=counter liefert sie mit −119,00 €. part gibt es nur für cash_correction. Bei jeder anderen Kennzahl antwortet die API mit 422, siehe Fehler. Belegsicht. Mit groupBy=document fasst die API Umsatzzeilen je ursprünglicher Rechnung zusammen, einschließlich der Stornos und Gutschriften, die sich auf sie beziehen. groupNet ist Rechnung minus Stornos minus Gutschriften innerhalb der Zelle. Die Seiten zählen dann Gruppen statt Zeilen.

Abgebrochene Berechnung

metric=build_failure braucht keinen Monat und listet die Abweichungen der zuletzt abgebrochenen Berechnung, höchstens 200. Die Liste ist durchsuchbar (search) und blätterbar wie jede andere. Die Zeilen haben keinen Betrag, meta.sum ist null.
check nennt die Prüfung, expectedText und actualText beschreiben, was sie erwartet und was sie gefunden hat. Die Texte sind Diagnosen der Berechnung auf Englisch und nicht zur Anzeige für Endkunden gedacht. Der Endpunkt braucht analytics:read.

Nachträge einer Zelle

metric=restatement liefert keine Zeilen, sondern die Nachtrags-Hinweise eines abgeschlossenen Monats mit ihrer Erklärung: Snapshot-Wert, aktueller Wert, Differenz und Ursache. Mit cell grenzt du auf eine Zahl ein, zum Beispiel cell=mrr_eop oder cell=reasons.lost.contract_end. Wie Nachträge entstehen, erklärt Snapshots.

Seiten

meta.total ist die Zahl aller Zeilen, meta.sum ihre Summe über alle Seiten. Für eine Zelle mit 1.200 Zeilen und pageSize=200 rufst du die Seiten 1 bis 6 ab. Die Reihenfolge ist stabil, solange keine neue Berechnung stattfindet. Prüfe dazu meta.asOf: Ändert es sich zwischen zwei Seiten, beginnst du von vorn. Für große Mengen ohne Seiten nutze die Excel-Bücher: Ihre Rohdaten-Blätter enthalten dieselben Zeilen für den ganzen Zeitraum, siehe Excel-Exporte.