Sign inGet started

Gepland verzenden

Stel scheduled_at in om een bericht vast te houden tot een specifiek tijdstip. Wanneer dat tijdstip aanbreekt, doorloopt het bericht de normale bezorgcyclus en produceert het dezelfde events als een directe verzending. Je applicatie hoeft geen eigen scheduler te draaien.

Een verzending inplannen

Voeg een scheduled_at-timestamp toe aan een normale POST /v1/email/messages-verzending. Verder verandert er niets aan de payload.
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"
De call retourneert direct 202 Accepted met het em_-voorvoegsel in het bericht-ID en status: accepted. Het is hetzelfde berichtobject dat een directe verzending retourneert, plus scheduled_at teruggegeven in UTC, zodat je het verzendmoment kunt bevestigen zonder een extra read. Acceptatie is synchroon; bezorging is uitgesteld. Laat scheduled_at weg uit het verzoek en het bericht gaat direct de deur uit, en het antwoord bevat geen scheduled_at-key.
Op read-endpoints toont het bericht status: scheduled met zijn scheduled_at totdat het verzendmoment aanbreekt:
Codevoorbeeld
{
  "id": "em_01ky7q24hafjgvzfg02v3m177p",
  "status": "scheduled",
  "scheduled_at": "2027-01-15T09:00:00Z",
  "category": "marketing"
}
Wanneer het moment aanbreekt, geven we het bericht vrij en doorloopt de status de gebruikelijke staten (accepted, dan processed, dan delivered, enzovoort). scheduled_at blijft daarna ingesteld, zodat je altijd kunt zien waarvoor een bericht was ingepland.
Inplannen verbruikt één eenheid van het scheduled-email-tegoed van je organisatie voor de facturatieperiode. Overschrijding van dat tegoed wordt geweigerd met een 422 (E10003).

Een geplande verzending gebruikt inline content

scheduled_at en template sluiten elkaar uit, en een verzending die beide instelt wordt geweigerd met een 422. Dat is het contract: een geplande verzending heeft zijn eigen subject en body, en een template-verzending gaat direct de deur uit. Om template-content in te plannen, render je eerst het onderwerp en de body. Het dashboard en bird CLI tonen een voorbeeld van het exacte onderwerp, de HTML en de tekst die een template-verzending zou bezorgen. Plan die gerenderde waarden in als inline content.
Een batch-item accepteert scheduled_at op dezelfde voorwaarden, dus één batch kan geplande en directe berichten mixen. Elk gepland item verbruikt zijn eigen eenheid van het tegoed, en de hele batch wordt geweigerd als het tijdstip van een item buiten het bereik valt. Elk gepland item bevat zijn eigen scheduled_at in het batch-antwoord, en een item dat direct verzendt heeft geen scheduled_at-key; de batch-referentie toont beide in één antwoord.
Een directe-verzendpayload kan alsnog te groot zijn om in te plannen. Als de body, ontvangerslijst of metadata de planningslimiet overschrijden, retourneert de API 422. Verklein die velden of verzend het bericht direct.

Het verzendmoment kiezen

scheduled_at is een absoluut RFC 3339-timestamp. Twee regels zijn van toepassing:
  • Het moet tussen 30 seconden en 30 dagen in de toekomst liggen. Dichter dan 30 seconden of verder dan 30 dagen wordt geweigerd met een 422. De ondergrens voorkomt dat een planning een directe verzending inhaalt. Dertig dagen is de maximale horizon waarvoor we een bericht vasthouden.
  • Geef een exact tijdstip op. Gebruik een UTC-Z (2027-01-15T09:00:00Z) of een expliciet offset (2026-07-30T09:00:00-04:00, hetzelfde moment als 13:00:00Z). We vergelijken het tijdstip met de huidige tijd en interpreteren nooit een kale lokale tijd of passen de tijdzone van de ontvanger toe. Om om 9 uur 's ochtends in de lokale tijd van elke ontvanger te verzenden, bereken je die tijdstippen zelf en plan je één verzending per tijdzone in.
Relatieve expressies zoals "in 2 hours" worden niet geaccepteerd. Stuur een opgelost timestamp.

Geplande berichten bekijken

Filter de berichtenlijst op status om de berichten te zien die nog niet zijn verzonden:
for await (const message of bird.email.list({ status: "scheduled" })) {
  console.log(message.id, message.scheduled_at);
}
status=canceled toont de berichten die je hebt geannuleerd voordat ze werden verzonden. Zodra een gepland bericht wordt vrijgegeven, komt het in de pipeline en verschijnt het met de bezorgstatussen, net als elke andere verzending. Het e-maillogboek in het dashboard biedt dezelfde Scheduled- en Canceled-filters.

