Sign inGet started

Migrar do Resend

Esta página mapeia o payload POST /emails do Resend, o tratamento de supressões e os webhooks assinados com Svix para Bird. Siga o guia principal de migração em ordem e use estes mapeamentos para os passos 1, 3 e 4. Os payloads de envio têm campos semelhantes, mas rastreamento, metadados e verificação de webhooks exigem alterações.

Passe isso para o seu agente

Cole isso no Claude Code, Cursor ou Codex. O agente percorre esta página usando seu próprio repositório, com qualquer superfície Bird que já esteja disponível: o servidor MCP, se estiver conectado, ou CLI, se estiver instalado e autenticado.
Exemplo de código
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.

Mapear a chamada de envio

O que fazResendBird
Remetentefromfrom
Destinatáriosto / cc / bccto / cc / bcc (arrays)
Assuntosubjectsubject
Corpohtml / texthtml / text (pelo menos um)
Reply-toreply_toreply_to (array)
Cabeçalhos personalizadosheadersheaders (objeto string → string)
Rótulos filtráveistags: pares {name, value}tags: pares {name, value}
Contexto de ida e volta(nenhum; tags servem como contexto)metadata: JSON arbitrário
Agendamentoscheduled_atscheduled_at
Rastreamento de aberturas/cliquesconfiguração por domínio no paineltrack_opens / track_clicks (padrão true)
Categoria(nenhum)category: marketing (padrão) ou transactional
Nossos limites e padrões de campos (quantidade de destinatários, limites de tags e metadados) estão em Envio de e-mail.
Notas de portabilidade:
  • As tags mantêm o mesmo formato, e metadata é uma melhoria. As tags do Resend são os mesmos pares {name, value} que usamos, mas suas restrições de valor forçavam dados de correlação para dentro dos valores das tags. Aqui, mova o contexto de correlação para metadata (JSON arbitrário, retornado em cada evento de webhook e nas leituras de API) e mantenha as tags para filtragem. Veja tags vs metadados.
  • O rastreamento passa para o payload. O Resend alterna o rastreamento de aberturas/cliques por domínio no painel. Nós definimos track_opens/track_clicks por mensagem (ambos com padrão true).
  • scheduled_at mapeia diretamente, inclusive o nome. Veja envio agendado. Para react, renderize seus templates React Email para HTML na sua aplicação (a função render do @react-email/render funciona sem alterações) e envie o resultado como html.
  • Os anexos são portados diretamente. Os attachments do Resend (content em base64) mapeiam para nosso array de anexos. Defina content_id para imagens inline.
  • O envio em lote é portado diretamente. O POST /emails/batch do Resend se torna nosso endpoint de lote, com resultados por entrada em ambos os casos.

Exportar supressões

O Resend não disponibiliza uma exportação dedicada de lista de supressão. Extraia endereços cujo último evento seja bounced ou complained. Use a visualização Emails no painel ou seus eventos de webhook armazenados, e então passe a lista pelo loop de importação. Se você usa Audiences para e-mail marketing, transfira também os contatos marcados como descadastrados.

Traduzir eventos de webhook

ResultadoResendBird
Aceito/processadoemail.sentemail.acceptedemail.processed
Entregueemail.deliveredemail.delivered
Falha temporáriaemail.delivery_delayedemail.deferred
Bounce permanenteemail.bouncedemail.bounced / email.out_of_band_bounce
Reclamação de spamemail.complainedemail.complained
Bloqueado/suprimidoemail.failedemail.rejected
Aberturaemail.openedemail.opened
Cliqueemail.clickedemail.clicked
Descadastramento(nenhum)email.unsubscribed / email.list_unsubscribed
A verificação de webhooks usa uma construção HMAC semelhante, mas com cabeçalhos diferentes. O Resend usa svix-id, svix-timestamp e svix-signature. Bird segue a especificação Standard Webhooks com cabeçalhos webhook-*. Atualize seu verificador para usar o segredo de assinatura de Bird e o procedimento de Webhooks e eventos.
Uma diferença de comportamento: os eventos do Resend têm escopo de mensagem. Nossos eventos de entrega têm escopo de destinatário (recipient_id junto com email_id), então um envio para três destinatários produz três resultados de entrega, um por destinatário.

Migrar

Siga os passos de domínios e DNS e do teste de fumaça no sandbox no guia principal. Ambos são independentes de provedor.

Próximos passos

  • Domínios de envio: registro, ciclo de vida da verificação e os registros DNS que você está redirecionando
  • Webhooks e eventos: configuração de endpoint e verificação Standard Webhooks
  • Sandbox de testes: teste de fumaça da nova integração antes da migração
  • Supressões: confirme sua lista importada e como a mantemos daqui em diante