Tutorial: Como evitar o banimento do WhatsApp: meu algoritmo de saúde do número (código e limites)

  • Autor Autor Carlos Arreola
  • Data de início Data de início
Este tópico foi traduzido automaticamente do espanhol. Ver original
Carlos Arreola

Carlos Arreola

Admin
Sigma
Verificado
Verificación en dos pasos activada
Verificado por Binance
¡Excelente comerciante!
Infografía: salud de un número de WhatsApp, 7 señales y puntaje de 0 a 100


Há alguns dias, no tópico WhatsApp automação: quais ferramentas vocês usam sem risco de banimento?, comentei que tinha um algoritmo próprio que limita os envios do meu app. @Brato se ofereceu para contribuir, então aqui vai completo: como funciona, os limites exatos, o código do cálculo e, acima de tudo, os erros que me custaram números para chegar a isso.

Aviso inicial: isto é para a via NÃO oficial (dispositivo vinculado). O risco nunca é eliminado, apenas administrado. Se você vai fazer campanhas a frio para listas compradas, nenhum algoritmo te salva: use a Cloud API da Meta.

1. Contexto: com quais dados foi feito

  • Stack: WAHA com o motor GOWS (baseado em whatsmeow), em Docker. Cada número tem seu próprio proxy do seu país, aquecido na sessão: o WhatsApp nunca vê o IP do servidor.
  • Números: os números de atendimento de alguns negócios. Não são números de spam: são a linha pela qual cada negócio já fala com seus clientes.
  • Registro: cada mensagem que sai fica anotada uma por uma, com seu tipo e seu destinatário.
  • O dado que mais me surpreendeu: a grande maioria do que sai é transacional (confirmações, recibos, avisos). Apenas uma parte pequena é proativa (campanhas, aniversários, acompanhamento). Essa parte pequena é a que derruba números.

2. A tese: o WhatsApp não castiga o texto, castiga a falta de conversa

Depois de vários números caídos, o padrão foi sempre o mesmo: o que pesa não é o que você diz, mas para quem você escreve e se te respondem.

  • O banimento é por número, não por sessão nem por negócio. O que uma linha faz não derruba a outra.
  • Os sinais ruins: mensagens que você inicia e ninguém responde, envios para números que jamais te escreveram, e um número recém-vinculado que de repente envia muito.
  • Os sinais bons: pessoas que te escrevem primeiro, respostas, antiguidade do número e entregas limpas.

Com essa ideia montei um «motor de saúde»: uma pontuação de 0 a 100 por número, com semáforo, que responde a uma única pergunta do dono: «posso lançar campanhas hoje?»

3. O motor: 7 componentes

Tudo é medido das minhas próprias tabelas (um registro de cada envio + as mensagens recebidas + as reações). Não consulto nada ao WhatsApp exceto o estado da sessão. Assim, o cálculo demora menos de 1 segundo por número e funciona mesmo se a sessão estiver caída.

ComponentePesoO que medeEscala
Resposta30Das mensagens proativas de 30 dias (com mais de 48 h de vida), quantas receberam resposta ou reaçãoMeta 30% = pontos completos, proporcional abaixo
Bidirecional20Das pessoas com chat em 90 dias, quantas já te escreveram alguma vezMeta 70% = completo
Chats vivos10Pessoas diferentes que te escreveram em 90 dias200+ = 10 · 50+ = 6 · 10+ = 3
Carga muda10Proativas de 30 dias que ficaram SEM resposta (em número absoluto)menos de 50 = 10 · 150 = 6 · 400 = 3 · mais = 0
Frio10Proativas para pessoas sem conversa prévia, e para números que jamais te escreverammais de 5% para números novos = 0
Maturidade10Dias que o número está vinculado60+ = 10 · 30+ = 7 · 14+ = 4
Higiene10Falhas de entrega em 14 dias (sem contar as de sessão caída)menos de 2% = 10 · 5% = 7 · 10% = 4

Rateio: se um componente não pode ser medido (por exemplo, o número não enviou campanhas este mês), não conta nem castiga. A pontuação é «pontos ganhos entre pontos mensuráveis».

Semáforo: verde 70 ou mais, âmbar de 40 a 69, vermelho menos de 40.

Cortes rígidos (mandam sobre a pontuação, não importa quanto tire):
  • Sessão que não está conectada = vermelho.
  • Um erro 463 há menos de 7 dias, ou 3 ou mais em 30 dias = vermelho.
  • Um 463 há 7 a 21 dias = máximo âmbar.
  • Número re-vinculado há menos de 14 dias = máximo âmbar.