Een geplande verzending annuleren

Annuleer een bericht op elk moment voordat het wordt verzonden met POST /v1/email/messages/{message_id}/cancel:
await bird.email.cancel("em_abc123");
Een geslaagde annulering retourneert 204 No Content. De status van het bericht wordt canceled, het wordt nooit verzonden, en een email.canceled-webhook wordt geactiveerd. Vier dingen om te weten:
  • Alleen een nog ingepland bericht kan worden geannuleerd. Een bericht dat al aan het verzenden is, al is verzonden of al is geannuleerd, retourneert 409:
    Codevoorbeeld
    {
      "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."
      }
    }
    Wanneer het verzendmoment aanbreekt, kan een annulering ook de race verliezen van de verzending zelf en om dezelfde reden 409 retourneren.
  • Een grote verzending kan een paar seconden nodig hebben om annuleerbaar te worden. Een geplande verzending met bijlagen of een grote body is nog content aan het opslaan na de 202, dus:
    1. Een annulering in dat venster retourneert 409 en het bericht blijft ingepland.
    2. Lees het bericht opnieuw op.
    3. Als het nog steeds status: scheduled toont, probeer de annulering opnieuw.
  • Annuleren geeft het scheduled-email-tegoed niet terug. De eenheid die je bij het inplannen hebt verbruikt, blijft verbruikt. Dat is wat voorkomt dat een inplannen-en-annuleren-loop het tegoed omzeilt. Je reguliere verzendtegoed wordt niet aangeraakt, want dat wordt pas belast wanneer een bericht daadwerkelijk wordt verzonden.
  • Annuleren is veilig om opnieuw te proberen met een Idempotency-Key, net als elke andere write.
Om een geplande verzending naar een ander tijdstip te verplaatsen, annuleer je deze en dien je een nieuwe verzending in met de nieuwe scheduled_at. Je krijgt een nieuw em_-ID.

Wat er op het verzendmoment gebeurt

Planning verandert alleen wanneer een bericht wordt vrijgegeven. De opbouw en governance blijven hetzelfde. Bijlagen, categorie, tags en metadata gedragen zich precies als bij een directe verzending en worden op dezelfde manier in de webhook-events meegegeven. Vier controles verdeeld over de twee momenten:
  • Payload- en domeinvalidatie worden vooraf uitgevoerd. Een ongeldige geplande verzending faalt op de API-call met een 422, zodat je het nu ontdekt in plaats van om 9 uur 's ochtends.
  • Het afzenderdomein wordt opnieuw gecontroleerd op het verzendmoment. Als je from-domein niet meer geverifieerd is wanneer het geplande tijdstip aanbreekt, wordt het bericht niet verzonden. De ontvangers worden geretourneerd als rejected met een reden, in plaats van dat er mail wordt verzonden vanaf een niet-geverifieerd domein. Houd het domein geverifieerd gedurende het hele venster.
  • Je verzendtegoed wordt belast op het verzendmoment. Het reguliere verzendquotum wordt verbruikt wanneer het bericht wordt vrijgegeven. Inplannen laat het quotum ongewijzigd. Als het tegoed op het verzendmoment is uitgeput, worden de ontvangers geweigerd.
  • Suppressie wordt beoordeeld op het verzendmoment, tegen je suppressielijst zoals die er op dat moment uitziet. Iemand die zich tussen inplannen en verzenden uitschrijft, wordt dus alsnog gerespecteerd.

Fouten

StatusCodeWanneer
422E10003Het scheduled-email-tegoed van je organisatie voor de facturatieperiode is op
422scheduled_at is minder dan 30 seconden of meer dan 30 dagen verwijderd
422scheduled_at is gecombineerd met template
422De payload is te groot om te parkeren; verklein de body, ontvangers of metadata, of verzend direct
409E10005Het bericht kan niet meer worden geannuleerd: het is al aan het verzenden, verzonden of geannuleerd
404Geen bericht met dat ID in deze werkruimte

Webhooks

Twee events zijn specifiek voor planning, bovenop de gebruikelijke bezorgevents:
  • email.scheduled wordt geactiveerd wanneer een bericht met een toekomstige scheduled_at wordt geaccepteerd, en rapporteert dat tijdstip.
  • email.canceled wordt geactiveerd wanneer een gepland bericht wordt geannuleerd voordat het wordt verzonden.
Wanneer het bericht wordt vrijgegeven, volgt de normale email.accepted-keten ongewijzigd.

Volgende stappen

Gerelateerde bronnen

Ga verder met de documentatie, gidsen en voorbeelden voor dit onderwerp. De bronnen zijn in het Engels.

Ontvang een implementatieoverzicht