Audit-Trail
Slonge Billing protokolliert jede schreibende Aktion — egal ob aus dem Dashboard, der CLI oder einem MCP-Client — revisionssicher in zwei Tabellen:
ApiTokenUsage: Request-Hülle (Endpoint, HTTP-Methode, Statuscode, Antwortzeit, IP-Adresse, User-Agent) für jeden API-Token-Aufruf.AuditLog: Wer (userIdund/odertokenId), Was (Aktion + Entität + Entity-ID), Vorher/Nachher-Diff bei Updates, plus Kontext-Metadaten.
Pro erfolgreich geänderter Geschäftsentität wird genau eine Zeile in AuditLog erzeugt. PATCH-Aufrufe, die keine getrackten Felder ändern, erzeugen keinen Eintrag — so bleibt der Log frei von bedeutungslosen No-Op-Einträgen.
Zwei-Ebenen-Modell
Jeder CLI/MCP-Aufruf
│
├─► ApiTokenUsage (immer: Umschlag-Metadaten, unabhängig von Erfolg)
│
└─► AuditLog (nur bei Erfolg + tatsächlicher Änderung)
Dashboard-Aktionen schreiben kein ApiTokenUsage (kein API-Token involviert), aber einen AuditLog-Eintrag mit userId der eingeloggten Person.
Finanzieller Lebenszyklus: Compliance-Ledger
Bei Lebenszyklus-Aktionen auf allen finanziell relevanten Entitäten (Rechnungen · Buchungen · Gutschriften · Lieferantenrechnungen · Ausgaben · Angebote) wird zusätzlich ein hash-verkettetes Ereignis in der ComplianceEvent-Ledger festgeschrieben. Das gilt für Dashboard- und CLI/MCP-initiierte Aktionen gleichermassen. Gesendete PDF-Dokumente werden ausserdem als DocumentArtifact mit SHA-256-Prüfsumme registriert. Alle Compliance-Daten sind im Tenant-Backup-Export enthalten — siehe Einstellungen → Daten & Export → Compliance-Dossier.
Was wird protokolliert?
| Aktion | Entität | Action-Code | Beispiel-Metadaten |
|---|---|---|---|
| Kunde anlegen | Client | create | { name, email } |
| Kunde aktualisieren | Client | update | Diff der geänderten Felder |
| Kunde löschen | Client | delete | { name } |
| Projekt anlegen | Project | create | { name, clientId } |
| Rechnung anlegen | Invoice | create | { invoiceNumber, clientId, totalAmount } |
| Rechnung versenden | Invoice | send | { invoiceNumber, recipientEmail } |
| Rechnung als bezahlt markieren | Invoice | status_change | { invoiceNumber, status: "paid" } |
| Angebot anlegen | Quote | create | { quoteNumber, amount } |
| Angebot versenden | Quote | send | { quoteNumber, recipientEmail } |
| Angebot → Rechnung konvertieren | Invoice + Quote | create + status_change | { quoteNumber, invoiceNumber } |
| Zeiteintrag anlegen | TimeEntry | create | { projectId, hours, date } |
| Ausgabe anlegen | Expense | create | { amount, vendor, date } |
| Beleg (OCR) hochladen | Expense | view | { fileSize, mimeType, parsedAmount, parsedVendor, parsedDate } |
| Einstellungen aktualisieren | Settings | update | Diff der geänderten Felder |
| API-Token erstellen | ApiToken | create | { tokenName, tokenPrefix, expiresAt } |
| API-Token widerrufen | ApiToken | revoke | { tokenName, tokenPrefix } |
| Mahnung versendet (Cron oder CLI) | Invoice | status_change | { invoiceNumber, source: "cron"/"cli" } |
| Buchung erstellen | JournalEntry | journal.created | Vollständiger Snapshot inkl. Positionen |
| Buchung ändern | JournalEntry | journal.updated | Vorher + Nachher |
| Buchung löschen | JournalEntry | journal.deleted | Vollständiger Snapshot |
| Gutschrift erstellen | CreditNote | creditNote.created | Vollständiger Snapshot |
| Gutschrift aus Rechnung | CreditNote | creditNote.created_from_invoice | sourceInvoiceId + Snapshot |
| Gutschrift ändern | CreditNote | creditNote.updated | Vorher + Nachher |
| Gutschrift löschen | CreditNote | creditNote.deleted | Vollständiger Snapshot |
| Lieferantenrechnung erstellen | VendorBill | vendorBill.created | Vollständiger Snapshot |
| Lieferantenrechnung ändern | VendorBill | vendorBill.updated | Vorher + Nachher |
| Lieferantenrechnung löschen | VendorBill | vendorBill.deleted | Vollständiger Snapshot |
| Lieferantenrechnung bezahlt | VendorBill | vendorBill.paid | paidAt + paymentReference |
| Ausgabe erstellen | Expense | expense.created | Vollständiger Snapshot |
| Ausgabe ändern | Expense | expense.updated | Vorher + Nachher |
| Ausgabe löschen | Expense | expense.deleted | Vollständiger Snapshot |
| Beleg hochladen (OCR) | Expense | expense.uploaded | fileSize, mimeType, parsedAmount, parsedVendor, parsedDate |
| Angebot erstellen | Quote | quote.created | Vollständiger Snapshot |
| Angebot ändern | Quote | quote.updated | Vorher + Nachher |
| Angebot löschen | Quote | quote.deleted | Vollständiger Snapshot |
| Angebot versenden | Quote | quote.sent | recipientEmail + Snapshot |
| Angebot akzeptieren | Quote | quote.accepted | Vollständiger Snapshot |
| Angebot konvertieren | Quote | quote.converted | createdInvoiceId + Snapshot |
Sicherheitshinweis: Der vollständige Token-Wert wird niemals protokolliert — nur Name und Präfix (z. B.
slk_live_abc…).
Herkunfts-Attributierung
Jeder AuditLog-Eintrag trägt entweder eine userId oder eine tokenId (oder beide):
| Oberfläche | userId | tokenId |
|---|---|---|
| Dashboard | ✓ (eingeloggte Person) | — |
| CLI / MCP / Streamable HTTP | — | ✓ (verwendeter API-Token) |
Der Token-Name, den Sie bei der Erstellung vergeben haben (z. B. „Claude Desktop — Laptop Ben"), erscheint im Audit-Log und erleichtert die Zuordnung. Deshalb empfiehlt es sich, pro Gerät und Anwendung einen eigenen Token zu erstellen.
Audit-Log einsehen
Das Audit-Log ist derzeit nicht direkt im Dashboard einsehbar. Die Rohdaten sind jedoch im Compliance-Dossier-Export enthalten:
- Einstellungen → Daten & Export → Compliance-Dossier exportieren
- Das ZIP enthält
compliance/events.json(hash-verketteter Lebenszyklus-Log) undcompliance/document-artifacts.json(PDF-Prüfsummen).
Wenn Sie eine direkte UI für den Audit-Log benötigen, kontaktieren Sie uns unter [email protected].
Zusammenhang mit anderen Sicherheitsfunktionen
| Funktion | Zweck |
|---|---|
| Audit-Trail (diese Seite) | Wer hat was geändert — für interne Kontrolle und Debugging |
| Compliance-Ledger | Hash-verkettete Rechnungs-Ereignisse — für externe Prüfer |
| ApiTokenUsage | Request-Statistiken pro Token — für Rate-Limiting und Anomalie-Erkennung |
| SHA-256 Dokument-Artefakte | Integritätsnachweis für gesendete PDFs |
Alle vier Ebenen ergänzen sich: Der Audit-Trail erklärt was geändert wurde, der Compliance-Ledger belegt dass eine Rechnung existiert und versendet wurde, und die Dokument-Artefakte beweisen, dass die gespeicherte PDF-Version die gesendete ist.