JavaScript:
// Núcleo del cálculo (simplificado). null = no medible → se prorratea.
const comps = {
  respuesta:     { max: 30, pts: puntosRespuesta(respondieron, medidos) },
  bidireccional: { max: 20, pts: contrapartes >= 10 ? Math.round(20 * Math.min(1, (vivos / contrapartes) / 0.70)) : null },
  chats_vivos:   { max: 10, pts: vivos >= 200 ? 10 : vivos >= 50 ? 6 : vivos >= 10 ? 3 : 0 },
  carga_muda:    { max: 10, pts: mudos < 50 ? 10 : mudos < 150 ? 6 : mudos < 400 ? 3 : 0 },
  frio:          { max: 10, pts: puntosFrio(enviosFrio, nuevos, frios) },
  madurez:       { max: 10, pts: dias >= 60 ? 10 : dias >= 30 ? 7 : dias >= 14 ? 4 : 0 },
  higiene:       { max: 10, pts: envios14 >= 10 ? escalaFallos(fallos / envios14) : null },
};
let ganados = 0, medibles = 0;
for (const c of Object.values(comps)) if (c.pts !== null) { ganados += c.pts; medibles += c.max; }
const score = medibles ? Math.round(100 * ganados / medibles) : 0;

function puntosFrio(n, nuevos, frios) {
  if (n < 10) return null;                 // muestra chica: no se califica
  if (nuevos / n > 0.05) return 0;         // >5% a números que nunca te escribieron
  if (nuevos > 0) return 4;
  const r = frios / n;                     // sin conversación previa, pero el número ya existía en tu chat
  return r <= 0.10 ? 10 : r <= 0.30 ? 6 : 2;
}

4. O ajuste de hoje: a amostra pequena mentia

Há pouco tempo um número saiu em âmbar (54) e o dono se assustou. A causa: uma única campanha de 6 mensagens. De 5 mensuráveis, nenhum tinha respondido ainda → resposta 0 de 30. E 5 das 6 iam para números novos → frio 0 de 10. Dois componentes em zero por 6 mensagens.

Primeiro testei o óbvio, um mínimo rígido de 10 envios para qualificar. Estava errado: a outro negócio que ia 4 de 6 respostas (excelente) ele tirava seus 30 pontos e o baixava de 77 para 67. Um mínimo rígido apaga a evidência boa da mesma forma que a ruim.

O que deixei é um suavizado bayesiano: somo 10 envios «imaginários» que respondem exatamente à meta (30%). Com poucos dados, a taxa se aproxima da meta; com muitos, manda o dado real.

JavaScript:
const META = 0.30, K = 10;
function puntosRespuesta(respondieron, medidos) {
  if (medidos < 5) return null;
  const tasa = (respondieron + META * K) / (medidos + K);
  return Math.round(30 * Math.min(1, tasa / META));
}
// 0 de 5   → tasa 20% → 20 pts (antes 0)
// 4 de 6   → tasa 44% → 30 pts (se respeta)
// 8 de 53  → tasa 17% → 17 pts (casi igual que sin suavizar)

Resultado: esse número passou de 54 para 82 (verde), vários subiram alguns pontos e nenhum baixou. Para frio sim deixei o mínimo de 10 envios: 5 números novos de 6 não são um padrão de envio massivo.

5. O filtro antes de cada envio proativo

O semáforo apenas diagnostica. O que de verdade protege é um filtro que roda antes de cada mensagem proativa. O transacional (confirmações, recibos) nunca passa por aqui: uma confirmação que não sai é uma falha do produto, e além disso é o tráfego que constrói a reputação do número.

As regras, em ordem. «Bloquear» significa adiar, não descartar:
  1. Sessão caída → não sai nada.
  2. 463 recente → não sai nada.
  3. Semáforo vermelho → não sai nada.
  4. O destinatário já te escreveu alguma vez → passa. Aos conhecidos o WhatsApp tolera.
  5. A frio de um número com menos de 14 dias vinculado, ou em observação por 463 → adiado.
  6. A frio mas é cliente vivo (comprou ou veio nos últimos meses) → passa. Alguém que foi cliente na semana passada não é «frio» embora nunca tenha escrito.
  7. A frio e sem vida comercial (bases importadas velhas) → bloqueado. Se em um número que já perdeu o dispositivo antes, com mais razão.
  8. Número que não existe no WhatsApp → descartado para sempre.

O bloqueio se «reaquece» sozinho: no dia que essa pessoa visita ou escreve, passa sem tocar em nada.

