← Blog
Open Source

Usei minha própria lib de LGPD no meu próprio site. Achei 2 bugs.

21 de julho de 2026 · 7 min de leitura · com pós-escrito no mesmo dia

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

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
JL

Juliano Liberato, fundador da 9LEVELMais de 15 anos operando infraestrutura e segurança em setores regulados. 1.500+ dispositivos sob gestão a partir de Joinville, SC.

Leia também
12 perguntas que expõem um fornecedor de TI amador Zabbix na prática: como monitoramos 1.500 dispositivos sem enlouquecer