Eventos de e-mail
Emitimos eventos à medida que cada destinatário avança pela entrega. Um envio para três endereços produz três fluxos independentes, correlacionados por email_id e recipient_id. Esta página define os tipos de evento de e-mail. Consulte Webhooks para assinaturas, tentativas, ordenação e replay.
Todo destinatário começa em email.accepted, depois email.processed. Um destinatário de broadcast é sua própria mensagem, então recebe seu próprio email.accepted também, embora apenas nos eventos API e no log de e-mail, não como webhook. A partir daí a mensagem é aceita pelo servidor receptor (email.delivered), é adiada e retentada (email.deferred, que se resolve como entregue ou devolvida), é recusada pelo servidor receptor (email.bounced), ou nunca recebe uma tentativa de entrega (email.rejected). Após uma entrega, o fluxo pode continuar com email.out_of_band_bounce, email.complained, email.opened, email.clicked, email.unsubscribed e email.list_unsubscribed.
Cada destinatário termina em exatamente um status terminal, delivered, bounced, complained ou rejected, retornado como o status por destinatário de GET /v1/email/messages/{message_id}/recipients. Eventos de engajamento nunca o alteram: um destinatário que abriu ainda é delivered. Um relatório de bounce tardio altera, porque o servidor receptor está retratando uma aceitação que já havia dado, então o destinatário passa de delivered para bounced. A mensagem como um todo tem seu próprio status consolidado e contagens por estado em GET /v1/email/messages/{message_id}.
O envelope do evento
Os eventos chegam como o envelope de três campos que todo webhook usa: type, timestamp (quando o evento ocorreu, RFC 3339) e um objeto data específico do tipo.
Exemplo de código
{
"type": "email.delivered",
"timestamp": "2026-07-23T14:51:47.107Z",
"data": {
"email_id": "em_01ky7qc398fmxraqtxn604zeq9",
"recipient_id": "er_01ky7qc398fmwsc96nt6anrbqs",
"workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
"recipient": "delivered@messagebird.dev",
"recipient_role": "to",
"tags": [{ "name": "category", "value": "welcome" }],
"metadata": { "order_id": "ord_123" },
"broadcast_id": null
}
}Todo evento de saída inclui email_id, recipient_id, workspace_id, o endereço recipient e seu recipient_role de envelope (to, cc ou bcc). Ele também repete tags e metadata da solicitação de envio para que você possa correlacionar o evento com seus registros. Cada valor opcional é null quando o envio não tinha nenhum, incluindo broadcast_id: ele nomeia o broadcast do qual um envio fez parte, para que você possa agrupar os eventos de um broadcast sem consultar cada envio, e é null em um envio sem broadcast por trás. Um caso reporta null para um envio que tinha broadcast: um link de cancelamento de inscrição de e-mail enviado antes de adicionarmos o campo não nomeia nenhum broadcast, então um opt-out por esse link reporta null em email.unsubscribed e email.list_unsubscribed independentemente de um broadcast ter enviado o e-mail. Trate null nesses dois eventos como inconclusivo, ou você subcontará os opt-outs de um broadcast. broadcast_id chega a você apenas no webhook: os eventos API abaixo retornam cada evento sem ele. Os tipos de evento adicionam campos descritos nas seções de ciclo de vida, engajamento, supressão e entrada.
Os mesmos eventos podem ser consultados posteriormente em GET /v1/email/messages/{message_id}/events, onde cada um também tem um id (prefixo ev_) e um occurred_at. Use-o para preencher lacunas, fazer replay ou reconciliar com o que seu endpoint recebeu. Alguns campos chegam a você apenas por esse API, não pelo webhook; a descrição do evento relevante identifica cada um.
Eventos de ciclo de vida
email.accepted
Aceitamos o envio e começamos a preparar a entrega. Dispara uma vez por destinatário solicitado e é o primeiro evento nesse fluxo. Um destinatário de broadcast também recebe um, porque cada destinatário é sua própria mensagem, mas ele é registrado em vez de entregue: leia-o nos eventos API ou no log de e-mail, não no seu endpoint de webhook. Payload: apenas a base de identidade.
email.processed
A mensagem foi construída e enfileirada para entrega ao servidor de e-mail do destinatário. Payload: apenas a base de identidade pelo webhook; os eventos API adicionam mailbox_provider e mailbox_provider_region, a classificação do sistema de e-mail receptor (por exemplo gmail, NA), presente quando pôde ser determinada e null caso contrário. Comparar o timestamp deste evento com o de email.accepted fornece o tempo de processamento em um envio individual. Um broadcast não tem esse intervalo: sua aceitação e seu processamento carregam o mesmo instante de despacho, então os dois timestamps coincidem em vez de delimitar qualquer processamento, e a aceitação chega a você apenas pelos eventos API, como occurred_at.
email.delivered
O servidor de e-mail receptor aceitou a mensagem e assumiu a responsabilidade por ela. Este evento não confirma posicionamento na caixa de entrada nem leitura. Inbox Insights fornece estimativas amostradas de posicionamento; eventos de abertura e clique registram solicitações de rastreamento. Payload: apenas a base de identidade pelo webhook; os eventos API adicionam sending_ip, o endereço de origem da mensagem, o que importa quando um problema de entregabilidade está ligado a um IP, além de mailbox_provider e mailbox_provider_region.
email.deferred
Uma falha temporária: o servidor receptor pediu para tentarmos novamente mais tarde (caixa de correio cheia, greylisting, limitação de requisições). Tentamos novamente automaticamente, e o destinatário eventualmente se resolve como email.delivered ou email.bounced, então este evento é informativo e não terminal, e um destinatário pode ser adiado várias vezes antes. Payload: bounce_type, bounce_class, defer_reason (o motivo que o servidor informou) e sending_ip pelo webhook; os eventos API adicionam mailbox_provider e mailbox_provider_region.
Eventos de falha
email.bounced
Uma falha permanente no momento de SMTP: o servidor receptor recusou a mensagem e o status terminal do destinatário passa a ser bounced. Payload: bounce_type (veja a tabela de classificação), bounce_class, bounce_code (o código de resposta SMTP, por exemplo 550), bounce_description (o motivo que o servidor informou) e sending_ip pelo webhook; os eventos API adicionam mailbox_provider e mailbox_provider_region. Um hard bounce suprime o endereço.
email.out_of_band_bounce
Um bounce tardio: o servidor receptor aceitou a mensagem no momento de SMTP e depois enviou um relatório de bounce. Ele tem a mesma classificação de email.bounced (bounce_type, bounce_class, bounce_code, bounce_description, sending_ip pelo webhook; mailbox_provider e mailbox_provider_region dos eventos API). Quando o relatório é classificado como bounce (qualquer classe na tabela), o servidor retratou sua aceitação anterior, então o destinatário passa de delivered para bounced. Relatórios cuja classe não está na tabela, como respostas automáticas, são registrados na linha do tempo e não alteram o status. Um hard out-of-band bounce também suprime o endereço.
email.rejected
O destinatário nunca chegou ao servidor de e-mail remoto, então nenhuma tentativa de entrega foi feita. É isso que diferencia uma rejeição de um bounce, onde o servidor receptor é quem diz não. Payload: rejection_reason, também no registro do destinatário, um dos seguintes:
| rejection_reason | Significado |
|---|---|
| recipient_suppressed | O destinatário está bloqueado no nível do espaço de trabalho, pela lista de supressão ou por uma preferência declarada, então a entrega nunca foi tentada |
| transmission_failed | A mensagem não pôde ser transmitida para entrega |
| generation_failure | A mensagem não pôde ser construída para entrega, um problema de template ou conteúdo |
| policy_rejection | A política de envio recusou a mensagem |
| domain_unverified | O domínio de envio não foi verificado |
| quota_exceeded | A cota de envio da organização foi atingida |
| recipient_not_allowed | O destinatário não foi permitido para este envio; envios em um domínio de onboarding compartilhado alcançam apenas membros verificados do seu espaço de trabalho |
Os eventos API também adicionam mailbox_provider e mailbox_provider_region quando o sistema de e-mail receptor pôde ser classificado antes da rejeição.
email.complained
O destinatário marcou a mensagem como spam e o provedor de caixa de correio reportou isso por meio do seu feedback loop. Reclamações chegam após a entrega e definem o status terminal como complained. Payload: feedback_type, o tipo de relatório que o provedor enviou, como abuse ou fraud, e null quando o provedor não informou, além de mailbox_provider e mailbox_provider_region dos eventos API. Uma reclamação suprime o endereço para e-mail de marketing. Mantenha sua taxa de reclamação baixa: provedores limitam remetentes que acumulam relatórios.
Eventos de engajamento
email.opened
O pixel de rastreamento no corpo da mensagem foi carregado. Payload: ip_address e user_agent quando conhecidos; os eventos API adicionam is_prefetched, country (ISO 3166-1 alpha-2, derivado do IP do cliente), mailbox_provider e mailbox_provider_region. Verifique is_prefetched antes de contar uma abertura. Ele é true quando um recurso de privacidade da caixa de entrada buscou o pixel automaticamente em vez de uma pessoa abrir a mensagem, e contar esses casos infla sua taxa de abertura. Rastreamento de abertura e clique cobre a instrumentação.
email.clicked
O destinatário clicou em um link rastreado. Payload: url (o link clicado), ip_address e user_agent quando conhecidos; os eventos API adicionam country, mailbox_provider e mailbox_provider_region. Cliques são geralmente um sinal de engajamento mais forte do que aberturas, porque proxies de privacidade podem carregar pixels de rastreamento automaticamente.
email.unsubscribed
O destinatário usou o link de cancelamento de inscrição no corpo da mensagem. Payload: apenas a base de identidade pelo webhook; os eventos API adicionam mailbox_provider e mailbox_provider_region. Registra uma preferência de opt-out que bloqueia e-mail de marketing. Links de cancelamento de inscrição cobre como o link é inserido no seu e-mail.
email.list_unsubscribed
O destinatário usou o botão de cancelamento de inscrição com um clique que o provedor de caixa de correio exibe em sua própria interface, acionado pelos cabeçalhos List-Unsubscribe da mensagem. Payload: apenas a base de identidade pelo webhook (mais mailbox_provider e mailbox_provider_region dos eventos API); o mecanismo é o próprio tipo de evento, por isso é separado de email.unsubscribed. Também registra uma preferência de opt-out que bloqueia e-mail de marketing.
Eventos de nível de mensagem
Dois eventos descrevem a mensagem como um todo em vez de um destinatário, então seu data tem email_id, workspace_id, tags e metadata, mas nenhuma identidade de destinatário. Ambos pertencem ao envio agendado.
email.scheduled
Aceitamos um envio com um scheduled_at no futuro. Payload: a base de nível de mensagem mais scheduled_at. Quando esse momento chega, o ciclo de vida por destinatário começa em email.accepted.
email.canceled
Uma mensagem agendada foi cancelada antes de ser enviada, então não produz nenhum evento de ciclo de vida de destinatário. Payload: apenas a base de nível de mensagem.
Eventos de entrada e caixa de correio
email.received cobre e-mail de entrada. Dispara quando recebemos e analisamos uma mensagem de entrada. Seu payload inclui o inbound_message_id, endereçamento, assunto e vereditos de autenticação. Configuração, payload e o API de consulta estão em Recebimento de e-mail. Uma caixa de correio tem sua própria família email_mailbox.* além disso, coberta no guia de caixas de correio.
Classificação de bounce
bounce_class é a classificação numérica de bounce incluída em email.bounced, email.out_of_band_bounce e email.deferred. Ela se agrupa no bounce_type genérico e mantém o código detalhado, para que você ainda possa distinguir uma caixa de correio cheia de uma falha de roteamento mesmo que ambos sejam reportados como soft:
| bounce_class | bounce_type | Significado |
|---|---|---|
| 1 | undetermined | A resposta do servidor receptor foi ambígua |
| 10, 30 | hard | Falha permanente: endereço inválido ou domínio inexistente |
| 20 to 24, 40, 70, 100 | soft | Falha temporária: caixa de correio cheia, servidor temporariamente indisponível, problema de DNS ou roteamento |
| 25 | admin | Recusa administrativa: retransmissão negada, domínio em lista de bloqueio |
| 50 to 54 | block | O servidor receptor recusou o IP de envio |
Qualquer classe fora desta lista é mapeada para undetermined. Apenas bounces hard suprimem o endereço; soft, block, admin e undetermined não, porque o endereço ainda pode ser entregável.
Supressão automática
Dois eventos adicionam um destinatário à lista de supressão do espaço de trabalho automaticamente, e bloqueiam tipos diferentes de e-mail:
| Evento | reason de supressão | O que bloqueia |
|---|---|---|
| email.bounced ou email.out_of_band_bounce com bounce_type: "hard" | hard_bounce | Todo e-mail, incluindo transacional |
| email.complained | complaint | E-mail de marketing; transacional continua sendo enviado |
Um hard bounce bloqueia tudo porque o próprio endereço não existe mais. Uma reclamação bloqueia apenas marketing, porque alguém que reportou sua newsletter como spam ainda precisa receber a redefinição de senha.
email.unsubscribed e email.list_unsubscribed bloqueiam e-mail da mesma forma que uma reclamação, apenas marketing, mas por meio de um registro diferente: em vez de adicionar uma supressão, registram o opt-out do destinatário como uma preferência declarada. O que um opt-out faz cobre esse registro em detalhes.
Cada adição dispara um evento email_suppression.created que contém o suppression_id, o email suprimido, o reason e o workspace_id. O esquema completo do registro e como gerenciar entradas manualmente estão no Guia de supressões.
Envios posteriores para um endereço suprimido são rejeitados de imediato como email.rejected com rejection_reason: "recipient_suppressed", e nunca contam contra sua entregabilidade.
Próximos passos
- Webhooks e eventos: configuração de endpoint, verificação de assinatura, tentativas e replay
- Supressões: como a lista de supressão funciona e como gerenciá-la
- Links de cancelamento de inscrição: configurando os caminhos por trás de email.unsubscribed e email.list_unsubscribed
- Testes e sandbox: envios em sandbox emitem eventos reais pelo caminho normal, que é a forma mais barata de exercitar seu handler
- Webhooks bem feitos: eventos de entrega fiáveis: um vídeo que cria um webhook e mostra os eventos chegando
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico. Os recursos estão em inglês.
Assista ao guiaGetting started with emailExplore a funcionalidadeEmailSiga o percurso de aprendizagemBuild your first integrationGuia de implementaçãoSend your first email
Experimente na prática e obtenha um resumo de implementação