Visão geral

Os webhooks permitem que você receba requisições HTTP POST no seu servidor quando eventos acontecem no Madmail, como quando um e-mail é entregue, sofre bounce ou é clicado. Com isso você constrói integrações em tempo real e automatiza fluxos de trabalho.

Configurando webhooks

1

Crie um endpoint de webhook

Crie um endpoint no seu servidor capaz de receber requisições POST. O endpoint precisa:
  • Aceitar requisições POST com corpo JSON
  • Retornar um status 2xx para confirmar o recebimento
  • Responder em até 10 segundos
2

Adicione o webhook no dashboard

Acesse Webhooks no seu dashboard do Madmail e crie um novo webhook:
  • Informe a URL do seu endpoint
  • Selecione quais eventos você quer receber
  • Copie o secret de assinatura para a verificação
3

Verifique as assinaturas dos webhooks

Sempre verifique as assinaturas para garantir que as requisições vêm do Madmail. Veja a seção Verificação de assinatura abaixo.

Tipos de evento

Eventos de e-mail

Eventos de contato

Eventos de domínio

Payload do webhook

Cada requisição de webhook inclui um payload JSON com a estrutura abaixo. Veja Detalhes dos dados de evento para saber o conteúdo do campo data em cada tipo de evento.

Campos do payload

Cabeçalhos da requisição

Cada requisição de webhook inclui os seguintes cabeçalhos:

Verificação de assinatura

Sempre verifique as assinaturas dos webhooks para garantir que as requisições são autênticas. A assinatura é calculada assim:

Usando o SDK (recomendado)

Next.js App Router

Express

Apenas verificação

Se você só precisa verificar a assinatura, sem fazer o parse do evento:

Verificação manual

Se você preferir verificar manualmente, sem o SDK:

Comportamento de retentativa

Se o seu endpoint não retornar uma resposta 2xx, o Madmail vai tentar entregar novamente com backoff exponencial: Depois de 6 tentativas sem sucesso, a chamada do webhook é marcada como falha.
Se o seu endpoint de webhook falhar em 30 chamadas consecutivas, o webhook será desativado automaticamente para evitar falhas contínuas. Você pode reativá-lo pelo dashboard.

Boas práticas

Retorne uma resposta 2xx o mais rápido possível. Se precisar, processe os dados do webhook de forma assíncrona. As requisições expiram após 10 segundos.
Use o campo id do payload para deduplicar eventos. Em casos raros, o mesmo evento pode ser entregue mais de uma vez.
Sempre verifique o cabeçalho X-UseSend-Signature para garantir que as requisições vêm do Madmail e não foram adulteradas.
Por padrão, o SDK rejeita assinaturas com mais de 5 minutos. Isso evita ataques de replay.
Sempre use endpoints HTTPS em produção para criptografar os dados do webhook em trânsito.

Testando webhooks

Você pode enviar um webhook de teste pelo dashboard para verificar se o seu endpoint está funcionando corretamente:
  1. Acesse Webhooks
  2. Clique no seu webhook
  3. Clique em “Send Test” para enviar um evento de teste
O evento de teste terá o tipo webhook.test com o seguinte payload:

Solução de problemas

  • Confirme que a URL do endpoint está correta e acessível publicamente - Verifique se o endpoint retorna um status 2xx - Garanta que o webhook está com status ACTIVE no dashboard - Veja se o webhook foi desativado automaticamente por falhas consecutivas
  • Use o corpo bruto da requisição, não o JSON já convertido - Confirme que está usando o secret correto do webhook - Verifique se o timestamp não expirou (janela de 5 minutos) - Confirme que está calculando o HMAC corretamente: HMAC-SHA256(secret, "${timestamp}.${rawBody}")
Depois de 30 chamadas falhas consecutivas, os webhooks são desativados automaticamente. Corrija o problema no seu endpoint e reative o webhook pelo dashboard. O contador de falhas é zerado na próxima entrega bem-sucedida.

Detalhes dos dados de evento

Esta seção documenta a estrutura do campo data para cada tipo de evento.

Eventos de e-mail

A maioria dos eventos de e-mail compartilha uma estrutura base comum:

email.bounced

Inclui detalhes adicionais do bounce:

email.failed

Inclui o motivo da falha:

email.suppressed

Inclui detalhes da supressão:

email.opened

Inclui detalhes do rastreamento de abertura:

email.clicked

Inclui detalhes do rastreamento de cliques:

Eventos de contato

Todos os eventos de contato (contact.created, contact.updated, contact.deleted) incluem:

Eventos de domínio

Todos os eventos de domínio (domain.created, domain.verified, domain.updated, domain.deleted) incluem: