Raphael Serafim· Publicado em 10 de setembro de 2026· 9 min de leitura

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.

Ver como Markdown

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:

IndicadorO que observar
Taxa de entregaAbaixo de 95%, a base tem número morto — higienize
BloqueiosSubindo, o conteúdo não corresponde ao que foi consentido
DenúnciasQualquer 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átis

Perguntas 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