Lista de contatos para WhatsApp: opt-in, higienização e opt-out automático
A lista decide o resultado do disparo antes de a primeira mensagem sair. Como registrar opt-in que serve de prova, limpar número inválido antes de enviar, processar opt-out automaticamente e medir a saúde da base.
A lista decide o resultado do disparo antes de a primeira mensagem sair. Dá para acertar o template, o ritmo e o horário e mesmo assim queimar o número — se a lista estiver errada.
Este artigo trata da lista. Sobre o disparo em si, há as boas práticas de envio em massa; sobre a mecânica de volume, fila, rate limit e retry.
Opt-in que serve de prova
Quase todo sistema guarda opt-in assim:
aceita_whatsapp BOOLEAN DEFAULT FALSE
Isso não é registro de consentimento. É uma afirmação sem prova — e no dia em que alguém questionar, você não tem o que mostrar.
O registro útil guarda circunstância:
CREATE TABLE optin_whatsapp (
id BIGSERIAL PRIMARY KEY,
contato_id BIGINT NOT NULL,
numero VARCHAR(20) NOT NULL,
aceito_em TIMESTAMPTZ NOT NULL,
origem VARCHAR(50) NOT NULL, -- checkout | formulario | atendimento
texto_exibido TEXT NOT NULL, -- o que a pessoa leu ao aceitar
ip INET,
user_agent TEXT,
revogado_em TIMESTAMPTZ -- NULL = ativo
);
O campo que mais falta nos sistemas é o texto_exibido. Consentimento é para uma finalidade — quem aceitou "receber atualizações do meu pedido" não aceitou promoção semanal. Guardar o texto é o que permite responder para que a pessoa disse sim.
revogado_em em vez de DELETE: apagar o registro apaga também a prova de que houve consentimento antes. O histórico é a defesa.
Isso conversa direto com o contrato do seu cliente, se você entrega o sistema e ele opera a base.
O que não é opt-in
- Lista comprada.
- Número raspado de site, grupo ou marketplace.
- "Quem não quiser é só avisar."
- Base de cinco anos atrás sem contato desde então.
- Consentimento para e-mail reaproveitado para WhatsApp.
Todos funcionam por um tempo. Todos terminam igual: bloqueio, denúncia, qualidade do número derrubada, template pausado.
Higienizar antes de disparar
Número inválido não é só desperdício — na API oficial, tentativa de entrega falha conta contra a reputação. Vale filtrar antes.
Normalize primeiro. Base brasileira tem de tudo: (66) 99685-2025, +55 66 99685-2025, 066996852025.
function normalizar(bruto) {
let n = String(bruto).replace(/\D/g, '');
// Tira o zero do DDD: 066... -> 66...
if (n.length > 11 && n.startsWith('0')) n = n.slice(1);
// Sem DDI, assume Brasil
if (n.length === 10 || n.length === 11) n = '55' + n;
if (!n.startsWith('55') || n.length < 12 || n.length > 13) return null;
return n;
}
Depois confira quem realmente tem WhatsApp:
async function higienizar(numeros) {
const validos = [];
for (const bruto of numeros) {
const n = normalizar(bruto);
if (!n) { await marcar(bruto, 'formato_invalido'); continue; }
const existe = await wa.contact.checkNumber(n);
if (!existe) { await marcar(n, 'sem_whatsapp'); continue; }
validos.push(n);
await esperar(200); // a verificação também tem limite
}
return validos;
}
Rode isso antes da campanha, não durante. E guarde o resultado: reverificar a base inteira a cada envio é desperdício.
Opt-out automático
Ignorar pedido de descadastro é o caminho mais rápido para a denúncia — e denúncia pesa muito mais que bloqueio.
const SAIDA = /^\s*(sair|parar|cancelar|descadastrar|remover|stop|pare)\s*!?\.?\s*$/i;
async function processar(msg) {
if (SAIDA.test(msg.text.body)) {
await registrarOptOut(msg.from);
await enviar(msg.from, 'Pronto, você não receberá mais nossas mensagens. ' +
'Se precisar de algo, é só escrever aqui.');
return; // não segue para o atendimento normal
}
await atendimentoNormal(msg);
}
A regex casa a mensagem inteira, de propósito. Buscar a palavra solta marcaria como opt-out quem escreveu "quero cancelar meu pedido" — que é um cliente pedindo atendimento, não descadastro.
O erro que quase todo mundo comete: checar opt-out só na hora de montar a campanha. Uma campanha de 50 mil contatos leva horas para escoar, e quem pede para sair no minuto 10 continua recebendo por horas. A checagem tem que estar na hora de enviar cada mensagem:
// no worker, imediatamente antes do envio
if (await estaEmOptOut(job.data.to)) return; // saiu depois de enfileirado
E deixe a saída visível. Um "responda SAIR para não receber mais" no rodapé do template converte denúncia em opt-out — a diferença entre perder um contato e machucar o número.
Medir a saúde da base
Três indicadores, por campanha:
| Indicador | O que observar |
|---|---|
| Taxa de entrega | Abaixo de 95%, a base tem número morto — higienize |
| Bloqueios | Subindo, o conteúdo não corresponde ao que foi consentido |
| Denúncias | Qualquer aumento é grave; é o que mais derruba número |
Se bloqueio e denúncia sobem, mandar mais piora. A resposta é reduzir frequência, revisar o conteúdo e reconfirmar o opt-in dos contatos antigos. Como acompanhar esses números está em métricas de campanha.
Reconfirmar base antiga
Base parada há mais de um ano é praticamente uma base nova, e disparar promoção nela é pedir denúncia. O caminho seguro é uma mensagem única de utilidade, com saída explícita:
Oi, Ana! Faz um tempo que não falamos. Quer continuar recebendo novidades da Loja Exemplo por aqui? Responda SIM para continuar ou SAIR para não receber mais.
Quem não responde não é "sim". É silêncio — e silêncio, na dúvida, se trata como saída.
Conclusão
Lista boa é lista pequena o suficiente para você saber de onde veio cada contato. A tentação de disparar para todo mundo é forte, e o custo aparece uma campanha depois: qualidade derrubada, template pausado, número no limite.
Opt-in com prova, higienização antes do envio, opt-out checado na hora de mandar e três indicadores acompanhados. Nenhuma dessas quatro coisas é difícil — todas são chatas, e é por isso que quase ninguém faz.
Pronto para automatizar seu WhatsApp?
Crie sua conta gratuita e comece a enviar mensagens pela API em minutos.
Começar grátisPerguntas frequentes
O que é opt-in no WhatsApp e como registrar?+
É o consentimento da pessoa para receber suas mensagens naquele canal. Registrar significa guardar quando, onde e como ele foi dado: data e hora, origem (formulário, checkout, atendimento), o texto exibido no momento e o identificador da sessão. Uma coluna booleana 'aceitou' não é registro de opt-in — é uma afirmação sem prova.
Como saber se um número tem WhatsApp antes de enviar?+
A API tem verificação de número. Rodar essa checagem na base antes do disparo remove os inválidos, e isso importa porque tentativa de envio para número inexistente conta contra a reputação do seu número na API oficial.
Como funciona o opt-out automático?+
Você detecta no webhook as palavras de descadastro (sair, parar, cancelar, descadastrar), marca o contato como opt-out no banco antes de qualquer outro processamento e confirma para a pessoa. O ponto crítico é que a checagem de opt-out precisa acontecer na hora de enfileirar cada envio, não só na montagem da campanha.
Preciso de opt-in mesmo na API não oficial?+
Legalmente sim: a LGPD trata do tratamento de dados pessoais, não da tecnologia usada para enviar. Na prática também, porque bloqueio e denúncia de usuário derrubam qualquer número, oficial ou não. A API não oficial não fiscaliza o opt-in, o que aumenta a sua responsabilidade em vez de reduzi-la.
Quantas mensagens minha base aguenta antes de queimar?+
Não é o volume que queima, é a taxa de rejeição. Uma base de 50 mil contatos com opt-in recente e conteúdo esperado tem menos problema que uma base de 500 comprada. Acompanhe bloqueios e denúncias por campanha: quando esse número sobe, o problema é a lista ou o conteúdo, e mandar mais só acelera o dano.
Continue lendo
Como criar um chatbot de IA com a API da OpenAI para responder no WhatsApp
Um webhook, uma chamada à API da OpenAI e uma resposta pela WAME API: o código completo de um chatbot de IA que atende no WhatsApp, Instagram e Messenger. Com memória por contato, controle de custo e o que fazer quando a IA não deve responder.
Cobrança por Pix dentro do WhatsApp pela API: como enviar e o que muda na conversão
Mandar o código Pix no WhatsApp resolve o pior ponto da cobrança digital: o cliente não precisa sair do app. Como enviar a cobrança pela API, tratar a confirmação e evitar os erros que transformam a facilidade em suporte.
Erros da API do WhatsApp: o que cada um significa e como tratar
A mensagem não saiu e o log diz apenas 'erro ao enviar'. Os erros que você vai encontrar de verdade — janela fechada, número inválido, template não aprovado, limite atingido, instância caída — e o tratamento certo para cada um.