MailLandDocs
Marketing

Kampagnen

Erstellen, planen und versenden Sie E-Mail-Marketing-Kampagnen mit Tracking und Analysen

Erstellen und verwalten Sie E-Mail-Marketing-Kampagnen. MailLand übernimmt die Empfängerauswahl, den Versand, das Zustellungs-Tracking und die Engagement-Analysen für jede Kampagne.

Kampagnen-Lebenszyklus

Jede Kampagne durchläuft einen definierten Statusablauf:

StatusWertBeschreibung
Draft0Ausgangszustand: bearbeitbar, noch nicht versendet
Scheduled1Für zukünftige Zustellung in der Warteschlange
Sending2Wird aktuell an Empfänger versendet
Sent3Alle Empfänger verarbeitet
Paused4Versand während der Ausführung pausiert
Cancelled5Versand abgebrochen
Failed6Systemfehler beim Versand

Erlaubte Übergänge:

  • Draft → Scheduled (planen) oder Sending (sofort senden) oder Cancelled (abbrechen)
  • Scheduled → Sending oder Cancelled: eine Neuplanung einer Scheduled-Kampagne wird nicht unterstützt
  • Sending → Sent, Paused, Cancelled oder Failed
  • Paused → Sending (fortsetzen)
  • Sent oder Cancelled → archiviert

Kampagnentypen

TypWertBeschreibung
Regular0Standard-Einmalkampagne
Automated1Durch Automatisierungen ausgelöst
ABTest2A/B-Test-Kampagne

Personalisierung

Kampagnenbetreffzeilen und -inhalte unterstützen {{variable}}-Merge-Tags, die pro Empfänger durch den jeweiligen Datensatz des Abonnenten ersetzt werden.

TagWert
{{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>}}
Personalisierter Kampagneninhalt
<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, z. B. ist Hi there{{firstName}} ungeeignet, aber "Your account" ist sicher. 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 (sodass ein Name mit & oder < Ihr Markup nicht brechen kann), 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.

Kampagne erstellen

Der Workspace muss Business Verified sein, bevor eine Kampagne erstellt oder aktualisiert werden kann: eine frühere, separate Prüfung vor der fromEmail-Prüfung unten. Ist das nicht der Fall, schlägt die Anfrage mit 400 INVALID_REQUEST fehl ("Marketing campaigns require Business Verified status…").

Die fromEmail-Domain muss bereits hinzugefügt und vollständig verifiziert (SPF + DKIM + DMARC) sein, und zwar zum Zeitpunkt der Erstellung und Aktualisierung: sonst wird die Anfrage abgelehnt (400/404). Diese Prüfung erfolgt hier, nicht beim Senden, siehe Sofort senden.

POST https://api.mail.land/v1/marketing/campaigns
Create campaign request
{
  "name": "February Newsletter",
  "subject": "What's new in February",
  "previewText": "Product updates and tips",
  "fromName": "MailLand Team",
  "fromEmail": "[email protected]",
  "replyTo": "[email protected]",
  "htmlContent": "<html>...</html>",
  "textContent": "Plain text version...",
  "type": 0,
  "mailingListId": "ddv6ou6kz4wbto",
  "segmentId": "x4xa3ep1zmqq0b"
}
FeldTypErforderlichBeschreibung
namestringJaName der Kampagne
subjectstringJaE-Mail-Betreff
previewTextstringNeinVorschautext im Posteingang
fromNamestringJaAnzeigename des Absenders
fromEmailstringJaE-Mail-Adresse des Absenders
replyTostringNeinAntwortadresse
htmlContentstringJaHTML-E-Mail-Text
textContentstringNeinNur-Text-Fallback
templateIdstringNeinZu verwendende Vorlagen-ID
typeintNeinKampagnentyp (Standard: 0 Regular)
mailingListIdstringNein*Ziel-Mailingliste
segmentIdstringNein*Zielsegment

* Geben Sie mailingListId oder segmentId an: eines von beiden ist erforderlich, sofern nicht templateId gesetzt ist.

Create a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "February Newsletter",
    "subject": "What'\''s new in February",
    "fromName": "MailLand Team",
    "fromEmail": "[email protected]",
    "htmlContent": "<html><body><h1>Hello!</h1></body></html>",
    "mailingListId": "ddv6ou6kz4wbto"
  }'

Antwort

