Sign inGet started

Zeitgesteuerter Versand

Setzen Sie scheduled_at, um eine Nachricht bis zu einem bestimmten Zeitpunkt zurückzuhalten. Wenn dieser Zeitpunkt erreicht ist, durchläuft die Nachricht den normalen Zustellungsprozess und erzeugt die gleichen Events wie ein sofortiger Versand. Ihre Anwendung braucht keinen eigenen Scheduler.

Versand planen

Fügen Sie einem normalen POST /v1/email/messages-Versand einen scheduled_at-Zeitstempel hinzu. Am Payload ändert sich sonst nichts.
const msg = await bird.email.send({
  from: "news@yourdomain.com",
  to: ["delivered@messagebird.dev"],
  subject: "Your weekly digest",
  html: "<p>Here is what happened this week...</p>",
  category: "marketing",
  scheduled_at: "2027-01-15T09:00:00Z",
});
console.log(msg.id, msg.status); // "em_…", "accepted"
Der Aufruf gibt sofort 202 Accepted mit der em_-präfixierten Nachrichten-ID und status: accepted zurück. Es ist dasselbe Nachrichtenobjekt, das ein sofortiger Versand liefert, plus scheduled_at in UTC, sodass Sie den Sendezeitpunkt ohne zusätzliches Lesen bestätigen können. Die Annahme ist synchron, der Versand ist verzögert. Lassen Sie scheduled_at in der Anfrage weg, wird die Nachricht sofort gesendet, und die Antwort enthält keinen scheduled_at-Schlüssel.
Auf Lese-Endpunkten zeigt die Nachricht status: scheduled mit ihrem scheduled_at an, bis der Sendezeitpunkt erreicht ist:
Codebeispiel
{
  "id": "em_01ky7q24hafjgvzfg02v3m177p",
  "status": "scheduled",
  "scheduled_at": "2027-01-15T09:00:00Z",
  "category": "marketing"
}
Wenn der Zeitpunkt erreicht ist, geben wir die Nachricht frei und ihr Status durchläuft die üblichen Zustände (accepted, dann processed, dann delivered usw.). scheduled_at bleibt danach gesetzt, sodass Sie immer sehen können, wofür eine Nachricht geplant war.
Das Planen verbraucht eine Einheit des Kontingents für geplante E-Mails Ihrer Organisation im Abrechnungszeitraum. Eine Überschreitung wird mit einem 422 (E10003) abgelehnt.

Ein geplanter Versand verwendet Inline-Inhalte

scheduled_at und template schließen sich gegenseitig aus, und ein Versand, der beides setzt, wird mit einem 422 abgelehnt. Das ist der Vertrag: Ein geplanter Versand hat seinen eigenen subject und Body, und ein Template-Versand geht sofort raus. Um Template-Inhalte zu planen, rendern Sie zuerst Betreff und Body. Das Dashboard und bird CLI zeigen eine Vorschau des genauen Betreffs, HTML und Texts, den ein Template-Versand zustellen würde. Planen Sie diese gerenderten Werte als Inline-Inhalte.
Ein Batch-Element akzeptiert scheduled_at zu den gleichen Bedingungen, sodass ein Batch geplante und sofortige Nachrichten mischen kann. Jedes geplante Element verbraucht eine eigene Einheit des Kontingents, und der gesamte Batch wird abgelehnt, wenn der Zeitpunkt eines Elements außerhalb des zulässigen Bereichs liegt. Jedes geplante Element enthält sein eigenes scheduled_at in der Batch-Antwort, und ein Element, das sofort gesendet wird, hat keinen scheduled_at-Schlüssel; die Batch-Referenz zeigt beides in einer Antwort.
Ein Payload für sofortigen Versand kann dennoch zu groß zum Planen sein. Wenn Body, Empfängerliste oder Metadaten das Planungslimit überschreiten, gibt API einen 422 zurück. Reduzieren Sie diese Felder oder senden Sie die Nachricht sofort.

Sendezeitpunkt wählen

scheduled_at ist ein absoluter RFC 3339-Zeitstempel. Zwei Regeln gelten dafür:
  • Er muss zwischen 30 Sekunden und 30 Tagen in der Zukunft liegen. Näher als 30 Sekunden oder weiter als 30 Tage wird mit einem 422 abgelehnt. Die Untergrenze verhindert, dass eine geplante Nachricht mit einem sofortigen Versand konkurriert. 30 Tage sind der weiteste Horizont, für den wir eine Nachricht vorhalten.
  • Geben Sie einen exakten Zeitpunkt an. Verwenden Sie einen UTC-Z (2027-01-15T09:00:00Z) oder ein explizites Offset (2026-07-30T09:00:00-04:00, derselbe Zeitpunkt wie 13:00:00Z). Wir vergleichen den Zeitpunkt mit der aktuellen Uhrzeit und interpretieren nie eine reine Ortszeit oder wenden die Zeitzone eines Empfängers an. Um um 9 Uhr in der jeweiligen Ortszeit jedes Empfängers zu senden, berechnen Sie diese Zeitpunkte selbst und planen Sie einen Versand pro Zeitzone.
Relative Ausdrücke wie "in 2 hours" werden nicht akzeptiert. Senden Sie einen aufgelösten Zeitstempel.

Geplante Nachrichten auflisten

Filtern Sie die Nachrichtenliste nach Status, um die noch nicht ausgelösten Nachrichten zu sehen:
for await (const message of bird.email.list({ status: "scheduled" })) {
  console.log(message.id, message.scheduled_at);
}
status=canceled listet die Nachrichten auf, die Sie vor dem Versand storniert haben. Sobald eine geplante Nachricht ausgelöst wird, gelangt sie in die Pipeline und erscheint mit den Zustellstatus wie jeder andere Versand. Das E-Mail-Protokoll im Dashboard bietet die gleichen Filter Scheduled und Canceled.

