Blog

"Enviado" não é "entregue": o número de teste que mentia

13 de agosto de 2026 · Time Orion

Passamos um tempo achando que a integração de mensageria estava funcionando. A chamada retornava 200, com um identificador de mensagem. Gravávamos como enviada. A tela mostrava enviada.

Ninguém recebia nada.

O que estava acontecendo

Estávamos usando o número de teste que a plataforma oferece para desenvolvimento. Ele aceita o envio, valida o formato, devolve identificador — e só depois, de forma assíncrona, informa que a conta não tem permissão para enviar mensagens para destinatários naquele país.

O retorno da chamada não sabia disso. Ele não podia saber: o envio de verdade acontece depois, do outro lado.

A lição de arquitetura

O erro conceitual foi nosso, e é comum: tratar o retorno de uma chamada assíncrona como o resultado da operação.

Num envio de mensagem existem pelo menos quatro estados, e eles acontecem em momentos diferentes:

  1. aceito — o provedor recebeu e vai tentar;
  2. enviado — saiu do provedor;
  3. entregue — chegou ao aparelho;
  4. lido — o destinatário abriu.

E existe um quinto que não é uma etapa, mas um desfecho: falhou — que pode acontecer depois de qualquer um dos anteriores.

O retorno da chamada só te dá o primeiro. Todos os outros chegam por notificação posterior. Um sistema que grava "enviada" no retorno e nunca mais atualiza está exibindo uma informação que era verdadeira por dois segundos.

O que mudamos

Uma coluna de erro na mensagem. Parece óbvio depois; não era antes. Se a falha chega assincronamente, ela precisa de lugar para morar — e precisa aparecer na interface, junto da mensagem. A bolha na tela não pode mentir para o operador: se não foi entregue, ele tem que ver isso ali, e não descobrir pelo cliente reclamando.

Estados de fato, não presumidos. Cada notificação de status atualiza a mensagem. "Enviado" deixa de ser um estado final e vira um estado intermediário.

Cautela com ambiente de teste. O número de teste é útil para validar o formato da requisição e a assinatura do webhook — e é enganoso para validar entrega. Nossa regra hoje: comportamento de entrega só é validado com destinatário real, e o teste da integração termina no aparelho de alguém, não no log.

O aviso que quase ninguém lê

Um detalhe operacional que aprendemos e que vale registrar: registrar um número na API oficial de uma dessas plataformas é uma operação irreversível na prática — ela desvincula o número do aplicativo comum no celular. Se aquele número era o que a equipe usava no dia a dia, o dia a dia acabou.

Não é um erro técnico; é uma decisão de negócio disfarçada de passo de configuração. Vale ler duas vezes antes de executar, e vale documentar no repositório para a próxima pessoa não descobrir sozinha.

O padrão que generaliza

Isso não é sobre mensageria. Vale para qualquer operação em que o efeito acontece fora do seu processo: cobrança, e-mail, nota fiscal, integração com terceiros.

O padrão é sempre:

  • o retorno da chamada é uma promessa, não um resultado;
  • o resultado chega depois, por notificação ou por consulta;
  • a interface precisa distinguir os dois — "estamos processando" é diferente de "deu certo";
  • e a falha precisa de lugar para morar no seu modelo de dados, com espaço para o motivo.

Sempre que um sistema exibe "sucesso" no instante da chamada, ele está apostando que a segunda parte não vai falhar. Ela falha.

O resumo

Um identificador de volta significa "aceitei", não "entreguei". Modele os estados que existem de verdade, guarde o erro assíncrono e faça a interface contar a verdade — inclusive quando ela é "ainda não sei".

É a mesma família de erro do 405 tratado como terminal: interpretar o que o outro lado disse com mais certeza do que ele realmente ofereceu.