Sign inGet started

Migrer depuis Resend

Cette page fait correspondre le payload POST /emails de Resend, la gestion des suppressions et les webhooks signés par Svix à Bird. Suivez le guide de migration principal dans l'ordre et utilisez ces correspondances pour les étapes 1, 3 et 4. Les payloads d'envoi ont des champs similaires, mais le suivi, les métadonnées et la vérification des webhooks nécessitent des modifications.

Transmettez ceci à votre agent

Collez ceci dans Claude Code, Cursor ou Codex. L'agent parcourt cette page en s'appuyant sur votre propre dépôt, en utilisant la surface Bird dont il dispose déjà : le serveur MCP s'il est connecté, le CLI s'il est installé et authentifié.
Exemple de code
I am moving an email integration from Resend to Bird. Route through it with me.
1. Check what you already have before setting anything up. If Bird's MCP server is connected, use its tools. If the Bird CLI is installed and signed in, use that. Either one is enough, and every step below is an action you take with whichever you have. Only if neither is present, follow https://bird.com/docs/ai/set-up-your-agent.md to set one up and sign me in. Every Bird docs page serves Markdown at its own URL with `.md` appended, so fetch that rather than the HTML.
2. Read https://bird.com/docs/guides/email/migrate/resend.md for the payload, suppression and event mapping, and https://bird.com/docs/guides/email/migrate.md for the order the steps go in.
3. Find and list my Resend usage in this repository before you change anything: the POST /emails and batch call sites and any SDK wrappers around them, the webhook handler and the URL it is registered at, and every domain I send from.
4. Register each of those sending domains with Bird and give me the DNS records to publish, following https://bird.com/docs/guides/email/sending-domains.md. Leave every DNS record my current provider uses exactly as it is: Bird's records are published alongside them and both providers authenticate side by side until I switch traffic. Publishing DNS affects mail for the whole domain, so show me the records and let me publish them.
5. Rebuild my suppression list and import it into Bird before any production traffic goes through Bird, so my first sends do not reach addresses that already bounced or complained. Resend publishes no suppression export, so there is no endpoint that returns this list: derive it from whatever bounce and complaint events I have stored from my webhook, from the dashboard's Emails view, and from contacts marked unsubscribed in any Audience I use. That means the list can be incomplete without either of us noticing, so show me the list you built and tell me which of those sources each address came from before you import anything. The Bird import takes one address per request and is idempotent, so a partial re-run is safe. https://bird.com/docs/guides/email/suppressions.md has the reason taxonomy.
6. Port the send call and the webhook handler using the mapping tables on the provider page. Verification is a header change rather than a rewrite here: Resend signs with Svix and Bird signs per Standard Webhooks, which is the same HMAC construction with the svix-* headers renamed to webhook-*, so keep my verifier and rename what it reads. The event shape does change: Resend's events are scoped to a message and Bird's are scoped to a recipient, so a send to three recipients yields three outcomes rather than one. See https://bird.com/docs/guides/webhooks.md and https://bird.com/docs/guides/email/events.md.
7. Run my whole integration against Bird's mail sandbox before any production traffic, following https://bird.com/docs/guides/email/testing-sandbox.md. Sandbox sends run the real pipeline without reaching an inbox or touching my sending reputation.
8. Stop and ask me wherever a step needs a decision. Do not point production traffic at Bird until I have seen the sandbox results and replied with the words cut over to Bird. Retiring the Resend path is a separate step that comes later: ask me again and wait for me to reply with the words retire the Resend path. A reply that agrees without naming what it is authorising is not authorisation. Finish by telling me what is left that only a person can do.

Faire correspondre l'appel d'envoi