Geplanten Versand stornieren

Stornieren Sie eine Nachricht jederzeit, bevor der Versand beginnt, mit POST /v1/email/messages/{message_id}/cancel:
await bird.email.cancel("em_abc123");
Eine erfolgreiche Stornierung gibt 204 No Content zurück. Der Status der Nachricht wird canceled, sie wird nie gesendet, und ein email.canceled-Webhook wird ausgelöst. Vier Punkte sind wichtig:
  • Nur eine noch geplante Nachricht kann storniert werden. Eine Nachricht, deren Versand bereits begonnen hat, die bereits gesendet oder bereits storniert wurde, gibt 409 zurück:
    Codebeispiel
    {
      "error": {
        "type": "conflict_error",
        "code": "E10005",
        "name": "EmailNotCancelable",
        "message": "This message cannot be canceled.",
        "remediation": "Only a scheduled message that has not started sending can be canceled. Once sending begins there is no way to pull it back."
      }
    }
    Wenn der Sendezeitpunkt erreicht wird, kann eine Stornierung auch das Rennen gegen den Versand selbst verlieren und aus demselben Grund 409 zurückgeben.
  • Ein großer Versand kann einige Sekunden brauchen, bis er stornierbar ist. Ein geplanter Versand mit Anhängen oder einem großen Body speichert nach dem 202 noch Inhalte, daher:
    1. Eine Stornierung in diesem Zeitfenster gibt 409 zurück, und die Nachricht bleibt geplant.
    2. Lesen Sie die Nachricht erneut ab.
    3. Wenn sie noch status: scheduled anzeigt, versuchen Sie die Stornierung erneut.
  • Stornieren gibt das Kontingent für geplante E-Mails nicht zurück. Die beim Planen verbrauchte Einheit bleibt verbraucht. Das verhindert, dass eine Planen-und-Stornieren-Schleife das Kontingent umgeht. Ihr reguläres Versandkontingent bleibt unberührt, da es erst belastet wird, wenn eine Nachricht tatsächlich gesendet wird.
  • Stornieren kann sicher wiederholt werden mit einem Idempotency-Key, wie jeder andere Schreibvorgang.
Um einen geplanten Versand auf einen anderen Zeitpunkt zu verschieben, stornieren Sie ihn und reichen Sie einen neuen Versand mit dem neuen scheduled_at ein. Sie erhalten eine neue em_-ID.

Was zum Sendezeitpunkt passiert

Das Planen ändert nur, wann eine Nachricht freigegeben wird. Aufbau und Regeln bleiben gleich. Anhänge, Kategorie, Tags und Metadaten verhalten sich genau wie bei einem sofortigen Versand und werden auf den Webhook-Events genauso zurückgegeben. Vier Prüfungen verteilen sich auf die beiden Zeitpunkte:
  • Payload- und Domain-Validierung laufen sofort. Ein fehlerhafter geplanter Versand schlägt beim API-Aufruf mit einem 422 fehl, sodass Sie es jetzt erfahren und nicht erst um 9 Uhr.
  • Die Absenderdomain wird zum Sendezeitpunkt erneut geprüft. Wenn Ihre from-Domain zum geplanten Zeitpunkt nicht mehr verifiziert ist, wird die Nachricht nicht gesendet. Ihre Empfänger werden als rejected mit einer Begründung zurückgegeben, statt E-Mails von einer nicht verifizierten Domain zu erhalten. Halten Sie die Domain für das gesamte Zeitfenster verifiziert.
  • Ihr Versandkontingent wird zum Sendezeitpunkt belastet. Das reguläre Versandkontingent wird verbraucht, wenn die Nachricht ausgelöst wird. Das Planen lässt das Kontingent unverändert. Ist das Kontingent zum Sendezeitpunkt erschöpft, werden die Empfänger abgelehnt.
  • Unterdrückung wird zum Sendezeitpunkt ausgewertet, anhand Ihrer Unterdrückungsliste in ihrem dann aktuellen Stand. Jemand, der sich zwischen Planung und Versand abmeldet, wird also trotzdem berücksichtigt.

Fehler

StatusCodeWann
422E10003Das Kontingent für geplante E-Mails Ihrer Organisation im Abrechnungszeitraum ist aufgebraucht
422scheduled_at liegt weniger als 30 Sekunden oder mehr als 30 Tage in der Zukunft
422scheduled_at wurde mit template kombiniert
422Der Payload ist zu groß zum Vorhalten; reduzieren Sie Body, Empfänger oder Metadaten, oder senden Sie sofort
409E10005Die Nachricht kann nicht mehr storniert werden: Versand hat bereits begonnen, wurde gesendet oder storniert
404Keine Nachricht mit dieser ID in diesem Workspace

Webhooks

Zwei Events sind spezifisch für die Planung, zusätzlich zu den üblichen Zustellungs-Events:
  • email.scheduled wird ausgelöst, wenn eine Nachricht mit einem zukünftigen scheduled_at angenommen wird, und meldet diesen Zeitpunkt.
  • email.canceled wird ausgelöst, wenn eine geplante Nachricht vor dem Versand storniert wird.
Wenn die Nachricht ausgelöst wird, folgt die normale email.accepted-Kette unverändert.

Nächste Schritte

Verwandte Ressourcen

Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema. Die Ressourcen sind auf Englisch.

Implementierungs-Briefing erhalten