Notificações transacionais pela API de WhatsApp
Notificação transacional é a mensagem que nasce de um evento do seu sistema: pedido pago, senha trocada, status alterado. Para ela chegar uma vez, rápido e sem travar a aplicação, o envio precisa sair do request, passar por uma fila e ser confirmado por webhook.
Transacional não é campanha
A diferença não é o texto, é o gatilho. Uma campanha é decidida por uma pessoa e vai para uma lista. Uma notificação transacional é decidida pelo sistema, vai para uma pessoa e só existe porque algo aconteceu com ela. Exemplos típicos:
- Pedido recebido, pagamento aprovado ou recusado, nota fiscal emitida.
- Redefinição de senha, novo acesso à conta, alteração de e-mail.
- Mudança de status em chamado, proposta, processo ou entrega.
- Vencimento de plano, cartão expirando, limite de uso atingido.
Como o cliente espera esses avisos, a taxa de leitura no WhatsApp tende a ser alta e o risco de denúncia, baixo. Por outro lado, a tolerância a erro também é baixa: aviso de pagamento que chega duas vezes gera chamado, e aviso que não chega gera desconfiança. O desenho técnico existe para evitar esses dois casos.
A arquitetura que aguenta volume
O erro mais comum é chamar a API de WhatsApp dentro do request que processa o pagamento. Se a chamada demorar, o checkout demora. Se falhar, o pagamento fica num estado estranho. O fluxo recomendado separa as responsabilidades:
- O domínio publica um evento, por exemplo
pagamento.aprovado, e segue a vida. Nada de WhatsApp aqui. - Um consumidor lê o evento da fila, monta a mensagem a partir de um modelo e calcula a chave de idempotência.
- O worker envia para a D-API com
async: true. A API responde na hora com umcommandIde executa o envio em segundo plano. - O resultado chega no webhook
command.result. O worker grava ocommandIdjunto da notificação e o webhook atualiza o registro. - Entrega e leitura chegam depois, pelos eventos
message.deliveredemessage.read, se você quiser exibir isso no painel.
A chamada do worker fica assim:
curl -X POST https://api.d-api.cloud/api/v1/messages/send/text \
-H "Authorization: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sessionId": "loja-notificacoes",
"to": "5511999999999",
"text": "Pagamento aprovado. Seu pedido 48213 já está em separação.",
"async": true
}'Se o seu sistema preferir consultar em vez de esperar o evento, o resultado também fica disponível em GET /api/v1/commands/{commandId} por cerca de uma hora. Para entrega garantida, a própria documentação recomenda o webhook. Quem já usa RabbitMQ pode receber os eventos direto numa fila, configurada por sessão.
Idempotência: a notificação que não pode chegar duas vezes
Filas entregam pelo menos uma vez, não exatamente uma vez. Um worker que cai depois de enviar e antes de confirmar vai reprocessar a mesma mensagem. A proteção é do seu lado, e é simples:
- Chave derivada do evento, não do horário. Algo como
pedido:48213:pago. O mesmo evento sempre gera a mesma chave. - Restrição de unicidade no banco. Grave a chave numa tabela de notificações com índice único antes de chamar a API. Se a gravação falhar por duplicidade, o envio já aconteceu ou está em curso.
- Estado explícito.
pendente,enviadocom ocommandId,confirmadooufalhou. Retentativa só para o que está emfalhou, com intervalo crescente e limite de tentativas. - Webhook também é idempotente. A D-API reenvia um webhook até 7 vezes se o seu servidor não responder, e deduplica eventos numa janela curta. Seu handler deve aceitar o mesmo evento repetido sem efeito colateral.
Os detalhes de formato e reenvio dos eventos estão em webhook de WhatsApp.
API oficial ou não oficial para notificações
Os dois caminhos funcionam para transacional, com regras diferentes. Na D-API eles usam a mesma integração, então a escolha pode ser revista sem reescrever o worker.
| Não oficial (QR) | Oficial (Cloud API) | |
|---|---|---|
| Primeira mensagem para o cliente | Texto livre | Template aprovado, em geral categoria utilidade |
| Rota de envio | messages/send/text e demais | messages/send/template fora da janela de conversa |
| Custo | Por conexão na D-API | Taxa por conexão mais cobrança da Meta por template, que varia por categoria e país |
| Mudar o texto | Imediato | Novo template, sujeito à aprovação da Meta |
No template oficial, as partes variáveis vão em bodyVariables, e o nome e o idioma do template são obrigatórios. Para aprofundar a escolha, veja API oficial vs não oficial e a página da API oficial de WhatsApp.
Boas práticas de conteúdo
- Identifique a empresa na primeira linha. O cliente precisa saber quem fala antes de ler o resto.
- Uma notificação, um assunto. Não aproveite aviso de pagamento para oferecer produto.
- Inclua o identificador que o cliente reconhece: número do pedido, protocolo, final do cartão.
- Agrupe eventos próximos. Três mudanças de status em dois minutos viram uma mensagem só.
- Respeite horário. Aviso que não é urgente pode esperar a manhã seguinte.
Dois casos específicos têm guias próprios: código de verificação e rastreio de pedidos. Se as notificações vão sair de sistemas internos como ERP ou monitoramento, veja também API de WhatsApp para operação interna. O trial de 3 dias dá para montar o fluxo completo, do evento ao webhook de confirmação.
Perguntas frequentes
O que é uma notificação transacional no WhatsApp?
É uma mensagem disparada por um evento na vida do cliente, e não por uma campanha: pedido confirmado, pagamento aprovado, senha redefinida, entrega a caminho. Ela é esperada, individual e tem valor informativo imediato.
Posso enviar notificação transacional pela API não oficial?
Pode, e é um dos usos mais comuns. O cuidado é enviar só para quem tem relação com a sua empresa e espera aquele aviso. Volume alto para quem não conhece o número é o que leva a bloqueio, não o tipo de API.
Na API oficial preciso de template para notificação?
Sim, quando a conversa é iniciada pela empresa. Avisos de pedido, pagamento e conta normalmente entram na categoria utilidade da Meta, e o template precisa estar aprovado antes do primeiro envio. A aprovação é decisão da Meta.
Como evito que o cliente receba a mesma notificação duas vezes?
Gere uma chave única para cada notificação a partir do evento, como pedido 123 pago, e grave essa chave antes de enviar. Se o evento chegar de novo, a chave já existe e o envio é ignorado.
Como sei se a notificação foi entregue?
Ao enviar com async true você recebe um commandId, e o resultado do envio chega no webhook command.result. Depois disso, os eventos message.delivered e message.read informam entrega e leitura.
Continue lendo
Teste a API de WhatsApp da D-API
Trial de 3 dias com acesso completo. Sem cartão, sem fidelidade.