6. O ritmo: orçamento por número, não por campanha

  • Escada de aquecimento por idade do NÚMERO (não do negócio): dia 0 = 5 por dia, dia 3 = 10, dia 7 = 20, dia 30 = 30. Teto rígido: 30 proativas por dia por número.
  • Re-vincular reinicia a escada. Exceção: se é o mesmo número e esteve caído poucas horas, conserva sua maturidade (uma queda de 3 horas me custou 10 dias de bloqueio em um número).
  • A cota é do número: antes eu contava por campanha, e duas campanhas ativas mandavam o dobro pelo mesmo WhatsApp.
  • Reserva para aniversários: as campanhas deixam livre a cota dos aniversariantes do dia. Um aniversário não se adia para amanhã; uma campanha sim.
  • Espaçamento: campanhas com espera aleatória de 45 a 180 segundos e pausas longas a cada 8 a 15 mensagens, apenas em horário comercial. Para todo o resto, um piso de 3 segundos mais 2 aleatórios por número.
  • O transacional é registrado mas nunca é bloqueado. Se os lembretes gastassem a cota, um negócio com muito movimento jamais poderia mandar uma campanha.

7. O que aprendi (do jeito difícil)

Ir devagar não basta. Um número mandava 1 mensagem por hora e tiraram o dispositivo igual, 9 segundos depois de um envio. O problema era a lista: contatos importados de anos atrás que jamais tinham escrito, em um número quase sem tráfego de entrada.

Um número recém re-vinculado é um número novo. Outro número re-escaneou o QR e mandou 18 mensagens nas suas primeiras 2 horas. No dia seguinte tiraram o dispositivo um minuto depois do último envio. Segundo banimento em um mês.

O erro 463 é o melhor alarme que você tem. É o WhatsApp negando ao número iniciar conversa com quem não o tem. Chegou com a sessão em estado «conectada», então é mais confiável que o estado da sessão. Não sai em horas: amadurece em dias e com tráfego de entrada. Tentar novamente só soma sinais de spam. Quando aparece, eu baixo o número para o degrau mais lento da escada.

Verificar se um número existe também custa. Perguntar ao WhatsApp «este número existe?» sobre pessoas com quem você nunca falou é enumeração. Faço isso apenas a frio, com cache de 24 horas e com teto.

«Entregue» nem sempre é entregue. O check duplo que a biblioteca reporta pode vir dos seus próprios dispositivos. Aconteceu comigo com uma conta suspensa: a biblioteca dizia entregue e no telefone havia um check. Para confirmar entrega, olhe o telefone, uma leitura ou uma resposta.

O texto pede ação ou morre. Um gotejamento informativo sem pergunta quase não recebia respostas. As campanhas de «já chegou a sua vez, agendamos?» do mesmo negócio sim respondiam, várias vezes mais. Mesma lista, resultado diferente.

Mensagens idênticas. Gero variações do texto com IA (mesmo sentido, outras palavras) e rotaciono uma por destinatário. Com travas: se a variação inventa um número, uma URL ou muda uma variável, é descartada e sai o original. É uma camada barata, mas o volume e a lista importam muito mais.

Não culpe o proxy sem olhar sua rede. Tive um corte de 42 minutos que parecia queda do provedor de proxies. Era o firewall do próprio servidor. Todas as sessões reconectaram sozinhas, sem perder o vínculo nem mensagens de entrada. Para o WhatsApp isso parece um telefone sem sinal por um tempo.

Duas quedas no mesmo dia não são o mesmo incidente. Revise hora, instância e atividade de cada uma antes de culpar o «problema do dia».

8. Minhas recomendações

  1. Registre cada envio com seu tipo (proativo ou transacional) e se o destinatário já tinha te escrito antes. Sem esse registro você não pode medir nada.
  2. Separe o transacional do proativo. O primeiro nunca é freado; o segundo passa por filtro e cota.
  3. A cota é por número e por idade do número.
  4. Um proxy por número, do seu país, colocado ao criar a sessão.
  5. Escreva primeiro para quem já te conhece. A lista fria é o que derruba números, não a velocidade.
  6. Trate o 463 como alarme vermelho e deixe o número descansar.
  7. Peça resposta em cada campanha. Uma pergunta simples vale mais que um texto bonito.
  8. Com amostras pequenas, não qualifique em zero: suavize para a meta.

9. O que ainda não sei

  • Hoje, se alguém te escreveu há 15 meses, conta igual a se tivesse escrito ontem. Suspeito que esse «passe» deveria caducar (acho que a permissão do WhatsApp para escrever para um contato vence em semanas, não em anos). Tenho isso em modo sombra: anoto quem eu teria freado, sem frear ninguém, até ter dados.
  • Não existe uma tabela pública com limites seguros de velocidade, de resposta ou de contatos novos. Meus limites saem dos meus números e do que é reportado em blogs de provedores. São calibração, não verdade.
  • Os 30% de resposta como meta e os 5% de números novos como corte têm funcionado, mas a amostra ainda é curta.

Se alguém gerencia volume com a via não oficial e quer comparar limites, ou tem um caso de banimento com dados (quantos envios, para quem, quanto tempo estava vinculado), compartilhem. @Brato, você que faz isso com MailWizz, como você gerencia o aquecimento por IP? Acho que a lógica é muito parecida.
 
Última edição:
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
Voltar
Topo