FonctionResendBird
Expéditeurfromfrom
Destinatairesto / cc / bccto / cc / bcc (tableaux)
Objetsubjectsubject
Corpshtml / texthtml / text (au moins un)
Reply-toreply_toreply_to (tableau)
En-têtes personnalisésheadersheaders (objet string → string)
Libellés filtrablespaires tags : {name, value}paires tags : {name, value}
Contexte aller-retour(aucun ; les tags servent aussi de contexte)metadata : JSON arbitraire
Planificationscheduled_atscheduled_at
Suivi ouverture/clicparamètre par domaine dans le tableau de bordtrack_opens / track_clicks (par défaut true)
Catégorie(aucun)category : marketing (par défaut) ou transactional
Nos limites de champs et valeurs par défaut (nombre de destinataires, limites de tags et de métadonnées) se trouvent dans Envoyer des e-mails.
Notes de portage :
  • Les tags conservent leur forme, et metadata est une amélioration. Les tags Resend sont les mêmes paires {name, value} que nous utilisons, mais leurs contraintes de valeur poussaient les données de corrélation dans les valeurs de tag. Ici, déplacez le contexte de corrélation dans metadata (JSON arbitraire, renvoyé avec chaque événement webhook et retourné lors des lectures API) et gardez les tags pour le filtrage. Voir tags vs métadonnées.
  • Le suivi passe dans le payload. Resend active/désactive le suivi des ouvertures et des clics par domaine dans le tableau de bord. Nous définissons track_opens/track_clicks par message (les deux par défaut à true).
  • scheduled_at correspond directement, nom compris. Voir envoi planifié. Pour react, effectuez le rendu de vos templates React Email en HTML dans votre application (la fonction render de @react-email/render fonctionne sans modification) et envoyez le résultat comme html.
  • Les pièces jointes se portent directement. Les attachments de Resend (content en base64) correspondent à notre tableau attachments. Définissez content_id pour les images inline.
  • L'envoi par lot se porte directement. Le POST /emails/batch de Resend devient notre endpoint batch, avec des résultats par entrée dans les deux cas.

Exporter les suppressions

Resend ne propose pas d'export dédié de la liste de suppressions. Récupérez les adresses dont le dernier événement est bounced ou complained. Utilisez la vue Emails dans le tableau de bord ou vos événements webhook stockés, puis passez la liste dans la boucle d'import. Si vous utilisez Audiences pour les e-mails marketing, transférez aussi les contacts marqués comme désabonnés.

Traduire les événements webhook

RésultatResendBird
Accepté/traitéemail.sentemail.acceptedemail.processed
Délivréemail.deliveredemail.delivered
Échec temporaireemail.delivery_delayedemail.deferred
Rebond permanentemail.bouncedemail.bounced / email.out_of_band_bounce
Plainte pour spamemail.complainedemail.complained
Bloqué/suppriméemail.failedemail.rejected
Ouvertureemail.openedemail.opened
Clicemail.clickedemail.clicked
Désabonnement(aucun)email.unsubscribed / email.list_unsubscribed
La vérification des webhooks utilise une construction HMAC similaire mais avec des en-têtes différents. Resend utilise svix-id, svix-timestamp et svix-signature. Bird suit la spécification Standard Webhooks avec les en-têtes webhook-*. Mettez à jour votre vérificateur pour utiliser le secret de signature de Bird et la procédure Webhooks et événements.
Une différence de comportement : les événements de Resend sont associés au message. Nos événements de livraison sont associés au destinataire (recipient_id accompagné de email_id), donc un envoi à trois destinataires produit trois résultats de livraison, un par destinataire.

Basculer

Suivez les étapes domaines et DNS et test de vérification en sandbox du guide principal. Les deux sont indépendantes du fournisseur.

Étapes suivantes

  • Domaines d'envoi : enregistrement, cycle de vie de la vérification et enregistrements DNS que vous redirigez
  • Webhooks et événements : configuration de l'endpoint et vérification Standard Webhooks
  • Sandbox de test : testez la nouvelle intégration avant la bascule
  • Suppressions : confirmez votre liste importée et la façon dont nous la maintenons ensuite