Calendar Sync Handbuch

Zur Admin-UI

Handbuch Calendar Sync

Einrichtung, Funktionsweise und Betrieb der Termin-Synchronisation zwischen Ihrer Terminsoftware und Microsoft Outlook. Alle Screenshots stammen aus einer Demo-Installation mit erfundenen Daten.

1. Überblick

Calendar Sync ist eine Middleware. Sie steht zwischen der Terminsoftware und Microsoft 365 bzw. Exchange und hält Termine in beide Richtungen synchron:

RichtungWas passiert
Terminsoftware → OutlookJeder Termin einer gemappten Ressource (Mitarbeiter, Raum, Gerät) erscheint als Termin im zugeordneten Outlook-Kalender. Betreff ist die Terminnummer, Details stehen im Termintext.
Outlook → TerminsoftwareEigene Outlook-Termine (Status „gebucht") blockieren automatisch die Verfügbarkeit in der Terminsoftware als Sperrzeit. So entstehen keine Doppelbuchungen.

Beteiligte Systeme:

  • Terminsoftware: führendes System für Kundentermine. Die Middleware spricht deren Calendar-API an und empfängt Ereignisse per Webhook.
  • Microsoft 365 / Exchange: Kalender der Mitarbeitenden, Räume und Geräte. Anbindung über Microsoft Graph (Standard) oder Exchange Web Services (EWS, für Exchange Online mit OAuth oder On-Premises).
  • Calendar Sync Middleware: Docker-Container mit eigener PostgreSQL-Datenbank, Admin-Oberfläche und mehreren Hintergrunddiensten.
TerminsoftwareTermine, Ressourcen, Sperrzeiten.
Sendet Webhooks bei Terminänderungen.
Webhook →← API-Aufrufe← Polling
Calendar SyncWarteschlange, Sync-Logik, Loop-Schutz, Admin-UI.
Speichert nur Verknüpfungen, keine Termininhalte.
← WebhookGraph/EWS →Delta-Abfrage →
Microsoft 365 / ExchangeOutlook-Kalender der Postfächer.
Meldet Änderungen per Subscription.

2. Kommunikationswege

Jede Richtung hat einen schnellen Weg (Push per Webhook) und ein Sicherheitsnetz (aktives Nachfragen). Fällt der schnelle Weg aus, übernimmt das Sicherheitsnetz automatisch. Änderungen kommen dann verzögert an, gehen aber nicht verloren.

Terminsoftware ↔ Middleware

KanalBeschreibung
Webhook der Terminsoftware
Push, sofort
Die Terminsoftware ruft POST /api/appointment-events auf, gesichert über den Header X-API-Key. Verarbeitet werden appointment_confirmed, appointment_reserved, appointment_requested (Anlegen), appointment_move (Ändern), appointment_canceled und appointment_canceled_not_confirmed_intime (Löschen). Unbekannte oder deaktivierte Tenants werden mit 200 ignored beantwortet, damit die Terminsoftware nicht endlos wiederholt.
Termin-Polling
Sicherheitsnetz
Alle 60 Sekunden fragt die Middleware pro Ressource nach Terminen, die sich seit der letzten bekannten Änderung geändert haben (Wasserzeichen mit 2 Minuten Überlappung). Sind die Webhooks aller Tenants gesund, wird auf 5 Minuten gedrosselt. Nach einem Ausfall wird ab dem Wasserzeichen alles nachgeholt.
API der Terminsoftware
Ausgehend
Die Middleware liest Termine und Ressourcen und schreibt Sperrzeiten (block_availability). Zugangsdaten sind die pro Tenant hinterlegte Base-URL und der zugehörige API-Key. HTTPS ist Pflicht.

Outlook ↔ Middleware

KanalBeschreibung
Outlook-Webhook
Push, sofort
Pro Mapping besteht eine Graph-Subscription (Laufzeit 2 Tage, automatische Erneuerung alle 12 Stunden) bzw. eine EWS-Push-Subscription. Microsoft meldet Änderungen an die öffentliche HTTPS-URL der Middleware. Mehrere Meldungen zum selben Termin werden für 10 Sekunden gesammelt (Debounce), damit ein Termin nur einmal verarbeitet wird.
Delta-Abfrage
Sicherheitsnetz
Alle 60 Sekunden (gesund: 5 Minuten) holt die Middleware pro Kalender die Änderungen seit dem letzten Delta-Link. Beim ersten Lauf wird das Fenster von 1 Monat zurück bis 6 Monate voraus vollständig gelesen.
Graph / EWS
Ausgehend
Anlegen, Ändern und Löschen von Terminen in den gemappten Kalendern. Jeder von der Middleware erzeugte Termin trägt eine unsichtbare Markierung, an der die Middleware ihre eigenen Termine wiedererkennt.

Die Warteschlange

Alles, was per Webhook oder Polling erkannt wird, landet zuerst als Eintrag in einer dauerhaften Warteschlange in der Datenbank. Ein Hintergrunddienst arbeitet sie der Reihe nach ab. Das hat zwei Vorteile: Ein Neustart verliert nichts, und Fehler werden kontrolliert wiederholt.

StatusBedeutung
PENDINGWartet auf Verarbeitung (oder auf den nächsten Wiederholungsversuch).
PROCESSINGWird gerade verarbeitet.
COMPLETEDErfolgreich abgeschlossen. Auch „nichts zu tun" (z. B. keine Änderung) endet hier.
FAILEDFehlgeschlagen, wird automatisch wiederholt. Fehlertext steht am Eintrag.
DEADLETTERAlle Versuche verbraucht. Wird nicht mehr automatisch versucht, nur noch per Erneut einreihen.

Wiederholungen: Ein fehlgeschlagener Eintrag wird bis zu 5-mal versucht. Die Wartezeiten dazwischen wachsen: 5 Sekunden, 30 Sekunden, 2 Minuten, 10 Minuten. Nach dem fünften Fehlschlag geht der Eintrag in Dead Letter.

3. Sync-Regeln

SituationVerhalten
Termin wird in der Terminsoftware gebuchtOutlook-Termin erscheint im Kalender jeder gemappten Ressource des Termins (Mitarbeiter, Raum, Gerät), typisch innerhalb weniger Sekunden.
Termin wird in der Terminsoftware verschoben oder storniertOutlook-Termin wandert mit bzw. verschwindet. Unveränderte Termine werden per Inhaltsvergleich erkannt und nicht erneut geschrieben.
Mitarbeitende legt eigenen Outlook-Termin anDer Zeitraum wird in der Terminsoftware als Sperrzeit blockiert (Notiztext konfigurierbar, Standard „Outlook-Sync"). Verschieben verschiebt die Sperrzeit, Löschen hebt sie auf. Termine mit Status „frei" blockieren nicht.
Mehrere Outlook-Termine überlappenWerden zu einer zusammenhängenden Sperrzeit zusammengefasst.
Serientermin in OutlookWird für die nächsten 6 Monate (pro Tenant einstellbar) in einzelne Sperrzeiten aufgelöst. Alle 12 Stunden wird der Horizont automatisch nachgezogen.
Termin der Terminsoftware wird in Outlook verschobenDie Terminsoftware ist führend. Die Middleware setzt den Termin auf die Originalzeit zurück und ergänzt einen Hinweis im Termintext. Kein Fehler, sondern gewollt.
Termin der Terminsoftware wird in Outlook gelöschtDer Termin wird in Outlook automatisch wiederhergestellt. Die Buchung in der Terminsoftware bleibt bestehen.

Datenschutz: Die Middleware speichert keine Betreffzeilen und keine Termininhalte. Im Sync Log erscheinen eigene Outlook-Termine nur als „Outlook-Termin" mit Zeitraum. In der Terminsoftware wird als Sperrzeit-Notiz nur der feste Text aus der Tenant-Konfiguration geschrieben, nie der Outlook-Betreff. Zugangsdaten liegen verschlüsselt in der Datenbank.

Nicht Teil der Lösung: keine Einladungen oder E-Mails an Kundinnen, keine Teilnehmerverwaltung, keine Anhänge, keine Kundendaten in Outlook.

4. Einrichtung Schritt für Schritt

Die Server-Installation (Docker Compose, Reverse Proxy, Secrets) beschreibt das README des Projekts. Dieses Kapitel setzt eine laufende Middleware voraus und führt vom ersten Login bis zur Abnahme.

Schritt 1: Erster Login

Anmeldemaske der Admin-Oberfläche
Anmeldung mit persönlichem Benutzerkonto.

Beim allerersten Start legt die Middleware automatisch einen SuperAdmin an, sofern noch kein Benutzer existiert:

  • Benutzername: admin, oder der Wert aus Security:BootstrapAdmin:Username in der appsettings.json.
  • Passwort: der Wert aus Security:BootstrapAdmin:Password (mindestens 10 Zeichen). Fehlt er oder ist er zu kurz, wird ein Zufallspasswort erzeugt und einmalig im Server-Log ausgegeben. Danach ist sofort eine Passwortänderung Pflicht.
# Generiertes Passwort im Container-Log finden
docker logs rc_calendarsync 2>&1 | grep "generated password"

Häufiger Stolperstein: Der Bootstrap-Admin wird nur angelegt, solange die Benutzertabelle leer ist. Ein nachträglich in die appsettings.json eingetragenes Passwort hat keine Wirkung mehr. Ist das Passwort verloren, müssen die Benutzer in der Datenbank gelöscht und der Dienst neu gestartet werden (Runbook), oder ein anderer SuperAdmin setzt es zurück.

Schritt 2: Azure-App registrieren (Graph und Exchange Online)

Im Azure-Portal unter Microsoft Entra ID → App-Registrierungen → Neue Registrierung:

  1. Name z. B. CalendarSync, Kontotyp „Nur Konten in diesem Organisationsverzeichnis".
  2. Anwendungs-ID (Client ID) und Verzeichnis-ID (Tenant ID) notieren.
  3. Unter Zertifikate & Geheimnisse einen geheimen Clientschlüssel erzeugen (Laufzeit max. 24 Monate). Wert sofort kopieren und das Ablaufdatum dokumentieren.
  4. API-Berechtigungen → Anwendungsberechtigungen:
    • Provider Microsoft Graph: ausschließlich Calendars.ReadWrite. Empfohlen: den Zugriff per ApplicationAccessPolicy auf die synchronisierten Postfächer begrenzen (Anleitung im Techniker-Einrichtungsguide, Kapitel 2.1). Der Verbindungstest fragt dann nach einem freigegebenen Postfach, solange noch keine Zuordnung besteht.
    • Provider Exchange Online (EWS + OAuth): Office 365 Exchange Online → full_access_as_app
  5. Administratorzustimmung erteilen (globaler Admin). Ohne Zustimmung scheitert später der Verbindungstest.

Für Exchange On-Premises mit Basic Auth entfällt dieser Schritt. Dort werden EWS-URL und ein Service-Account mit Impersonationsrecht benötigt. Dieser Weg ist als experimentell gekennzeichnet.

Schritt 3: Webhook in der Terminsoftware einrichten

Damit Änderungen aus der Terminsoftware sofort ankommen, dort in der Admin-Oberfläche unter Einstellungen → Terminbuchung → Webhooks einen neuen Endpoint anlegen:

URLhttp://rc_calendarsync:5052/api/appointment-events (interner Docker-Name, wenn beide Systeme im selben Stack laufen), sonst die öffentliche URL der Middleware plus /api/appointment-events.
API-KeyIdentisch zu Security:ApiKey in der appsettings.json der Middleware.
EventsMindestens appointment_confirmed, appointment_move, appointment_canceled.

Ohne diesen Webhook funktioniert der Sync trotzdem, dann aber nur über das Polling im 60-Sekunden-Takt.

Schritt 4: Tenant anlegen

Tab Tenants → + Tenant anlegen (nur SuperAdmin). Ein Tenant entspricht einem Mandanten in der Terminsoftware. Ein Assistent führt in drei Schritten durch die Einrichtung: Zugang & Ressourcen, Kalender-Provider, Einstellungen & Prüfen. Jeder Schritt wird geprüft, bevor es weitergeht; gespeichert wird erst am Ende. „Abbrechen, Entwurf behalten" merkt sich die Eingaben ohne API-Key und Secret.

Assistent Tenant anlegen, Schritt Zugang und Ressourcen
Schritt 1 des Assistenten: Zugang geprüft, Ressourcen der Terminsoftware ausgelesen.
FeldWert
Tenant UIDGUID des Mandanten in der Terminsoftware. Muss exakt der tenant_uid im Webhook entsprechen.
Tenant NameFreier Anzeigename.
Base URL der Terminsoftwarez. B. https://termine.kunde.de/m/mandant. Nur HTTPS.
API-Key der TerminsoftwareAPI-Key mit Rechten zum Lesen von Terminen und Ressourcen sowie zum Schreiben von Sperrzeiten.
Reminder (Minuten)Erinnerungszeit der erzeugten Outlook-Termine, Standard 15.
Sperrzeit-NotizNotiztext für aus Outlook erzeugte Sperrzeiten, Standard „Outlook-Sync".
ProviderMicrosoft Graph (Standard), Exchange Online (EWS + OAuth) oder Exchange On-Premises (EWS, Basic Auth).
Directory (Tenant) ID / Application (Client) ID / Client SecretWerte aus Schritt 2. Bei On-Premises stattdessen EWS-URL, Service-Account und Passwort.
Secret gültig bisAblaufdatum des Client Secrets aus Microsoft Entra ID. 30 Tage vorher erscheint ein Hinweis im Dashboard, nach Ablauf ein kritischer Eintrag.
Sync-RichtungBeidseitig (Standard), nur Terminsoftware → Outlook oder nur Outlook → Terminsoftware.

Der Assistent prüft beide Seiten vor dem Anlegen: die API der Terminsoftware (Schritt 1) und die Anmeldung beim Kalender-Provider (Schritt 2). Später lässt sich die Verbindung jederzeit auf der Detailseite des Tenants mit Verbindung testen prüfen; das Ergebnis steht dort als „Letzter Test". Einstellungen ändert Einstellungen bearbeiten auf derselben Seite.

Microsoft Graph ohne Zuordnung: Solange noch kein Kalender zugeordnet ist, meldet der Test „Postfach erforderlich" und fragt nach einer Postfach-Adresse. Hintergrund: Die Middleware spricht Graph nur noch über Postfächer an, damit sie auch unter einer ApplicationAccessPolicy funktioniert. Ein Postfach eingeben, das die App nutzen darf, oder erst eine Zuordnung anlegen und dann testen. Antwortet der Test mit 403, liegt das Postfach außerhalb der Policy.

Tenant-Liste
Tenant-Liste mit Status, Provider, Webhook und dem dringendsten Problem. Ein Klick auf den Namen öffnet die Detailseite mit Testen, Bearbeiten und Löschen.

Schritt 5: Ressourcen den Outlook-Kalendern zuordnen

Tab Kalender-Mappings → Tenant auswählen. Die Tabelle listet alle Ressourcen der Terminsoftware; ein Mapping verbindet eine Ressource mit genau einem Outlook-Kalender.

Kalender zuordnen direkt in der Mapping-Tabelle
Postfach eingeben, Kalender laden, „Zuordnen" klicken — direkt in der Tabellenzeile.
  1. In der Zeile der Ressource auf Kalender zuordnen klicken (Tab „Ohne Zuordnung" zeigt nur offene Ressourcen).
  2. E-Mail-Adresse (UPN) des Zielpostfachs eingeben, z. B. raum1@kunde.de, oder ein bekanntes Postfach anklicken, und Kalender laden. Funktions- und freigegebene Postfächer sind unterstützt.
  3. Beim gewünschten Kalender auf Zuordnen klicken. Bereits belegte Kalender sind markiert. Wird das Postfach schon in einem anderen Tenant synchronisiert, erscheint eine Warnung, denn zwei schreibende Tenants führen zu Konflikten (HTTP 409).
  4. Sync sofort aktivieren angehakt lassen, sonst wird das Mapping pausiert angelegt. Eine Zuordnung lässt sich im Hinweis unten rechts mit „Rückgängig" zurücknehmen.

Ist der Kalender nicht auffindbar, hilft Kalender-ID manuell eingeben. Der klassische Dialog über + Neues Mapping steht weiterhin zur Verfügung.

Alternativ steht die Ansicht Drag & Drop zur Verfügung: Outlook-Postfächer oben hinzufügen, dann Ressourcen per Ziehen auf Kalender legen.

Kalender-Mappings in Tabellenansicht
Mapping-Tabelle mit Sync- und Webhook-Status pro Ressource.

Schritt 6: Webhooks erstellen

Im Tab Kalender-Mappings auf Webhooks erneuern klicken. Für jedes aktive Mapping wird eine Subscription bei Microsoft angelegt. Nach kurzer Zeit zeigt die Spalte Webhook bei jedem Mapping AKTIV. Die Subscriptions werden danach automatisch alle 12 Stunden verlängert.

Schritt 7: Abnahme

Die Einrichtung gilt als abgenommen, wenn diese sechs Tests bestanden sind:

#AktionErwartung
1In der Terminsoftware Termin auf gemappte Ressource buchenOutlook-Termin erscheint innerhalb weniger Sekunden
2In Outlook privaten Termin (Status „gebucht") im gemappten Kalender anlegenSperrzeit in der Terminsoftware innerhalb ~10 Sekunden
3Termin aus #1 in der Terminsoftware verschiebenOutlook-Termin wandert mit
4Termin aus #1 in Outlook verschiebenTermin springt zurück, Hinweis im Termintext
5Termin aus #1 in Outlook löschenTermin wird automatisch wiederhergestellt
6Termin aus #1 in der Terminsoftware stornierenOutlook-Termin verschwindet, Sperrzeit aus #2 bleibt

Für bestehende Termine anschließend im Tab Sync Status einen Initialen Sync über den gewünschten Zeitraum starten (siehe Sync Status).

5. Die Oberfläche

Die Admin-Oberfläche ist unter der URL der Middleware erreichbar. Welche Tabs sichtbar sind, hängt von der Rolle ab (siehe Benutzer & Rollen). Ein Banner oberhalb der Karten warnt, wenn eine Terminsoftware nicht erreichbar ist.

Warnbanner Terminsoftware nicht erreichbar
Banner bei nicht erreichbarer Terminsoftware. Der Status wird alle 30 Sekunden geprüft.

Tenants

Verbindungen zu den Mandanten der Terminsoftware mit URL, Provider und Zugangsdaten. Testen prüft beide Seiten der Verbindung. Export und Import (nur SuperAdmin) übertragen Tenants und Mappings als JSON zwischen Installationen. Secrets werden dabei nie exportiert und müssen nach einem Import neu eingegeben werden.

Kalender-Mappings

Zuordnung Ressource ↔ Outlook-Kalender pro Tenant, umschaltbar zwischen Tabelle und Drag & Drop. Kopfzeile:

  • Webhooks erneuern: alle Subscriptions des Tenants neu anlegen. Erste Maßnahme, wenn Outlook-Änderungen nicht mehr ankommen.
  • Termin testen: spielt einen einzelnen Termin per Termin-UID Schritt für Schritt durch (Termin laden, Mapping finden, Anmeldung beim Kalender-Provider, nach Outlook schreiben) und zeigt, wo es abbricht, samt Lösungshinweis. Im Modus Nur prüfen wird nichts geschrieben, im Modus Prüfen und schreiben landet der Termin bei Erfolg in Outlook. Jeder Test steht im Audit Log.
  • + Neues Mapping: klassischer Dialog, alternativ zur Zuordnung in der Tabelle.

Ein Mapping pausieren stoppt den Sync für diese Ressource sofort, lässt aber bereits erzeugte Outlook-Termine und Sperrzeiten stehen. Lösen entfernt nur die Zuordnung, räumt ebenfalls nichts auf. Ein Klick auf den Ressourcennamen öffnet die Detailseite des Mappings mit den letzten Syncs und den Kenndaten.

Dialog Termin testen
„Termin testen" im Modus „Nur prüfen": alle Prüfungen bestanden, nichts geschrieben.

Sync Status

Erste Anlaufstelle bei Problemen. Pro Tenant und Zeitraum:

Sync Status mit Kennzahlen, letzten Aktivitäten und initialem Sync
Kennzahlen, die letzten 20 Vorgänge und der Bereich „Initialer Sync".
  • Aktive Mappings: Anzahl der Ressourcen mit eingeschaltetem Sync.
  • Synchronisiert / Fehlgeschlagen: abgeschlossene bzw. aktuell fehlgeschlagene Vorgänge im gewählten Zeitraum.
  • Queue (Pending): wartende Einträge. Dauerhaft über 50 deutet auf eine Störung hin.
  • Dead Letter: endgültig fehlgeschlagene Einträge, die manuell geprüft werden müssen.
  • Letzte Aktivitäten: die letzten 20 Vorgänge mit Richtung, Auslöser (Quelle), Termin, Ressource und Status.
  • Initialer Sync: bestehende Termine der Terminsoftware eines Zeitraums nach Outlook übertragen. Bereits synchronisierte Termine werden übersprungen, außer „Bereits synchronisierte aktualisieren" ist angehakt. Die Ressourcenauswahl kann leer bleiben (alle).
  • Nachsynchronisierung (Outlook → Terminsoftware): liest die ausgewählten Outlook-Kalender komplett neu ein (Zeitraum: 1 Monat zurück bis 6 Monate voraus), indem der Delta-Link zurückgesetzt wird. Die Mapping-Auswahl kann leer bleiben (alle). Die gefundenen Änderungen laufen über die Warteschlange; der Fortschritt ist unter „Letzte Aktivitäten" sichtbar. Idempotent — bereits synchronisierte Termine bleiben unverändert. Bei großen EWS-Kalendern kann der Lauf einige Minuten dauern.

Die Spalte Quelle zeigt, wie ein Vorgang ausgelöst wurde:

Termin-WebhookDie Terminsoftware hat die Änderung sofort gemeldet.
Termin-PollingÄnderung beim regelmäßigen Nachfragen erkannt (Sicherheitsnetz).
Outlook WebhookMicrosoft hat die Kalenderänderung gemeldet.
Outlook DeltaÄnderung per Delta-Abfrage erkannt (Sicherheitsnetz).
NachprüfungAutomatische Kontrolle einige Sekunden nach einem Schreibvorgang, ob zwischenzeitlich weitere Änderungen eingingen.
Manuell / Bulk-SyncÜber „Termin testen" (Modus „Prüfen und schreiben") bzw. „Initialer Sync" ausgelöst.
NachsyncÜber „Nachsynchronisierung" (Outlook → Terminsoftware) ausgelöst.
series-materializationRegelmäßige Auflösung von Outlook-Serienterminen in Sperrzeiten.

Datenbereinigung (nur SuperAdmin)

Damit die Datenbank nicht unbegrenzt wächst, entfernt die Middleware einmal täglich alte Einträge. Gelöscht wird nur nach Alter und Zustand:

DatenVoreinstellung
Sync Log, abgeschlossene Vorgänge30 Tage
Sync Log, fehlgeschlagene Vorgänge90 Tage, damit die Fehlersuche Zeit hat
Aufgehobene Termin-Verknüpfungen90 Tage
Termin-Verknüpfungen nach Terminende30 Tage nach dem Terminende, samt gesichertem Verfügbarkeitsstand
Audit Log90 Tage
Abschnitt Datenbereinigung im Tab Sync Status
Die geltenden Fristen und der letzte Aufräumlauf im Tab „Sync Status".

Die geltenden Fristen und der letzte Lauf stehen im Tab Sync Status im Abschnitt „Datenbereinigung". Jeder Lauf, der etwas entfernt hat, erscheint zusätzlich im Audit Log als RetentionCleanup mit den Zahlen je Kategorie. Läuft die Bereinigung und findet nichts, entsteht kein Eintrag.

Was nie gelöscht wird: Vorgänge, die noch warten oder gerade laufen, unabhängig vom Alter. Ebenso Verknüpfungen künftiger Termine, Kalender-Zuordnungen, Mandanten, Benutzer und Konten. Entfernt werden nur abgeschlossene Protokolldaten und Verknüpfungen, deren Termin lange vorbei ist.

Die Fristen legt der Techniker in der Konfiguration fest. Jede Kategorie lässt sich einzeln abschalten, dann bleiben diese Daten unbegrenzt erhalten. Für das Audit Log ist das je nach Aufbewahrungspflicht zu prüfen.

Sync Log

Vollständiges Protokoll aller Vorgänge eines Tenants, filterbar nach Status (Tabs), Suchbegriff, Zeitraum und Richtung, mit CSV-Export. Ein Klick auf eine Zeile klappt die Details direkt darunter auf: Fehlermeldung, Verlauf der Versuche und Kennungen. Bei fehlgeschlagenen oder abgebrochenen Einträgen erscheint Erneut einreihen; „Alle Details" öffnet die vollständige Ansicht mit Nutzdaten.

Sync Log
Sync Log mit Status-Tabs, Filtern und fehlgeschlagenen Einträgen samt Fehlertext.
Aufgeklappter Sync-Log-Eintrag
Aufgeklappter Eintrag mit Fehlermeldung, Aktionen und Kennungen.

Audit Log (nur SuperAdmin)

Wer hat wann was geändert oder ausgelöst: Tenant- und Mapping-Änderungen, Benutzeranlage, manuelle Syncs (inkl. Nachsynchronisierung, OutlookResyncTriggered), Webhook-Erneuerungen, Dead Letters, fehlgeschlagene Logins sowie Systemereignisse wie DeltaQueryFailed und RetentionCleanup. Greift die Middleware korrigierend in Outlook ein, steht auch das hier: OutlookEventReverted (in Outlook verschobener Termin zurückgesetzt), OutlookEventRecreated (in Outlook gelöschter Termin wiederhergestellt) und OutlookEventOrphanDeleted (Outlook-Termin ohne gültigen Termin in der Terminsoftware entfernt bzw. nicht wiederhergestellt) — jeweils nur mit Termin-UID, Outlook-Ereignis-ID, Auslöser und Ergebnis, nie mit Betreff oder Text. Die Spalte Quelle unterscheidet Aktionen von Benutzern („api") und automatische Vorgänge („system").

Audit Log
Audit Log über alle Tenants, gruppiert nach Tag, mit Kategorien, Zeitraumfilter und CSV-Export.

Benutzer (nur SuperAdmin)

Benutzerkonten anlegen, Rollen pro Tenant vergeben, Passwörter zurücksetzen, Konten deaktivieren. Neue Benutzer erhalten ein temporäres Passwort und müssen es beim ersten Login ändern. Nach 5 Fehlversuchen wird ein Konto 15 Minuten gesperrt; ein SuperAdmin kann die Sperre auf der Detailseite des Benutzers aufheben. Der Tab „Rollen & Rechte" zeigt, was jede Rolle darf.

Benutzerverwaltung
Benutzerliste. „Passwortänderung ausstehend" markiert Konten, die beim nächsten Login ein neues Passwort setzen müssen.
Dialog Neuer Benutzer
Rollenvergabe pro Tenant im Benutzer-Dialog.

6. Verbindungsabbrüche und Wiederaufnahme

Grundprinzip: Nichts geht verloren, die Kommunikation nimmt sich selbst wieder auf. Erkannte Änderungen liegen dauerhaft in der Warteschlange und werden wiederholt. Nicht erkannte Änderungen werden über Polling bzw. Delta-Abfrage nachgeholt, sobald die Gegenseite wieder erreichbar ist. Manuelle Eingriffe sind nur in den unten markierten Fällen nötig.

Terminsoftware nicht erreichbar

Erkennbar an
Rotes Banner „Terminsoftware nicht erreichbar" bzw. gelbes Banner „Verbindung gestört". Im Sync Log Einträge mit Timeout oder HTTP-5xx-Fehlern.
Während der Störung
Terminsoftware → Outlook: keine neuen Vorgänge, da weder Webhooks noch Polling Daten liefern. Outlook → Terminsoftware: Sperrzeiten können nicht geschrieben werden, die Einträge werden mit wachsenden Abständen wiederholt.
Wiederaufnahme
Automatisch. Das Polling-Wasserzeichen bleibt beim Fehler stehen, beim nächsten erfolgreichen Poll wird alles seit dem Wasserzeichen nachgeholt. Wartende Einträge laufen durch, sobald die API antwortet.
Manuell nötig
Nur wenn die Störung länger als die Retry-Kette (etwa 13 Minuten) dauerte: Einträge im Status Dead Letter im Sync Log per Erneut einreihen neu anstoßen (für alle auf einmal: „N fehlgeschlagene erneut einreihen").

Microsoft 365 / Graph / Exchange nicht erreichbar

Erkennbar an
Fehlgeschlagene Einträge mit Netzwerk- oder Graph-Fehlern, Webhook-Status der Mappings nicht mehr aktiv.
Während der Störung
Outlook-Termine können nicht geschrieben werden, Einträge werden wiederholt. Änderungen in Outlook werden nicht gemeldet.
Wiederaufnahme
Automatisch. Die Delta-Abfrage liest beim nächsten Lauf alle Änderungen seit dem letzten Delta-Link nach. Graph-Subscriptions werden beim 12-Stunden-Zyklus erneuert oder neu angelegt, wenn Microsoft sie verworfen hat.
Manuell nötig
Dead-Letter-Einträge per Erneut einreihen. Bei anhaltend inaktivem Webhook-Status: Webhooks erneuern.

Azure-Secret abgelaufen oder ungültig

Erkennbar an
Fehlertexte mit AADSTS… oder „ClientSecretCredential authentication failed". Im Audit Log ein Eintrag DeltaQueryFailed mit circuitBreakerActivated.
Während der Störung
Ab dem zweiten Fehler pausiert die Middleware die Delta-Abfrage für diesen Tenant (Schutzschalter, Wartezeit 1 Minute bis 1 Stunde steigend), um Log-Spam und Kontosperren zu vermeiden. Alle Outlook-Schreibvorgänge scheitern.
Wiederaufnahme
Nicht automatisch. Ein Secret muss erneuert werden.
Manuell nötig
Im Azure-Portal neues Secret erzeugen → Tenant bearbeiten → Client Secret ersetzen → Speichern → Testen. Ein erfolgreicher Test setzt den Schutzschalter zurück und stellt Dead-Letter-Einträge mit Auth-Fehlern automatisch wieder in die Warteschlange.

Webhooks kommen nicht an (öffentliche URL, Zertifikat, Reverse Proxy)

Erkennbar an
Vorgänge tragen die Quelle „Termin-Polling" oder „Outlook Delta" statt „Webhook". Änderungen brauchen 1 bis 5 Minuten statt Sekunden. Webhook-Status der Mappings inaktiv.
Während der Störung
Der Sync läuft weiter, nur langsamer. Die Middleware erkennt fehlende Webhooks (kein Eingang seit 5 Minuten) und bleibt automatisch im schnellen 60-Sekunden-Polling.
Wiederaufnahme
Automatisch, sobald die URL wieder erreichbar ist und die Subscriptions erneuert wurden (spätestens im 12-Stunden-Zyklus).
Manuell nötig
Ursache beim Reverse Proxy oder Zertifikat beheben, dann Webhooks erneuern. Beim Webhook der Terminsoftware zusätzlich URL und API-Key in deren Konfiguration prüfen.

Neustart oder Absturz der Middleware

Erkennbar an
Log-Zeile „Reset N stuck Processing items to Pending on startup". Nach dem Start sind alle Health-Anzeigen zunächst „unknown", bis erster Verkehr fließt.
Während der Störung
Eingehende Webhooks gehen verloren, solange der Dienst nicht läuft. Die Warteschlange in der Datenbank bleibt vollständig erhalten.
Wiederaufnahme
Automatisch. Docker startet den Container neu. Beim Start werden hängende Einträge zurück auf Pending gesetzt. Verpasste Änderungen holen Polling (ab Wasserzeichen) und Delta-Abfrage (ab Delta-Link) nach. EWS-Push-Subscriptions werden beim ersten Zyklus neu angelegt.
Manuell nötig
Normalerweise nichts. Nach längerem Stillstand den Sync Status prüfen.

Postfach oder Kalender in Microsoft 365 gelöscht

Erkennbar an
Fehler wie ErrorItemNotFound oder AADSTS50034 (User existiert nicht) bei allen Vorgängen einer Ressource.
Wiederaufnahme
Nicht automatisch.
Manuell nötig
Mapping auf ein anderes Postfach umstellen oder deaktivieren. Dead-Letter-Einträge danach erneut einreihen oder ignorieren.

Datenbank voll oder nicht erreichbar

Erkennbar an
Admin-Oberfläche liefert Fehler, Container-Log zeigt Datenbankfehler.
Wiederaufnahme
Der Warteschlangen-Dienst wartet bei Datenbankfehlern 5 Sekunden und versucht es erneut, ohne abzubrechen.
Manuell nötig
Speicherplatz schaffen, Datenbank-Container prüfen (Runbook §7).

Grenzen der Automatik: Ein von Microsoft verworfener Delta-Link wird nur protokolliert (DeltaQueryFailed), es gibt keinen automatischen Vollabgleich. In diesem Fall die betroffenen Kalender per Nachsynchronisierung (Sync Status) neu einlesen und bei Wiederholung den Techniker informieren.

7. Manuelle Eingriffe

AktionWoWirkung
Erneut einreihenSync Log, am EintragSetzt den Eintrag zurück auf Pending mit null Versuchen. Funktioniert auch bei Dead Letter. Vorher die Ursache beheben, sonst scheitert er erneut.
Initialer SyncSync StatusÜberträgt alle aktiven Termine der Terminsoftware eines Zeitraums nach Outlook, optional nur für ausgewählte Ressourcen. Bereits verknüpfte Termine werden übersprungen, außer „Bereits synchronisierte aktualisieren" ist gesetzt. Läuft sofort mit Fortschrittsanzeige. Einsatz: Ersteinrichtung, neues Mapping, Nachholen nach Datenverlust.
NachsynchronisierungSync StatusLiest die ausgewählten Outlook-Kalender komplett neu ein (1 Monat zurück bis 6 Monate voraus), indem der Delta-Link zurückgesetzt wird. Änderungen laufen über die Warteschlange. Idempotent — bereits Synchronisiertes bleibt unverändert. Einsatz: verpasste Outlook-Änderungen, verworfener Delta-Link, Kontrolle nach Störungen. Bei großen EWS-Kalendern kann der Lauf einige Minuten dauern.
Termin testenKalender-Mappings, Sync LogPrüft einen einzelnen Termin per Termin-UID Schritt für Schritt (Termin laden, Mapping finden, Anmeldung, Schreiben) und zeigt, wo es abbricht. Im Modus „Prüfen und schreiben" wird der Termin bei Erfolg sofort nach Outlook geschrieben und das Ergebnis gemeldet (erstellt, aktualisiert oder warum nicht).
Webhooks erneuernKalender-MappingsMeldet alle Subscriptions des Tenants ab und legt sie neu an. Erste Maßnahme bei verzögertem Sync von Outlook zur Terminsoftware oder nach Änderungen an Reverse Proxy oder Zertifikat.
TestenTenantsPrüft Kalender-Provider und API der Terminsoftware, bei Graph immer über ein Postfach (erste Zuordnung oder abgefragte Adresse). Setzt bei Erfolg den Auth-Schutzschalter zurück und stellt Dead-Letter-Einträge mit Auth-Fehlern automatisch wieder ein.
Mapping deaktivierenKalender-MappingsStoppt Polling, Delta-Abfrage und Webhook-Erneuerung für diese Ressource. Vorhandene Outlook-Termine und Sperrzeiten bleiben unverändert stehen.
Mapping löschenKalender-MappingsEntfernt nur die Zuordnung. Outlook-Termine, Sperrzeiten und die Subscription bei Microsoft werden nicht aufgeräumt.
Tenant deaktivierenTenants, BearbeitenSofortstopp aller Ein- und Ausgänge für den Mandanten. Daten bleiben erhalten, Subscriptions laufen innerhalb von 2 Tagen aus.
Tenant löschenTenantsLöscht Konfiguration, Azure-Zugangsdaten und Rollenzuordnungen. Nicht rückgängig zu machen, nur per Datenbank-Backup wiederherstellbar.
Export / ImportTenantsKonfiguration als JSON sichern oder auf eine andere Installation übertragen. Ohne Secrets, ohne Laufzeitdaten. Import mit Vorschau (Dry Run) und den Modi „merge" und „replace".

8. Benutzer und Rollen

RolleVergabeDarf
SuperAdminpro Benutzer, globalAlles: alle Tenants, Tenants anlegen und löschen, Benutzerverwaltung, Audit Log, Export und Import.
Tenant-Adminpro Benutzer und TenantZugewiesenen Tenant bearbeiten, Mappings anlegen und ändern, Syncs auslösen, Webhooks erneuern.
Read-Onlypro Benutzer und TenantZugewiesenen Tenant nur ansehen: Status und Sync Log. Keine Schreib-Knöpfe.
  • Ein Benutzer kann pro Tenant eine andere Rolle haben. Nicht zugewiesene Tenants sind für ihn unsichtbar.
  • Passwörter haben mindestens 10 Zeichen. Es gibt keinen E-Mail-Reset; ein SuperAdmin setzt ein temporäres Passwort.
  • Der Login ist pro IP-Adresse auf 10 Versuche in 5 Minuten begrenzt. Danach antwortet der Server mit „Too Many Requests".
  • Der API-Key in der appsettings.json schützt nur den Webhook-Eingang der Terminsoftware, nicht die Oberfläche.

9. Was tun, wenn …

SymptomErste Schritte
Termin aus der Terminsoftware fehlt in OutlookBis zu 5 Minuten warten (Polling). Sync Status: Warteschlange oder Fehler? Ist das Mapping der Ressource aktiv? Bei Bedarf „Termin testen" mit der Termin-UID.
Outlook-Termin blockiert die Terminsoftware nichtLiegt der Termin im gemappten Kalender (nicht in einem Unterkalender)? Status „gebucht", nicht „frei"? Webhook-Status prüfen, ggf. Webhooks erneuern.
Ganztagstermin blockiert die Terminsoftware nichtOutlook legt Ganztagstermine standardmäßig mit dem Status „frei" an. Auf „gebucht" umstellen, dann entsteht die Sperrzeit über den ganzen Tag.
Termin springt in Outlook zurückKein Fehler: Termine der Terminsoftware sind in Outlook schreibgeschützt. Änderungen dort vornehmen.
Sync dauert Minuten statt SekundenWebhooks fallen aus, das Polling übernimmt. Öffentliche URL, Zertifikat und Webhook-Konfiguration der Terminsoftware prüfen. Webhooks erneuern.
Viele Dead-Letter-Einträge mit gleichem FehlerSystematisches Problem: Fehlertext lesen. AADSTS → Secret erneuern. Timeout → Netz. 404/ErrorItemNotFound → Termin oder Postfach existiert nicht mehr.
Verbindungstest: „Postfach erforderlich"Kein Fehler: Für Graph gibt es ohne Zuordnung keinen zulässigen Aufruf. Im Dialog ein freigegebenes Postfach eingeben oder zuerst eine Kalender-Zuordnung anlegen.
Verbindungstest: 403 / „Access is denied"Das Postfach ist nicht von der ApplicationAccessPolicy der App abgedeckt. Techniker: Test-ApplicationAccessPolicy ausführen, Postfach der Policy-Gruppe hinzufügen, bis zu 30 Minuten warten.
Verbindungstest: „Key not found in key ring"Der Verschlüsselungsschlüssel (Volume cs_dpkeys) fehlt. Secret im Tenant neu eintippen und speichern; das verschlüsselt mit dem aktuellen Schlüssel neu.
Anmeldung schlägt fehlSuperAdmin setzt das Passwort im Tab Benutzer zurück. Gar kein Zugang mehr: Bootstrap-Admin (Kapitel 4, Schritt 1) über den Techniker.
Tenant oder Knöpfe fehlen in der OberflächeRolle prüfen. Read-Only sieht keine Schreib-Knöpfe, nicht zugewiesene Tenants sind unsichtbar.
Alles rot, nichts synctTerminsoftware erreichbar? Azure-Secret abgelaufen? Container läuft? Techniker mit Runbook einbeziehen.

Für alles, was Serverzugriff erfordert (Container-Logs, Neustart, Datenbank, Konfigurationsdateien), gilt: Techniker kontaktieren. Die Prozeduren stehen im Operations-Runbook des Projekts.

10. Glossar

TenantEin Mandant der Terminsoftware mit eigener URL, eigenem API-Key und eigener Microsoft-Anbindung.
RessourceBuchbare Einheit in der Terminsoftware: Mitarbeiter, Raum oder Gerät.
MappingZuordnung einer Ressource zu genau einem Outlook-Kalender eines Postfachs.
SperrzeitZeitraum, in dem eine Ressource in der Terminsoftware nicht buchbar ist. Wird aus Outlook-Terminen erzeugt.
WebhookSofortige Benachrichtigung eines Systems an ein anderes über eine Änderung (Push).
SubscriptionBei Microsoft registrierte Anmeldung für Webhooks zu einem Kalender. Läuft bei Graph nach 2 Tagen ab und wird automatisch erneuert.
PollingRegelmäßiges aktives Nachfragen bei der Terminsoftware nach geänderten Terminen (Sicherheitsnetz).
Delta-AbfrageRegelmäßiges Abholen aller Kalenderänderungen bei Microsoft seit dem letzten bekannten Stand (Sicherheitsnetz).
Warteschlange / QueueDauerhafte Liste aller zu verarbeitenden Vorgänge in der Datenbank.
AufbewahrungsfristZeitraum, nach dem die Middleware alte Protokolldaten selbsttätig löscht. Einstellbar je Datenart, siehe Datenbereinigung.
Dead LetterVorgang, der nach 5 Versuchen endgültig fehlgeschlagen ist und nur noch manuell neu gestartet wird.
Schutzschalter (Circuit Breaker)Automatische Pause der Microsoft-Abfragen eines Tenants nach wiederholten Anmeldefehlern.
Graph / EWSDie beiden Microsoft-Schnittstellen für Kalenderzugriff: Microsoft Graph (Microsoft 365) und Exchange Web Services (Exchange Online oder On-Premises).
Bootstrap-AdminDer beim ersten Start automatisch angelegte SuperAdmin.

← Zurück zur Admin-Oberfläche