Banner de cookie que não implora
Por que a medição de audiência não precisa de opt-in, por que Recusar tem o mesmo peso visual de Aceitar, e como avisar que o texto do chat vai para a China.
Parte 4 da série sobre adequar meu site à LGPD. Depois de minimizar e fazer a exclusão funcionar, chegou a parte que todo mundo odeia: o banner.
Odeia com razão. A maioria dos banners é hostil por projeto — “Aceitar tudo” em azul vibrante, “Gerenciar preferências” em cinza claro, três cliques até conseguir recusar. Isso não é conformidade, é conformidade encenada.
Queria fazer diferente. E, para isso, precisei primeiro entender que nem todo tratamento precisa de consentimento.
Consentimento não é a base legal padrão
Erro comum: achar que a LGPD exige consentimento para tudo. Ela lista dez bases legais no art. 7º, e consentimento é apenas uma — e, na prática, uma das piores, porque pode ser revogada a qualquer momento e exige prova de que foi obtida livremente.
No meu site, quase nada roda por consentimento:
- Dados da conta → execução de contrato. Você pediu o serviço.
- Endereço de entrega → execução de contrato.
- Nota fiscal → obrigação legal.
- Medição de audiência → legítimo interesse.
- Envio de conteúdo para IA no exterior → aí sim, consentimento.
Pedir consentimento para o que já tem outra base legal não é ser cuidadoso: é enganar. Se eu perguntasse “você autoriza usarmos seu endereço para entregar seu pedido?”, a pergunta seria falsa — sem endereço não há entrega, então não existe escolha real. Consentimento sem alternativa não é consentimento.
Legítimo interesse tem um preço
Usar legítimo interesse não é uma porta dos fundos. Ele exige um teste de balanceamento (art. 10) que você precisa conseguir defender:
Finalidade — entender quais conteúdos e produtos são procurados, para priorizar o que melhorar. Concreta e específica; “melhorar a experiência” não serviria.
Necessidade — não há forma menos invasiva de saber isso. E já reduzi ao mínimo: sem IP, sem User-Agent bruto, sem identificador que sobreviva ao fechamento da aba.
Expectativa legítima — medição própria é prática esperada em qualquer site. O que quebraria a expectativa seria compartilhar com anunciantes. Não faço, e nem teria como: nenhum terceiro recebe esses dados.
Direitos e liberdades — o risco de reidentificação existe, é baixo, e é compensado por retenção curta e recusa fácil.
Esse raciocínio está escrito no RIPD. Sem ele documentado, o legítimo interesse é só uma palavra que você usou para não pedir permissão.
As duas regras do banner
Regra 1: recusar tem o mesmo peso de aceitar
Os dois botões são visualmente idênticos. Mesma cor, mesmo tamanho, mesma borda, mesma tipografia. “Recusar medição” e “Entendi”.
Deixei um comentário no CSS explicando que diferenciá-los transforma isso em dark pattern e compromete a validade jurídica da recusa. É exatamente o tipo de coisa que alguém “melhora” seis meses depois, com boa intenção, sem saber o custo.
Regra 2: a recusa vale no servidor
Essa é a que quase ninguém implementa.
O caminho preguiçoso é guardar a escolha no navegador e checar antes de disparar a medição. Funciona para o usuário comum. Mas quem chamar a API diretamente contorna, e — mais importante — você não tem como provar que respeita a recusa. Um gate só no cliente é uma promessa, não um controle.
Então a escolha vai num cookie que o servidor lê, e o endpoint de medição verifica antes de gravar. Se a pessoa recusou, nenhuma linha entra no banco, nem que alguém force a requisição na mão.
Detalhe pequeno e satisfatório: o identificador de sessão só é gerado depois do gate. Quem recusou não recebe nem identificador.
O que fazer quando o cookie some
Uma decisão que precisei tomar explicitamente: se o cookie estiver ausente ou corrompido, a medição roda ou não?
Escolhi rodar, e o banner reaparece.
O raciocínio: a base legal é legítimo interesse, então a ausência de escolha permite — o que a lei exige aí é transparência e recusa fácil, não permissão prévia. E a alternativa seria pior: um bug de cookie zeraria a medição em silêncio, sem que ninguém percebesse por meses.
A recusa explícita, essa, é sempre respeitada. Registrei a decisão no RIPD para que ela seja uma escolha defensável e não um acidente.
A parte difícil: seu texto vai para a China
O estúdio de IA manda o que o usuário escreve para provedores fora do Brasil. Estados Unidos, na maioria — mas DeepSeek e Qwen são empresas chinesas.
Isso é transferência internacional (art. 33). E aqui não dá para usar legítimo interesse ou execução de contrato: o conteúdo é livre, a pessoa pode escrever qualquer coisa, e a China não tem decisão de adequação da ANPD. O inciso VIII exige consentimento específico e destacado.
“Destacado” tem significado prático: não vale enterrar na política de privacidade. Precisa aparecer onde o tratamento acontece.
Três decisões sobre esse aviso
Aparece no primeiro envio, não ao abrir a página. Quem só está olhando não precisa ser interrompido, e o consentimento deve ser contemporâneo ao tratamento.
Nomeia os países e destaca a China. A lista mostra cada provedor com sua jurisdição, e as jurisdições sem decisão de adequação aparecem primeiro, sinalizadas. Enterrar essa informação no fim de uma lista seria tecnicamente correto e praticamente desonesto.
Quem manda é o servidor. Esta foi a decisão mais importante. O modal não é aberto por uma checagem no navegador — ele é aberto pela resposta do servidor. Sem o consentimento registrado, a API responde com o código 428 (Precondition Required) e não processa nada. O modal é a reação a esse código.
A diferença é tudo. Se a checagem fosse no cliente, bastaria chamar a API direto para pular o aviso, e o consentimento seria decorativo. Do jeito que ficou, não existe caminho que contorne — inclusive para mim, quando eu esquecer que implementei isso.
Registrar não é opcional
Cada decisão vira uma linha nova numa tabela que nunca sofre atualização, só inserção. Assunto, decisão, versão da política vigente, origem, data.
O “versão da política vigente” é o detalhe que faz a diferença. Consentimento sem saber sob qual texto foi dado não prova nada — se eu reescrever a política amanhã, o aceite de ontem se refere a quê? Com a versão gravada, dá para reconstruir exatamente o que a pessoa leu.
E quando eu subir a versão do documento, o banner reaparece sozinho.
O que ficou
Um aviso discreto na primeira visita, com dois botões iguais, que some para sempre depois de um clique. Um modal no chat que aparece uma vez, explica para onde o texto vai, e pode ser revogado nas configurações.
Nenhuma parede de “gerenciar 47 parceiros publicitários”, porque não existem 47 parceiros publicitários. Quando você não tem nada para esconder, o banner fica curto.
Na parte 5, a última: os documentos de governança, e um cron que avisa quando morre — porque o anterior morreu sem avisar.