tutorial · resposta com fontes
Como funcionam os webhooks do Resend?
Os webhooks do Resend enviam um POST HTTPS com um payload JSON do evento para o seu endpoint cadastrado sempre que ocorre um evento de e-mail, contato, domínio ou supressão. O seu endpoint deve verificar a assinatura com base no corpo bruto da requisição, processar o evento de forma idempotente e retornar rapidamente uma resposta de sucesso.
O fluxo de webhooks do Resend
O fluxo começa quando você cria um endpoint HTTPS público e o cadastra no Resend com os tipos de evento de que a sua aplicação precisa. Quando ocorre um evento correspondente, o Resend envia uma requisição POST com um payload JSON. O payload inclui um tipo, como email.sent, email.delivered, email.bounced ou email.complained, um horário de criação e dados específicos do evento. Direcione o processamento pelo campo type, em vez de presumir que todos os payloads têm o mesmo formato.
Verifique a requisição antes de processá-la
Leia a requisição como texto bruto e verifique-a com o segredo de assinatura do webhook e os cabeçalhos svix-id, svix-timestamp e svix-signature. Faça isso antes de fazer o parsing do payload ou de agir com base nele. Fazer o parsing do JSON e serializá-lo de novo pode alterar os bytes e fazer uma assinatura legítima falhar. Rejeite as requisições que não passarem na verificação e guarde o segredo de assinatura em um gerenciador de segredos ou em uma variável de ambiente protegida, e não no código-fonte.
Torne o tratamento de eventos idempotente
O Resend documenta entrega do tipo at-least-once (pelo menos uma vez), então o mesmo evento pode chegar ao seu endpoint mais de uma vez. Armazene o svix-id com uma restrição de unicidade e pule a lógica de negócio quando esse identificador já tiver sido processado. Também não dependa da ordem de chegada, porque novas tentativas e atrasos de rede podem reordenar os eventos. Use o valor created_at do evento quando a sequência importar e modele as mudanças de status de forma que um evento mais antigo não sobrescreva acidentalmente um estado mais recente.
Confirme rápido e processe com segurança
Retorne HTTP 200 depois que o evento for verificado e registrado de forma durável e, em seguida, faça o trabalho mais lento por meio de uma fila ou de um worker em segundo plano. Um timeout ou uma resposta sem sucesso gera uma nova tentativa de entrega, então handlers síncronos demorados criam duplicatas evitáveis. Separe a ingestão dos efeitos colaterais, como atualizar um registro de supressão, notificar o suporte ou registrar um bounce. Cada efeito colateral também deve ser seguro para repetir ou protegido pelo identificador de evento armazenado.
Teste novas tentativas, replays e recuperação de falhas
Teste o endpoint com tipos de evento representativos antes de ir para produção, incluindo assinaturas inválidas, identificadores duplicados, timestamps fora de ordem e falhas temporárias do banco de dados. O Resend tenta novamente as entregas que falharam seguindo um cronograma de backoff e permite fazer replay tanto das mensagens de webhook com falha quanto das bem-sucedidas. Use o replay para se recuperar após uma indisponibilidade ou para validar um código de handler atualizado, mas mantenha a deduplicação ativa para que a recuperação não repita efeitos colaterais visíveis para os clientes.
Perguntas que as equipes fazem
Qual resposta um endpoint de webhook do Resend deve retornar?
Retorne HTTP 200 depois que a requisição for verificada e o evento for aceito de forma durável. O trabalho mais lento deve continuar de forma assíncrona, para que o provedor não tente novamente por causa de um timeout.
Por que é preciso preservar o corpo bruto da requisição?
A assinatura cobre os bytes originais da requisição. Fazer o parsing e serializar o JSON de novo pode alterar esses bytes, fazendo a verificação falhar mesmo quando a requisição é legítima.
Um evento de webhook do Resend pode ser entregue mais de uma vez?
Sim. O Resend documenta entrega at-least-once, então os handlers precisam deduplicar os eventos, normalmente armazenando o svix-id único antes de aplicar os efeitos colaterais de negócio.
Os eventos de webhook do Resend são entregues em ordem?
Não. Atrasos de rede e novas tentativas podem mudar a ordem de chegada. Use os timestamps dos eventos e regras de transição de estado quando a sua aplicação precisar reconstruir uma sequência confiável.
Como recuperar entregas de webhook do Resend que falharam?
O Resend tenta novamente as entregas que falharam de forma automática e também permite replay manual. Corrija o endpoint primeiro e, depois, faça o replay dos eventos necessários, mantendo as verificações de idempotência ativadas.
Fontes primárias
- Managing Webhooks — Resend (em inglês)
- Verify Webhooks Requests — Resend (em inglês)
- Retries and Replays — Resend (em inglês)
- Webhook Event Types — Resend (em inglês)