Automatisierungen
Richten Sie triggerbasierte E-Mail-Sequenzen ein, die automatisch basierend auf Abonnentenverhalten ausgeführt werden
Mit Automatisierungen können Sie mehrstufige E-Mail-Sequenzen erstellen, die durch Abonnenten-Events ausgelöst werden. Definieren Sie einen Trigger, erstellen Sie eine Abfolge von Schritten, und MailLand führt den Ablauf automatisch aus, sobald der Trigger auslöst.
Automatisierungs-Trigger
Jede Automatisierung beginnt mit einem einzelnen Trigger:
| Trigger | Wert | Beschreibung |
|---|---|---|
SubscriberJoins | 0 | Abonnent wird einer Mailingliste hinzugefügt |
SubscriberUpdated | 1 | Abonnentenprofil wird aktualisiert |
CampaignOpened | 2 | Abonnent öffnet eine bestimmte Kampagne |
CampaignClicked | 3 | Abonnent klickt einen Link in einer Kampagne |
DateBased | 4 | Nur Geburtstags-Trigger: wertet Subscriber.Birthday aus (siehe Hinweis unten) |
DateBased wertet ausschließlich Subscriber.Birthday aus, nicht ein beliebiges wiederkehrendes Datumsfeld. Birthday lässt sich über POST/PUT /v1/marketing/subscribers setzen (siehe Abonnenten-Seite) sowie über den CSV-Import, der eine optionale birthday-Spalte akzeptiert, sodass eine DateBased-Automatisierung jeden Abonnenten einschreibt, dessen Geburtstag auf einem der beiden Wege gesetzt wurde.
| Manual | 5 | Manuell über API ausgelöst |
Automatisierungsstatus
| Status | Wert | Beschreibung |
|---|---|---|
Draft | 0 | Bearbeitbar, läuft nicht |
Active | 1 | Aktiv: neue Abonnenten werden bei Triggerauslösung aufgenommen |
Paused | 2 | Pausiert: keine neuen Aufnahmen, und weitere Schritte stoppen für bereits eingeschriebene Abonnenten. Erneutes Aktivieren (Active) setzt sie genau dort fort, wo sie angehalten wurden, und liefert alles nach, was während der Pause fällig wurde |
Archived | 3 | Archiviert: in Standardansichten ausgeblendet. Wie Paused stoppt dies neue Einschreibungen; weitere Schritte stoppen auch für bereits eingeschriebene Abonnenten. Es gibt keinen Endpunkt zum Dearchivieren, dieser Stopp ist für diese Einschreibungen also dauerhaft |
Schritttypen
Jede Automatisierung enthält eine geordnete Abfolge von Schritten:
| Schritttyp | Wert | Beschreibung |
|---|---|---|
SendEmail | 0 | Eine E-Mail an den Abonnenten senden |
Wait | 1 | Eine bestimmte Dauer warten, bevor es weitergeht |
Condition | 2 | Wertet ein Abonnentenfeld aus; ein Gate, das bei „wahr" fortfährt und bei „falsch" die Einschreibung beendet (siehe Condition-Schritt weiter unten) |
AddToList | 3 | Abonnent einer Mailingliste hinzufügen |
RemoveFromList | 4 | Abonnent aus einer Mailingliste entfernen |
UpdateSubscriber | 5 | Abonnentenfelder aktualisieren |
Webhook | 6 | Einen Webhook an eine externe URL senden |
Personalisierung
Automatisierungs-E-Mail-Schritte unterstützen {{variable}}-Merge-Tags, die pro Empfänger durch den Datensatz des eingeschriebenen Abonnenten ersetzt werden.
| Tag | Wert |
|---|---|
{{firstName}} | Vorname des Abonnenten |
{{lastName}} | Nachname des Abonnenten |
{{fullName}} | Vor- und Nachname zusammen |
{{email}} | E-Mail-Adresse des Abonnenten |
{{subscriberId}} | Undurchsichtige Abonnenten-ID |
{{custom_<field>}} | Jedes benutzerdefinierte Feld des Abonnenten, auch verfügbar als {{<field>}} |
<p>Hi {{firstName}}, here's what's new this month.</p>Ein Tag ohne Wert bleibt genau so stehen, wie er geschrieben wurde: {{firstName}} bleibt für einen Abonnenten ohne Vornamen in der zugestellten E-Mail als {{firstName}} bestehen, statt zu einer leeren Lücke zu werden. Schreiben Sie Inhalte, die in beiden Fällen korrekt gelesen werden. Verwenden Sie eine Ausweich-Anrede, wenn Sie nicht sicher sind, dass jeder Abonnent das Feld hat.
Werte werden je nach Zielbereich escaped: HTML-Inhalt wird HTML-escaped, während Betreffzeile und Klartext-Body niemals escaped werden, Ben & Jerry's bleibt genau so.
Die älteren Snake-Case-Schreibweisen ({{first_name}}, {{last_name}}, {{full_name}}, {{subscriber_id}}) funktionieren weiterhin als Aliase.
Automatisierung erstellen
POST https://api.mail.land/v1/marketing/automations{
"name": "Welcome Series",
"description": "3-email welcome sequence for new subscribers",
"trigger": 0,
"mailingListId": "7h3n5k8w2q9m1t",
"campaignId": null,
"steps": [
{
"type": 0,
"order": 1,
"templateId": "2p9x4k7m3q8n1z",
"subject": "Welcome to our newsletter!"
},
{
"type": 1,
"order": 2,
"delayMinutes": 1440
},
{
"type": 0,
"order": 3,
"templateId": "9k4p2x7m1q3n8z"
}
]
}| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | Ja | Automatisierungsname (eindeutig pro Workspace) |
description | string | Nein | Automatisierungsbeschreibung |
trigger | int | Ja | Triggertyp (siehe Trigger-Tabelle) |
mailingListId | string | Nein | Ziel-Mailingliste für den Trigger |
campaignId | string | Nein | Optional für CampaignOpened / CampaignClicked Trigger: wenn weggelassen, löst der Trigger bei jeder Kampagne aus, nicht nur bei einer |
steps | array | Ja | Geordnete Abfolge von Schritten |
Es gibt kein segmentId-Feld bei einer Automatisierung: dieses Feld existiert hier nicht (Segmente werden anderswo verwendet, z. B. bei Kampagnen). Der Inhalt eines SendEmail-Schritts stammt aus templateId, nicht aus inline htmlContent/textContent/fromName/fromEmail.
campaignId ist bei den Öffnen-/Klick-Triggern optional, nicht erforderlich, wie frühere Versionen dieser Seite angaben. Der Trigger löst außerdem bei maschinellen Öffnungen aus (Apple Mail Privacy Protection Prefetch, Sicherheits-Link-Scanner), die MailLand heute nicht herausfiltert.
Schrittfelder
Jeder Schritt hat tatsächlich die Form { order, type, delayMinutes, templateId, subject, settings: {} }: es gibt kein segmentId auf Automatisierungsebene, und Schritte haben nicht die typspezifischen Felder, die in früheren Versionen dieser Seite gezeigt wurden (conditionField, targetMailingListId, updateField, webhookUrl, fromName, fromEmail, replyTo sind keine Top-Level-Schrittfelder). Die folgenden Tabellen zeigen die tatsächliche Form.
SendEmail-Schritt (type: 0):
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | int | Ja | 0 |
order | int | Ja | Position des Schritts in der Sequenz |
delayMinutes | int | Nein | Minuten Wartezeit, bevor dieser Schritt läuft: auch wenn er der erste Schritt ist: die Verzögerung vor dem allerersten Versand wird jetzt bei der Einschreibung berücksichtigt (früher wurde sie ignoriert) |
templateId | string | Ja | Vorlage, die den E-Mail-Inhalt liefert: der Inhalt stammt ausschließlich aus der Vorlage |
subject | string | Nein | Überschreibt den Betreff der Vorlage, wenn gesetzt |
Es gibt keinen inline htmlContent/textContent/fromName/fromEmail/replyTo bei einem Schritt. Der Absender ist fest auf noreply@<erste vollständig verifizierte Domain> eingestellt und wird mit dem Workspace-Namen angezeigt, nicht pro Schritt konfigurierbar.
templateId ist bei jedem SendEmail-Schritt erforderlich. Erstellungs-/Aktualisierungsanfragen ohne templateId werden mit 400 VALIDATION_FAILED abgelehnt; eine templateId, die auf keine Vorlage im eigenen Tenant verweist, wird mit 400 TEMPLATE_NOT_FOUND abgelehnt, beides, bevor irgendetwas gespeichert wird. Wird eine Vorlage nach dem Speichern der Automatisierung gelöscht, wird die Einschreibung des nächsten Abonnenten, der diesen Schritt erreicht, als Failed markiert statt den Schritt stillschweigend zu überspringen, und sie zählt zum totalFailed-Wert der Automatisierung (siehe Automatisierungsdetails abrufen).
Wait-Schritt (type: 1):
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | int | Ja | 1 |
order | int | Ja | Position des Schritts |
delayMinutes | int | Ja | Minuten Wartezeit vor dem nächsten Schritt |
Condition-Schritt (type: 2):
Ein Condition-Schritt ist ein Gate, keine Verzweigung: Eine lineare Schrittliste hat keinen zweiten
Pfad. Bei wahr fährt die Einschreibung mit dem nächsten Schritt fort. Bei falsch endet die
Einschreibung dort (Completed), und kein späterer Schritt läuft für diesen Abonnenten.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | int | Ja | 2 |
order | int | Ja | Position des Schritts |
settings.conditionField | string | Ja | Das zu prüfende Abonnentenfeld: email, firstName, lastName, phone, company, source oder custom_<name> für ein benutzerdefiniertes Feld |
settings.conditionOperator | string | Ja | equals, notEquals, contains, notContains, startsWith, endsWith, isEmpty, isNotEmpty (Groß-/Kleinschreibung wird ignoriert) |
settings.conditionValue | string | Erforderlich außer bei isEmpty/isNotEmpty | Der Vergleichswert |
Vergleiche erfolgen als case-insensitive String-Vergleiche, dieselben Operatoren, die Segmente bereits
anbieten. 400 VALIDATION_FAILED wird bei Erstellung/Aktualisierung zurückgegeben, wenn conditionField
unbekannt ist, conditionOperator keiner der obigen Werte ist, oder conditionValue bei einem
Operator fehlt, der einen Wert benötigt.
Ein Condition-Schritt, der vor Einführung dieser Validierung gespeichert wurde (dessen Einstellungen sich also nicht auswerten lassen), läuft aus Kontinuitätsgründen unverändert durch, validiert werden nur neue Erstellungs-/Aktualisierungsanfragen.
AddToList- / RemoveFromList-Schritte (type: 3, 4):
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | int | Ja | 3 oder 4 |
order | int | Ja | Position des Schritts |
settings.mailingListId | string | Ja | Mailingliste zum Hinzufügen/Entfernen des Abonnenten, gelesen aus settings |
UpdateSubscriber-Schritt (type: 5):
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | int | Ja | 5 |
order | int | Ja | Position des Schritts |
settings | object | Ja | Jeder Schlüssel in settings wird als benutzerdefiniertes Feld beim Abonnenten geschrieben |
Webhook-Schritt (type: 6):
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
type | int | Ja | 6 |
order | int | Ja | Position des Schritts |
settings.url | string | Ja | URL für den POST-Request, gelesen aus settings |
Anfragen von Webhook-Schritten werden mit einem Geheimnis des Empfängers des Schritts signiert (X-MLND-Signature, Prüfung wie bei Kunden-Webhooks): Jede eigene Schritt-URL hat ihr eigenes Geheimnis, sodass kein Empfänger für einen anderen signieren kann. Lesen Sie die Geheimnisse mit GET /v1/marketing/automations/{id}/webhook-signing-secrets und erneuern Sie sie mit POST /v1/marketing/automations/{id}/webhook-signing-secrets/regenerate, siehe Versionierung. Senden Sie { "webhookUrl": "…" }, um nur einen Empfänger zu rotieren.
curl -X POST https://api.mail.land/v1/marketing/automations \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Series",
"trigger": 0,
"mailingListId": "7h3n5k8w2q9m1t",
"steps": [
{
"type": 0, "order": 1,
"subject": "Welcome!",
"templateId": "2p9x4k7m3q8n1z"
},
{ "type": 1, "order": 2, "delayMinutes": 1440 },
{
"type": 0, "order": 3,
"subject": "Getting started",
"templateId": "9k4p2x7m1q3n8z"
}
]
}'Antwort
{
"id": "4f8k2m9p1q6z3s",
"name": "Welcome Series",
"description": "3-email welcome sequence for new subscribers",
"trigger": "subscriberJoins",
"triggerName": "SubscriberJoins",
"status": "draft",
"statusName": "Draft",
"mailingListId": "7h3n5k8w2q9m1t",
"mailingListName": "Product Updates",
"campaignId": null,
"campaignName": null,
"stepsCount": 3,
"totalEnrolled": 0,
"totalCompleted": 0,
"activatedAt": null,
"createdAt": "2026-02-17T12:00:00Z",
"updatedAt": "2026-02-17T12:00:00Z"
}Es gibt kein segmentId/segmentName-Feld bei einer Automatisierung, und die Aufnahmezähler heißen totalEnrolled/totalCompleted (nicht totalEnrollments/activeEnrollments/completedEnrollments). Die Detailantwort fügt außerdem steps (die vollständige Schrittliste), completionRate und totalFailed hinzu: Einschreibungen, die einen SendEmail-Schritt ohne Vorlage im Tenant erreicht haben (fehlend oder inzwischen gelöscht).
Automatisierungen auflisten
GET https://api.mail.land/v1/marketing/automations| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
cursor | string | - | Opaker Cursor aus dem nextCursor der vorherigen Seite. Für die erste Seite weglassen. |
limit | int | 20 | Einträge pro Seite |
search | string | - | Nach Name suchen |
status | int | - | Nach Automatisierungsstatus filtern |
trigger | int | - | Nach Triggertyp filtern |
mailingListId | string | - | Nach Mailingliste filtern |
sortBy | string | - | Sortierfeld |
sortDesc | bool | false | Absteigend sortieren |
curl https://api.mail.land/v1/marketing/automations \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Automatisierungsdetails abrufen
GET https://api.mail.land/v1/marketing/automations/{id}Gibt die vollständige Automatisierung einschließlich aller Schritte zurück:
curl https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"id": "4f8k2m9p1q6z3s",
"name": "Welcome Series",
"description": "3-email welcome sequence for new subscribers",
"trigger": "subscriberJoins",
"triggerName": "SubscriberJoins",
"status": "active",
"statusName": "Active",
"mailingListId": "7h3n5k8w2q9m1t",
"mailingListName": "Product Updates",
"campaignId": null,
"campaignName": null,
"stepsCount": 3,
"totalEnrolled": 230,
"totalCompleted": 200,
"totalFailed": 4,
"activatedAt": "2026-01-10T08:05:00Z",
"steps": [
{
"order": 1,
"type": "sendEmail",
"typeName": "SendEmail",
"delayMinutes": null,
"templateId": "2p9x4k7m3q8n1z",
"subject": "Welcome to our newsletter!",
"settings": null
},
{
"order": 2,
"type": "wait",
"typeName": "Wait",
"delayMinutes": 1440,
"templateId": null,
"subject": null,
"settings": null
},
{
"order": 3,
"type": "sendEmail",
"typeName": "SendEmail",
"delayMinutes": null,
"templateId": "9k4p2x7m1q3n8z",
"subject": "Getting started with MailLand",
"settings": null
}
],
"completionRate": 86.96,
"createdAt": "2026-01-10T08:00:00Z",
"updatedAt": "2026-02-17T12:00:00Z"
}Automatisierung aktualisieren
PUT https://api.mail.land/v1/marketing/automations/{id}Jeder Status außer Active kann aktualisiert werden (nicht nur Draft/Paused). Der Anfragekörper entspricht der Erstellungsanfrage.
curl -X PUT https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Series",
"trigger": 0,
"mailingListId": "7h3n5k8w2q9m1t",
"steps": [
{
"type": 0, "order": 1,
"subject": "Welcome!",
"templateId": "2p9x4k7m3q8n1z"
},
{ "type": 1, "order": 2, "delayMinutes": 1440 },
{
"type": 0, "order": 3,
"subject": "Getting started",
"templateId": "9k4p2x7m1q3n8z"
}
]
}'Automatisierung aktivieren
POST https://api.mail.land/v1/marketing/automations/{id}/activateÜberführt die Automatisierung von Draft oder Paused in den Status Active. Sobald sie aktiv ist, beginnt die Automatisierung mit der Aufnahme von Abonnenten, wenn der Trigger auslöst.
Die Aktivierung selbst wird nicht gegen die Domain-Verifizierung geprüft. Ein SendEmail-Schritt, der ohne vollständig verifizierte Domain erreicht wird, wird zurückgehalten, nicht übersprungen: Er wird in wachsenden Abständen erneut geprüft (15 Minuten, dann bis zu alle 6 Stunden) und wird zugestellt, sobald eine Domain verifiziert ist. Verifiziert sich innerhalb von 7 Tagen ab dem ersten Fälligwerden des Schritts keine Domain, wird die Einschreibung als Failed markiert (zählt zu totalFailed), statt endlos zu warten: die Aktivierung ohne verifizierte Domain gelingt also, aber nichts wird zugestellt, bis Sie eine Domain verifizieren, und Einschreibungen, die nach einer Woche noch warten, enden statt unbegrenzt zu halten.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/activate \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Automatisierung pausieren
POST https://api.mail.land/v1/marketing/automations/{id}/pausePausiert die Automatisierung. Es werden keine neuen Abonnenten aufgenommen, und Abonnenten, die sich bereits in der Sequenz befinden, kommen nicht weiter: jede Einschreibung hält an ihrem aktuellen Schritt an. Erneutes Aktivieren der Automatisierung setzt jede angehaltene Einschreibung dort fort, wo sie stand, und liefert alles nach, was während der Pause fällig wurde.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/pause \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Automatisierung archivieren
POST https://api.mail.land/v1/marketing/automations/{id}/archiveArchiviert die Automatisierung, was aus jedem Status heraus möglich ist, einschließlich Active. Archivierte Automatisierungen werden in Standardlistenansichten ausgeblendet.
Archivieren stoppt sowohl neue Aufnahmen als auch weitere Schritte für bereits aufgenommene Abonnenten: jede Einschreibung hält an ihrem aktuellen Schritt an, genau wie bei Pausieren. Anders als bei Pausieren gibt es keinen Endpunkt, der eine Archived-Automatisierung reaktiviert, dieser Stopp löst sich also nicht von selbst.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/archive \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Automatisierung duplizieren
POST https://api.mail.land/v1/marketing/automations/{id}/duplicate?name=Copy%20of%20Welcome%20SeriesErstellt eine neue Draft-Automatisierung mit kopierten Schritten und Einstellungen. Der Abfrageparameter name ist optional.
curl -X POST "https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/duplicate?name=Copy%20of%20Welcome%20Series" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Manuell auslösen
POST https://api.mail.land/v1/marketing/automations/{id}/trigger{
"subscriberIds": ["3m8k1p9x4q7n2z", "6q2n9k4x1p8m3z", "1x7m3q8k2n9p4z"]
}Nehmen Sie bestimmte Abonnenten manuell in die Automatisierung auf. Die Automatisierung muss den Status Active haben und ihr Triggertyp muss Manual (5) sein.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/trigger \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"subscriberIds": ["3m8k1p9x4q7n2z", "6q2n9k4x1p8m3z", "1x7m3q8k2n9p4z"]}'Aufnahme-Tracking
Der Fortschritt jedes Abonnenten durch die Automatisierung wird als Aufnahme verfolgt:
| Status | Wert | Beschreibung |
|---|---|---|
Active | 0 | Durchläuft aktuell die Schritte |
Paused | 1 | Aufnahme pausiert |
Completed | 2 | Alle Schritte abgeschlossen |
Failed | 3 | Ein SendEmail-Schritt hat keine Vorlage in diesem Tenant: von Anfang an fehlend oder inzwischen gelöscht. Wird im totalFailed-Wert der Automatisierung gezählt |
Unsubscribed | 4 | Abonnent hat sich während der Sequenz abgemeldet |
Es gibt keinen Aufnahmestatus Cancelled. Die Automatisierungsdetail-Antwort enthält aggregierte Aufnahmezahlen als totalEnrolled und totalCompleted (nicht totalEnrollments/activeEnrollments/completedEnrollments/failedEnrollments).
Automatisierung löschen
DELETE https://api.mail.land/v1/marketing/automations/{id}Löscht die Automatisierung, ihre Schritte und Aufnahmedaten dauerhaft.
Aktualisieren und Löschen sind für jeden Status außer Active erlaubt: nicht nur Draft/Paused (Aktualisierung) oder Draft/Archived (Löschung), wie frühere Versionen dieser Seite angaben.
curl -X DELETE https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Fehlerantworten
| Status | Code | Beschreibung |
|---|---|---|
400 | VALIDATION_FAILED | Erforderliche Felder fehlen oder ungültige Schrittkonfiguration: auch ein SendEmail-Schritt ohne templateId oder ein Condition-Schritt mit nicht auswertbaren settings |
400 | TEMPLATE_NOT_FOUND | Die templateId eines SendEmail-Schritts verweist auf keine Vorlage im eigenen Tenant |
400 | INVALID_REQUEST | Automatisierungsname existiert bereits oder ungültiger Statusübergang |
403 | FORBIDDEN | Unzureichende Berechtigungen |
404 | RESOURCE_NOT_FOUND | Automatisierung nicht gefunden, oder der Statusübergang ist ungültig (Aktualisierung/Aktivierung/Pausierung im falschen Status, Löschung einer Active-Automatisierung) |
Die Automatisierungs-Endpunkte geben nie 422 zurück.
Nächste Schritte
- Kampagnen: Einmalige Kampagnen versenden
- Abonnenten: Kontakte verwalten, die Automatisierungen ansprechen
- Listen: Abonnenten in Listen für Trigger organisieren