Carlos Arreola
Admin
Sigma
Verificado
Verificación en dos pasos activada
Verificado por Binance
¡Excelente comerciante!
Usuário popular!
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.
| Componente | Peso | O que mede | Escala |
|---|---|---|---|
| Resposta | 30 | Das mensagens proativas de 30 dias (com mais de 48 h de vida), quantas receberam resposta ou reação | Meta 30% = pontos completos, proporcional abaixo |
| Bidirecional | 20 | Das pessoas com chat em 90 dias, quantas já te escreveram alguma vez | Meta 70% = completo |
| Chats vivos | 10 | Pessoas diferentes que te escreveram em 90 dias | 200+ = 10 · 50+ = 6 · 10+ = 3 |
| Carga muda | 10 | Proativas de 30 dias que ficaram SEM resposta (em número absoluto) | menos de 50 = 10 · 150 = 6 · 400 = 3 · mais = 0 |
| Frio | 10 | Proativas para pessoas sem conversa prévia, e para números que jamais te escreveram | mais de 5% para números novos = 0 |
| Maturidade | 10 | Dias que o número está vinculado | 60+ = 10 · 30+ = 7 · 14+ = 4 |
| Higiene | 10 | Falhas 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:
- Sessão caída → não sai nada.
- 463 recente → não sai nada.
- Semáforo vermelho → não sai nada.
- O destinatário já te escreveu alguma vez → passa. Aos conhecidos o WhatsApp tolera.
- A frio de um número com menos de 14 dias vinculado, ou em observação por 463 → adiado.
- 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.
- 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.
- 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
- 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.
- Separe o transacional do proativo. O primeiro nunca é freado; o segundo passa por filtro e cota.
- A cota é por número e por idade do número.
- Um proxy por número, do seu país, colocado ao criar a sessão.
- Escreva primeiro para quem já te conhece. A lista fria é o que derruba números, não a velocidade.
- Trate o 463 como alarme vermelho e deixe o número descansar.
- Peça resposta em cada campanha. Uma pergunta simples vale mais que um texto bonito.
- 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: