Pular para o conteúdo principal

Privacidade & LGPD

Seus contatos são o ativo mais precioso do seu negócio. O bZapper foi construído para proteger essa base — não só porque a LGPD (Lei 13.709/2018) exige, mas porque um número banido e uma lista queimada custam caro. Esta página descreve os controles de privacidade que já existem no produto e como usá-los.

Divisão de responsabilidade

O bZapper é o operador dos dados: fornece as ferramentas de consentimento, supressão e segurança. Você (o controlador) decide as finalidades e garante a base legal de cada contato. As duas partes precisam trabalhar juntas — o produto automatiza o trabalho pesado; a base legal do consentimento é sua.

A LGPD exige uma base legal para tratar dados pessoais. Para mensagens de marketing e notificações via WhatsApp, a base mais comum é o consentimento — que precisa ser:

  • Livre — sem coação; a pessoa pode dizer não sem prejuízo.
  • Informado — ela sabe quem é você e para que vai receber mensagens.
  • Inequívoco — um "sim" claro (um opt-in ativo, não um pré-marcado).

Outras bases previstas na lei também aparecem no produto: execução de contrato (contract) e legítimo interesse (legitimate_interest) — úteis para mensagens transacionais (OTP, confirmação de pedido, cobrança).

Toda vez que um contato opta por entrar ou por sair, o bZapper pode registrar o evento numa trilha append-only — o consent_ledger. É uma prova datada e imutável de que houve (ou deixou de haver) consentimento, exatamente o que a LGPD pede quando você precisa demonstrar a base legal.

Cada registro guarda:

CampoO que é
phonetelefone normalizado (só dígitos, com DDI)
channelcanal do consentimento (padrão whatsapp)
basisbase legal: consent, contract ou legitimate_interest
grantedtrue = opt-in, false = opt-out registrado
sourceorigem da prova: form, import, api, keyword:parar
evidencetexto/URL da prova (ex.: link do formulário assinado)
created_atdata e hora do evento
Append-only

A trilha só recebe inserções — nunca é editada nem apagada linha a linha. É isso que a torna auditável: o histórico de consentimento de um contato é uma sequência cronológica de fatos, não um estado que você pode reescrever.

Opt-out por palavra-chave

Quem responder PARAR, SAIR, STOP (entre outras) a uma mensagem entra automaticamente na lista de supressão do projeto — e nunca mais recebe disparo. O bZapper detecta o pedido de descadastro no inbound, sem você escrever nada.

Palavras reconhecidas (case-insensitive, tolerante a acento e pontuação):

parar · pare · sair · cancelar · descadastrar · remover · chega
stop · unsubscribe · "sem promoção" · "não quero" · "não perturbe" · "me tira"

A detecção é conservadora: casa a mensagem inteira curta ou a primeira palavra — "não posso parar de te elogiar" não suprime ninguém. Quando o opt-out é registrado pela primeira vez, o bZapper emite o webhook contact.opted_out.

Re-inscrição

Não existe palavra-chave de "voltar/START" no inbound — por segurança, a re-inscrição é sempre manual (um admin remove o contato da supressão). Isso evita que um "start" acidental reabra o canal para quem pediu para sair.

Block list de dois níveis

A supressão protege o seu número (e a reputação dele) barrando o envio antes de a mensagem entrar na fila. Há dois níveis:

  • Parede (sempre barra)opt_out (a pessoa pediu para sair) e manual (um admin bloqueou). Esses nunca furam, nem com force.
  • Inferido (modo estrito)blocked_inferred (mensagens que ficaram em "enviado" e nunca viraram "entregue") e hard_bounce. Esses só barram se a conta ativar o modo estrito (enforce_unreachable_suppression); do contrário são só um sinal.

Cada registro guarda o motivo (reason) e a origem (source, ex.: keyword:parar, campaign:<id>, admin), então você sempre sabe por que um número foi suprimido. A verificação vale para envio avulso e campanha — ela vive no caminho de saída compartilhado.

Mídia privada com presign

Toda mídia de conversa (imagens, áudios, documentos que chegam pelo WhatsApp) é privada:

  • Guardada num bucket privado — nunca num diretório público.
  • Baixada por URL pré-assinada com validade curta (TTL). O padrão é 24 horas (MEDIA_URL_TTL), e o link é regenerado a cada acesso no inbox.
  • O cliente baixa direto do bucket — os bytes não passam pela sua API.
  • As URLs assinadas usam HMAC-SHA256 e são validadas por tempo: link expirado não abre.

Ou seja: um arquivo de conversa não fica "solto" numa URL pública indexável. Sem uma URL assinada e ainda válida, ninguém acessa.

Isolamento por projeto

Dentro da sua conta, cada projeto é um ambiente isolado (veja Conta, projetos e usuários). Números, inbox, keys, estatísticas e a lista de supressão são por projeto. Uma chamada autenticada só enxerga o projeto do qual a chave/sessão faz parte:

  • API key → carrega o projeto embutido; toda operação fica escopada a ele.
  • Sessão no painel → o projeto ativo vai no header X-Project-Id, validado contra a sua conta a cada requisição.

No banco, as consultas são sempre filtradas por tenant_id e project_id — um projeto nunca lê os dados de outro.

Retenção e exclusão

Dados de conversa não ficam para sempre. O bZapper roda uma rotina de retenção que, de acordo com o seu plano, apaga mídia e mensagens antigas:

  • Mídia vencida tem os bytes apagados do bucket (libera cota), preservando a linha da mensagem.
  • Mensagens vencidas são excluídas; a mídia atrelada é apagada antes (garantia de que nada fica órfão no bucket).

A exclusão manual usa o mesmo caminho — apagar uma mensagem apaga a mídia junto.

Outros controles de segurança

  • Webhooks assinados — cada entrega leva X-Bzapper-Signature (HMAC-SHA256) para você verificar a autenticidade; a comparação é timing-safe. Veja Webhooks. O segredo do webhook é criptografado em repouso.
  • Segredos criptografados — as sessões do WhatsApp são criptografadas em repouso; o código do OTP nunca é persistido nem exibido.
  • Rate limiting — cada API key tem um limite de requisições por segundo (token-bucket).
  • Telefone e e-mail normalizados — telefone vira só dígitos com DDI; e-mail é minúsculo no banco — o mesmo contato é reconhecido sem duplicatas.

Checklist para começar certo

  1. Colete consentimento de forma livre, informada e inequívoca — e guarde a prova.
  2. Registre a base legal de cada contato (a trilha existe para isso).
  3. Deixe o opt-out fluir — não bloqueie as palavras-chave; elas protegem você.
  4. Escute o contact.opted_out para sincronizar com o seu CRM.
  5. Respeite a supressão — não tente reimportar quem pediu para sair.
A base legal é sua

O bZapper trata opt-out, supressão e a trilha de consentimento automaticamente, mas quem garante que cada contato autorizou receber suas mensagens é você. Dispare só para quem optou por entrar.