Usei minha própria lib de LGPD no meu próprio site. Achei 2 bugs.
O site da 9LEVEL precisava de Google Analytics. Quem vende conformidade LGPD não pode carregar cookie de medição antes do consentimento, e nós temos uma lib open source publicada exatamente para isso: o lgpd-consent. Chegou a hora de comer a própria ração. Achei dois bugs. Este artigo é sobre eles, e sobre por que isso foi uma boa notícia.
O que é dogfooding
O termo vem da indústria de software: usar o próprio produto no dia a dia, como um cliente usaria. A tradução literal é feia, "comer a própria ração de cachorro", mas a lógica é séria. Se você não usa o que publica, quem testa de verdade é o seu usuário. E ele testa em produção, sem avisar.
A instalação
O plano era simples. Banner de consentimento em modo opt-in, Google Analytics 4 carregando somente depois do aceite, e nada de cookie antes disso.
O caminho feliz funcionou de primeira. Banner abriu, aceite registrado, GA4 carregou, pageview apareceu no Tempo Real. Qualquer teste superficial terminaria aqui, com aprovação.
O problema apareceu no passo seguinte. Queríamos eventos de negócio: cliques de WhatsApp com a origem de cada
clique e uma conversão na página de obrigado do formulário. E o gtag simplesmente não existia.
Bug 1: o gtag que não existia
O código original da lib fazia isto ao carregar o Analytics:
// antes (v1.0.0)
function loadGoogleAnalytics() {
// ...injeta o script do GA4...
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', LGPD_CONFIG.googleAnalyticsId);
}
Uma função declarada dentro de outra função vive no escopo local. O gtag morria ali dentro.
A parte traiçoeira: o pageview funciona mesmo assim, porque o script do Google processa o
dataLayer diretamente. O painel mostra a visita. Tudo parece pronto. Mas
window.gtag é undefined, e qualquer outro script do site que tente disparar um
evento customizado falha.
A correção tem uma linha:
// depois (v1.0.1)
window.gtag = function(){dataLayer.push(arguments);};
É o pior tipo de bug: o que passa no teste de quem instala. A visita aparece no painel, o assunto é dado por encerrado, e o problema só se revela semanas depois, quando alguém precisa medir algo além do pageview.
Bug 2: a tabela de transparência declarava o domínio errado
A lib mostra uma tabela de cookies no modal de preferências: nome, domínio, expiração e descrição de cada um. É o coração do disclosure exigido pela LGPD.
Essa tabela declarava o cookie _ga no domínio google.com. Só que o
_ga é um cookie first-party: o script do Google grava ele no domínio do seu próprio site.
Numa lib qualquer, seria um detalhe. Numa lib de conformidade, a tabela de transparência é o produto. Disclosure errado é pior que código errado.
De quebra, a tabela listava o _gid, cookie da era Universal Analytics. O GA4 usa
_ga e _ga_*. Atualizamos isso também.
O que fica de lição
- Caminho feliz não é teste. O banner abria, o consentimento valia, o GA media. E dois bugs dormiam ali desde o primeiro release, invisíveis para quem só olha o painel.
- Dogfooding acha o que revisão não acha. Os bugs só apareceram porque precisávamos de eventos reais, num site real, com uma exigência real de conformidade. Nenhuma leitura de código teria a mesma pressão.
- Errar em público, corrigir em público. A v1.0.1 está no ar com changelog explicando os dois bugs, o porquê de cada um e a correção. Código aberto não é vitrine de perfeição. É histórico de manutenção.
O resultado
A v1.0.1 está publicada, com as correções na lib e nos dois exemplos. O site da 9LEVEL roda a versão corrigida: banner opt-in, GA4 só depois do aceite, eventos de negócio funcionando e a tabela de cookies dizendo a verdade.
E o princípio que fica vale para muito além de uma lib de cookies. "Parece funcionando" e "verificado" são estados diferentes. É a mesma distância que existe entre o backup que roda todo dia e o backup que já provou que restaura.
Pós-escrito: o terceiro bug
Atualização de 21 de julho de 2026, horas depois de publicar.
Este artigo saiu dizendo "achei 2 bugs". O título envelheceu no mesmo dia.
Ao testar os cookies em produção, o Analytics não aparecia depois do aceite. A causa: o wrapper da lib falava a API da versão 2 do CookieConsent com o motor da versão 3, que a própria lib distribui. E a v3 ignora chaves desconhecidas em silêncio. O callback de aceite nunca disparava, e o GA só carregava no acesso seguinte, por causa de um fallback de 1 segundo.
Tem mais. O exemplo copy-paste do repositório usava initCookieConsent(), função que só existe na
v2. Com os arquivos v3, a inicialização ficava em loop eterno, esperando uma função que nunca chegaria. Aquele
exemplo nunca funcionou como publicado.
A v1.0.2 corrige a lib, reescreve o exemplo do zero e atualiza o demo.
No fim, a tese do artigo saiu mais forte do que entrou. O caminho feliz passou de novo: banner no ar, aceite registrado, pageview medido. O terceiro bug só apareceu porque alguém abriu as ferramentas do navegador e conferiu os cookies um a um, na mesma página do aceite. Publicar um artigo sobre dogfooding não acha bug. Usar acha. De novo.
A diferença entre "parece" e "verificado"
É o que o diagnóstico gratuito procura no seu ambiente: backup, acessos, monitoramento e conformidade, testados de verdade. O relatório é seu, com ou sem contrato.
Agendar diagnóstico gratuito