EINE AUTOMATISIERUNG IST AUSLÖSER PLUS SCHRITTE. Der Auslöser (`trigger`) sagt, wann ein Gast startet: bei einem Ereignis (`GUEST_CREATED`, `NEWSLETTER_CONFIRMED`, Reservierung angelegt, bestätigt, storniert, nicht erschienen, abgeschlossen) oder zu einer Zeit (`BIRTHDAY` mit `daysBefore` und `hour`, `SCHEDULE` mit `frequency`, `hour` und `listId`, `INACTIVITY` mit `days` und `hour`). Ereignis- und Zeitauslöser dürfen einen Zielgruppenfilter (`filter`) im Format der Listen-Bedingungen tragen.
DIE SCHRITTE (`definition.steps`) laufen der Reihe nach: `SEND_EMAIL`/`SEND_SMS` mit `templateId` (Vorlage des passenden Kanals), `WAIT` mit `amount` und `unit` (`MINUTES`, `HOURS`, `DAYS`, zusammen höchstens 365 Tage), `CONDITION` mit `conditions` und den Zweigen `then`/`else`, `GET_DATA` (Reservierungsdaten für Platzhalter), `ADD_TAG`/`REMOVE_TAG` mit `tag`, `EXIT`. Jede Schritt-`id` ist eindeutig; höchstens 60 Schritte und fünf Verzweigungsebenen. In Bedingungen stehen zusätzlich die `ctx.`-Felder zur Verfügung (Personen, Status und Bereich der auslösenden Reservierung, ob die letzte Nachricht geöffnet oder geklickt wurde).
ARBEITSSTAND UND VERSION. `POST` legt einen ENTWURF (`DRAFT`) an, `PATCH` ändert den Arbeitsstand. Wirksam wird er erst mit `POST …/activate`: das friert Auslöser und Schritte als neue Version ein (`version` steigt) und setzt den Status auf `ACTIVE`. Laufende Durchläufe arbeiten mit IHRER Version weiter. Ändern Sie eine aktive Automatisierung, zeigt `hasUnpublishedChanges: true`, dass der Arbeitsstand noch nicht gilt — bis zum nächsten `…/activate`. Name, Beschreibung und `reentryDays` gelten sofort — ein neuer `reentryDays` an einer schon aktivierten Automatisierung ändert deshalb, wer künftig startet, und verlangt `action:marketing.send` (sonst 403 `forbidden_action`, `reason: "marketing-flow-reentry-live"`).
AKTIVIEREN LÖST WERBUNG AUS und verlangt deshalb dieselbe Handlung wie das Senden einer Kampagne: `action:marketing.send`, dazu Pflicht-`Idempotency-Key` und eine Bremse von 60 Aktivierungen je zehn Minuten und Betrieb, gemeinsam gezählt mit Aktivieren und Pausieren im Dashboard (429 mit `Retry-After`). Nachrichten bekommen nur Gäste mit bestätigter Einwilligung für den Kanal; die Sperrliste gilt wie bei Kampagnen. `PAUSED` heisst: keine neuen Starts, laufende Durchläufe warten. Pausieren braucht keine Handlung und hat keine eigene Bremse — ein Notstopp darf nicht an einem Kontingent scheitern.
TAGS SIND GASTDATEN. Enthält eine Automatisierung `ADD_TAG` oder `REMOVE_TAG`, braucht der Schlüssel zum Anlegen, Ändern und Aktivieren zusätzlich `guests:write` — sonst 403 mit `module: "guests"`.
WIEDEREINTRITT: `reentryDays: null` heisst „jeder Gast nur einmal"; eine Zahl ist der Mindestabstand in Tagen zwischen zwei Starts desselben Gastes. Geburtstagsgrüsse brauchen den Geburtstag am Gast (`birthday` in `/api/v1/guests`).
LÖSCHEN bricht laufende Durchläufe ab (`canceledRuns`) und überspringt noch nicht versendete Nachrichten (`skippedMessages`). Bereits versendete Nachrichten bleiben im Protokoll des Gastes.