Campaign response
{
  "id": "uivozyvucowj9w",
  "name": "February Newsletter",
  "subject": "What's new in February",
  "previewText": "Product updates and tips",
  "fromName": "MailLand Team",
  "fromEmail": "[email protected]",
  "status": "draft",
  "statusName": "Draft",
  "type": 0,
  "typeName": "Regular",
  "mailingListId": "ddv6ou6kz4wbto",
  "mailingListName": "Main Newsletter",
  "segmentId": null,
  "segmentName": null,
  "createdAt": "2026-02-17T12:00:00Z",
  "updatedAt": "2026-02-17T12:00:00Z"
}

Kampagnen auflisten

GET https://api.mail.land/v1/marketing/campaigns
ParameterTypStandardBeschreibung
cursorstring-Opaker Cursor aus dem nextCursor der vorherigen Seite. Für die erste Seite weglassen.
limitint20Einträge pro Seite (max. 100)
searchstring-Nach Name suchen
statusint-Nach CampaignStatus filtern
typeint-Nach CampaignType filtern
mailingListIdstring-Nach Mailingliste filtern
sortBystring-Sortierfeld
sortDescboolfalseAbsteigende Sortierung
includeArchivedboolfalseArchivierte Kampagnen einschließen
List campaigns
curl "https://api.mail.land/v1/marketing/campaigns?limit=20&status=3" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Campaign list response
{
  "items": [
    {
      "id": "uivozyvucowj9w",
      "name": "February Newsletter",
      "subject": "What's new in February",
      "status": "sent",
      "statusName": "Sent",
      "type": 0,
      "typeName": "Regular",
      "mailingListId": "ddv6ou6kz4wbto",
      "mailingListName": "Main Newsletter",
      "totalRecipients": 5000,
      "totalSent": 4980,
      "totalDelivered": 4900,
      "totalOpened": 1520,
      "totalClicked": 195,
      "totalBounced": 45,
      "totalUnsubscribed": 12,
      "sentAt": "2026-02-15T10:00:00Z",
      "completedAt": "2026-02-15T10:35:00Z",
      "createdAt": "2026-02-14T08:00:00Z"
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

Kampagnendetails abrufen

GET https://api.mail.land/v1/marketing/campaigns/{id}

Gibt das vollständige CampaignDetailDto zurück, einschließlich HTML-Inhalt, aller Statistiken und berechneter Engagement-Raten:

Get campaign details
curl https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Campaign detail response
{
  "id": "uivozyvucowj9w",
  "name": "February Newsletter",
  "subject": "What's new in February",
  "previewText": "Product updates and tips",
  "fromName": "MailLand Team",
  "fromEmail": "[email protected]",
  "replyTo": "[email protected]",
  "status": "sent",
  "statusName": "Sent",
  "type": 0,
  "typeName": "Regular",
  "htmlContent": "<html>...</html>",
  "textContent": "Plain text...",
  "mailingListId": "ddv6ou6kz4wbto",
  "mailingListName": "Main Newsletter",
  "totalRecipients": 5000,
  "totalSent": 4980,
  "totalDelivered": 4900,
  "totalOpened": 1520,
  "totalClicked": 195,
  "totalBounced": 45,
  "totalUnsubscribed": 12,
  "totalComplaints": 2,
  "deliveryRate": 98.39,
  "openRate": 31.02,
  "clickRate": 3.98,
  "clickToOpenRate": 12.83,
  "bounceRate": 0.9,
  "unsubscribeRate": 0.24,
  "openTrackingEnabled": true,
  "clickTrackingEnabled": true,
  "sentAt": "2026-02-15T10:00:00Z",
  "completedAt": "2026-02-15T10:35:00Z",
  "createdAt": "2026-02-14T08:00:00Z",
  "updatedAt": "2026-02-15T10:35:00Z"
}

Engagement-Raten

RateFormel
deliveryRatetotalDelivered / totalSent * 100
openRatetotalOpened / totalDelivered * 100
clickRatetotalClicked / totalDelivered * 100
clickToOpenRatetotalClicked / totalOpened * 100
bounceRatetotalBounced / totalSent * 100
unsubscribeRatetotalUnsubscribed / totalDelivered * 100

Die Raten werden auf dem Server aus den Rohzählern berechnet (Öffnungen und Klicks sind je Empfänger eindeutig). deliveryRate und bounceRate beziehen sich auf Gesendetes; openRate, clickRate und unsubscribeRate auf Zugestelltes; clickToOpenRate (CTOR) ist Klicker im Verhältnis zu Öffnern und eine eigene Kennzahl neben clickRate. Eine Rate ist ein Prozentwert ohne Obergrenze (clickToOpenRate kann 100 überschreiten) und ist null, nie 0, wenn sie nicht verfügbar ist: der Nenner ist 0 oder das nötige Tracking ist im Konto ausgeschaltet (openTrackingEnabled / clickTrackingEnabled zeigen die aktuelle Einstellung). Um Kampagnen zusammenzufassen, addieren Sie die Zähler und teilen einmal; mitteln Sie keine Prozentwerte. Dieselben Felder liefert auch die Liste je Kampagne.

Kampagne aktualisieren

PUT https://api.mail.land/v1/marketing/campaigns/{id}

Nur Kampagnen im Status Draft oder Scheduled können aktualisiert werden. Der Anfrage-Body entspricht dem der Erstellungsanfrage, außer type, das nicht geändert werden kann.

StatusCodeBeschreibung
200-Kampagne aktualisiert
400INVALID_REQUESTNur Entwurfskampagnen können bearbeitet werden
404RESOURCE_NOT_FOUNDKampagne nicht gefunden
Update a campaign
curl -X PUT https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "February Newsletter (Updated)",
    "subject": "What'\''s new in February - updated",
    "fromName": "MailLand Team",
    "fromEmail": "[email protected]",
    "htmlContent": "<html><body><h1>Updated!</h1></body></html>",
    "mailingListId": "ddv6ou6kz4wbto"
  }'

Kampagne planen

POST https://api.mail.land/v1/marketing/campaigns/{id}/schedule
Schedule request
{
  "scheduledAt": "2026-02-20T14:00:00Z"
}

Der scheduledAt-Zeitpunkt muss in der Zukunft liegen. Der Kampagnenstatus wechselt zu Scheduled und der CampaignWorker verarbeitet sie zum geplanten Zeitpunkt.

Die Planung ist nur aus dem Status Draft möglich: eine bereits Scheduled-Kampagne kann über diesen Endpunkt nicht neu geplant werden.

StatusCodeBeschreibung
200-Kampagne geplant
400VALIDATION_FAILEDDer geplante Zeitpunkt muss in der Zukunft liegen
404RESOURCE_NOT_FOUNDKampagne nicht gefunden oder kann nicht geplant werden
403MARKETING_NOT_YET_ALLOWEDMarketing ist für das Konto noch nicht freigeschaltet (siehe Fehlercodes); /send gibt ihn ebenfalls zurück
403MARKETING_SUSPENDEDMarketing ist plattformweit nicht verfügbar; /send gibt ihn ebenfalls zurück
422CAMPAIGN_LINK_BLOCKEDEin Link in der Kampagne zeigt auf ein als unsicher eingestuftes Ziel; /send gibt ihn ebenfalls zurück. Es wird nichts geplant oder gesendet
Schedule a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/schedule \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{ "scheduledAt": "2026-02-20T14:00:00Z" }'

Sofort senden

POST https://api.mail.land/v1/marketing/campaigns/{id}/send

Sendet die Kampagne sofort. Der Kampagnenstatus wechselt zu Sending und der CampaignWorker beginnt mit der Verarbeitung der Empfänger.

/send selbst prüft die Domain-Verifizierung nicht: diese Prüfung erfolgt bei der Erstellung/Aktualisierung (siehe Kampagne erstellen). /send liefert 422 CAMPAIGN_NO_ELIGIBLE_RECIPIENTS, wenn niemand in der Zielliste/dem Zielsegment für den Empfang der Kampagne infrage kommt (z. B. alle unterdrückt oder abgemeldet).

Send a campaign immediately
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/send \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Pausieren und Fortsetzen

Eine laufende Kampagne pausieren:

POST https://api.mail.land/v1/marketing/campaigns/{id}/pause
Pause a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/pause \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Eine pausierte Kampagne fortsetzen:

POST https://api.mail.land/v1/marketing/campaigns/{id}/resume
Resume a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/resume \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Das Pausieren stoppt den CampaignWorker bei der Verarbeitung verbleibender Empfänger. Bereits versendete E-Mails sind nicht betroffen. Beim Fortsetzen wird ab dem Unterbrechungspunkt weitergemacht.

Kampagne abbrechen

POST https://api.mail.land/v1/marketing/campaigns/{id}/cancel

Bricht eine Kampagne im Status Draft, Scheduled oder Sending ab. Bereits versendete E-Mails werden nicht zurückgerufen.

Cancel a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/cancel \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Kampagne duplizieren

POST https://api.mail.land/v1/marketing/campaigns/{id}/duplicate?name=Copy%20of%20Newsletter

Erstellt eine neue Draft-Kampagne mit allen Einstellungen aus dem Original. Der name-Abfrageparameter ist optional.

Duplicate a campaign
curl -X POST "https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/duplicate?name=Copy%20of%20Newsletter" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Archivieren und Dearchivieren

Eine Sent- oder Cancelled-Kampagne archivieren:

POST https://api.mail.land/v1/marketing/campaigns/{id}/archive
Archive a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/archive \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Eine archivierte Kampagne dearchivieren:

POST https://api.mail.land/v1/marketing/campaigns/{id}/unarchive
Unarchive a campaign
curl -X POST https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/unarchive \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Archivierte Kampagnen werden in der Standard-Listenansicht ausgeblendet, es sei denn, includeArchived=true wird übergeben.

Kampagnenempfänger

Paginierte Empfänger mit Zustellungsstatus für eine Kampagne abrufen:

GET https://api.mail.land/v1/marketing/campaigns/{id}/recipients
ParameterTypStandardBeschreibung
cursorstring-Opaker Cursor aus dem nextCursor der vorherigen Seite. Für die erste Seite weglassen.
limitint20Einträge pro Seite (max. 100)
statusstring-Nach Empfängerstatus filtern
searchstring-Nach E-Mail suchen
Get campaign recipients
curl "https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w/recipients?limit=20" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Campaign recipients response
{
  "items": [
    {
      "email": "[email protected]",
      "status": "Opened",
      "sentAt": "2026-02-15T10:00:30Z",
      "deliveredAt": "2026-02-15T10:00:32Z",
      "openedAt": "2026-02-15T11:15:00Z",
      "clickedAt": "2026-02-15T11:16:30Z",
      "bouncedAt": null,
      "complainedAt": null,
      "unsubscribedAt": null,
      "openCount": 2,
      "clickCount": 1,
      "bounceReason": null
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

Empfänger-Status

StatusWertBeschreibung
Pending0In der Warteschlange, noch nicht versendet
Sent1Vom MTA akzeptiert
Delivered2An Empfänger zugestellt
Opened3Empfänger hat geöffnet
Clicked4Empfänger hat einen Link angeklickt
Bounced5Hartes Bounce
Unsubscribed6Empfänger hat sich abgemeldet
Complained7Spam-Beschwerde
Failed8Zustellung fehlgeschlagen

openedAt/openCount und clickedAt/clickCount enthalten maschinelle Aktivität, Apple Mail Privacy Protection Prefetch und Sicherheits-Link-Scanner, die MailLand heute nicht herausfiltert. Behandeln Sie aus Öffnungen/Klicks abgeleitete Raten als Obergrenze, nicht als präzise Kennzahl menschlichen Engagements.

Kampagne löschen

DELETE https://api.mail.land/v1/marketing/campaigns/{id}

Löscht eine Kampagne und ihre Empfängerdaten dauerhaft. Nur Kampagnen im Status Draft oder Scheduled können gelöscht werden; das Löschen jedes anderen Status liefert 404: archivieren Sie eine gesendete Kampagne stattdessen.

Delete a campaign
curl -X DELETE https://api.mail.land/v1/marketing/campaigns/uivozyvucowj9w \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Fehlerantworten

StatusCodeBeschreibung
400VALIDATION_FAILEDPflichtfelder fehlen
400INVALID_REQUESTNur Entwurfskampagnen können bearbeitet werden
403FORBIDDENUnzureichende Berechtigungen
404RESOURCE_NOT_FOUNDKampagne nicht gefunden

Nächste Schritte

  • Abonnenten: verwalten Sie Ihre Abonnentenkontakte
  • Listen: organisieren Sie Abonnenten in Mailinglisten
  • Segmente: richten Sie Kampagnen mit dynamischen Segmenten aus
  • Automatisierungen: richten Sie triggerbasierte E-Mail-Sequenzen ein

Auf dieser Seite