Was ein Snapshot enthält
Ein Snapshot kopiert die Zahlen, die aus Verträgen entstehen: MRR zu Beginn und am Ende des Monats, die fünf Bewegungen mit Ursachen und Kontenzahlen, Kohorten, Logo-Bewegungen, NRR und GRR, Kundenkonzentration, Verloren nach Kündigungsgrund, und den vertraglich gebundenen MRR. ARR, Umsatz-Churn-Rate und Wachstum werden aus diesen Werten mit denselben Formeln abgeleitet. Seit dem 28.09.2026 friert ein Snapshot auch die Geldwerte des Monats ein: Zahlungseingang, Zahlungsausgang, Netto-Cash, offene Forderungen am Monatsende und DSO über drei und zwölf Monate. Ältere Snapshots haben diese Werte nicht. Nicht festgehalten werden Accounted MRR, die Differenz Vertrag zu Rechnung, einmaliger und variabler Umsatz und die Rechnungsprognose. Sie zeigen immer den aktuellen Stand und stehen inmeta.notSnapshotted.
Jeder Snapshot merkt sich in definitionsVersion, unter welcher Version des Definitionskatalogs er entstanden ist.
Versionen
Version 1 eines Monats entsteht automatisch am 1. des Folgemonats um 05:00 Uhr in der Zeitzone deiner Organisation. Jede weitere Version legst du selbst an, mit einem Grund. Eine neue Version überschreibt nie eine alte. Die Ansicht Stand zum Abschluss nutzt ohne weitere Angabe die neueste Version.takenBy ist beim automatischen Abschluss null. checksum ist ein SHA-256 über die kopierten Zeilen, bei neuen Snapshots einschließlich der Geldwerte, und belegt, dass eine Version unverändert ist. builtAt nennt die Berechnung, aus der kopiert wurde. Der August wurde vor dem 28.09.2026 abgeschlossen und trägt deshalb definitionsVersion: "v1", der September v5, die Version, die bei seinem Abschluss galt.
Nachträge
Bei der Taktwerk GmbH hielt der Abschluss für August 2026 einen MRR am Monatsende von 51.646,00 € fest. Am 04.09.2026 wurde ein Abo der Rosenthal Einzelhandel GmbH mit Start im August angelegt. Die laufende Berechnung zeigt seitdem 51.846,00 €. Die Differenz von +200,00 € ist ein Nachtrag.GET /api/analytics/finance/snapshots/2026-08/1 liefert die Zahlen von Version 1 und unter restatements die Nachträge, die die neueste Berechnung gegenüber dem Snapshot findet:
Jeder Nachtrag ist zusätzlich ein Hinweis mit dem Code
RESTATEMENT. Der Datensatz recurring markiert betroffene Zellen in mrrCells[...].restatement. Übersteigen die Nachträge eines Monats den Anteil mrrRestatementAlertShare seines MRR (Voreinstellung 1 %), entsteht einmalig eine Warnung, und alertedAt der Version wird gesetzt. Die +200,00 € im Beispiel sind 0,39 % von 51.646,00 € und lösen keine Warnung aus.
Einen Monat erneut abschließen
Soll ein festgehaltener Monat die Korrektur enthalten, legst du eine neue Version an. Dafür brauchst duanalytics:write. Der Grund ist Pflicht, höchstens 500 Zeichen lang und bleibt bei der Version gespeichert.
201 Created:
definitionsVersion: "v5". Der Nachtrag gegenüber Version 1 bleibt in Version 1 lesbar, gegenüber der neuesten Version gibt es keinen mehr.
Ein Monat, der noch läuft, lässt sich nicht abschließen. Die API antwortet dann mit 422 und nennt das Feld:
409 und dem Typ ANALYTICS_MRR_FINANCIALS__SNAPSHOT_WITHOUT_BUILD. Lief die letzte Berechnung vor dem Monatsende, lautet der Typ ANALYTICS_MRR_FINANCIALS__SNAPSHOT_BUILD_BEFORE_MONTH_END. Starte dann eine neue Berechnung und nimm den Snapshot danach. Fehlt der Grund, antwortet die API mit 422 und violations[reason].
Einen Snapshot lesen
GET /api/analytics/finance/snapshots/{month}/{version} liefert den Snapshot-Monat und die elf Monate davor, jeden Monat so, wie sein eigener Snapshot beim Anlegen dieser Version stand. versions nennt je Monat die verwendete Version. Die Felder kpis, movementMonths, cohorts, logos, retention, concentration, churnReasons und backlog haben die Form der Datensätze. restatements kommt aus der laufenden Berechnung.
Drei Felder sagen je Monat, woher die Zahlen stammen:
Ausschnitt aus
GET /api/analytics/finance/snapshots/2026-09/1 für die letzten drei der zwölf Monate:
backlog.forward enthält nur den Snapshot-Monat, backlog.events ist leer. Gibt es Monat oder Version nicht, antwortet die API mit 404 und dem Typ ANALYTICS_FINANCE__SNAPSHOT_NOT_FOUND.