Pular para o conteúdo principal

Consent LGPD + Google Consent Mode v2

A plataforma é compliant com LGPD (Brasil) + Google Consent Mode v2 (GCM v2). Esta página explica como funciona o banner, as 4 categorias de cookies, e como o consent é propagado pros pixels.

O banner

Banner anchored bottom-left (desktop) / bottom edge (mobile), com 3 ações:

AçãoComportamento
Aceitar todos{ necessary, performance, functionality, others } = all true
Recusar{ necessary: true, demais: false }
PersonalizarAbre painel com toggles individuais por categoria

Persistido em cookie cookies_consent com TTL de 12 meses. Após 12 meses o banner reaparece pra renovação de consent (regra LGPD).

Quando o banner aparece

  • Brand tem brand.features.cookieConsentPopup === true no backoffice
  • User não tem cookie cookies_consent válido (não aceitou ainda OU expirou)
  • User não é bot (Lighthouse / Googlebot bypass)

Quando o banner é suprimido

  • cookies_consent válido existe (já aceitou)
  • Brand desativou cookieConsentPopup no backoffice
  • User é bot (Lighthouse score não pode ser afetado)
  • Modal de auth/payment está aberto (banner não compete com z-index)

4 categorias de cookies

CategoriaDefaultPode desativar?Cookies aqui
Necessáriosgranted (sempre)Nãojwt_token, cookies_consent, __cf_bm, _cfuvid
Performancedenied até consentSim_ga, _gid, _gat, GA4 client cookies
Funcionalidadedenied até consentSimpreferências, idioma, layout settings
Outros / marketingdenied até consentSimcookie_tracking, cookie_referrer, rmkvera, rmkvera_aud, _fbp, _fbc, lastclick, etc

"Aceitar com só necessary toggled" → coerce pra Aceitar Tudo

Paridade legado: se user clica "Salvar" no painel "Personalizar" com apenas necessary ligado (todas outras desativadas), o sistema coerce pra Aceitar Tudo.

Razão: "só necessários" é equivalente a "Recusar" (mesma decisão), mas se user ativamente foi até "Personalizar" e clicou Salvar, é UX confusa retornar pra mesma decisão. Comportamento legado coerce — mantemos.

GCM v2 é o protocolo do Google pra propagar consent pros tags GTM. Requer 7 sinais no dataLayer antes do GTM carregar.

Mapping: 4 categorias → 7 sinais GCM

necessary → security_storage (sempre granted, GCM exige explícito)

performance → analytics_storage

functionality → functionality_storage
+ personalization_storage

others → ad_storage
+ ad_user_data
+ ad_personalization

Diagrama do mapping

// Injetado no dataLayer ANTES do GTM carregar
gtag('consent', 'default', {
analytics_storage: 'denied',
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
functionality_storage: 'denied',
personalization_storage: 'denied',
security_storage: 'granted', // sempre granted
});

GTM (e tags Meta/Google/etc) honram esses defaults — pixels disparam em modo limitado (sem cookies de identificação).

gtag('consent', 'update', {
analytics_storage: 'granted', // user marcou performance
ad_storage: 'granted', // user marcou others
// etc
});

GTM dispara fanout — qualquer tag que estava esperando consent agora roda em modo full.

Modo "cosmetic-only" (cookieConsentCosmeticOnly)

Brands com autorização conjunta de marketing + compliance podem ativar featuresConfig.cookieConsentCosmeticOnly: true. Detalhes em Modo Cosmético.

Bot bypass

Banner não aparece pra bots (Googlebot, Lighthouse, AdsBot). Razão:

  • Lighthouse score é prejudicado por banner overlay
  • Googlebot indexação não precisa interagir com banner
  • AdsBot validação de landing pages quebraria com banner

Detection via User-Agent (isBotRequest) no server.

Migração de formato legado

Versões anteriores do cookie usavam formato array (["necessary", "performance"]). O parser detecta esse formato e converte pra objeto novo automaticamente, preservando preferências do user.

// Cookie legado (array)
["necessary", "performance"]

// Lido e convertido pra
{
necessary: true,
performance: true,
functionality: false,
others: false,
timestamp: 1731000000000
}

Sem necessidade de re-prompt — user mantém suas escolhas.

Como debuggar

DevTools → Cookies → cookies_consent:

{
"necessary": true,
"performance": true,
"functionality": false,
"others": true,
"timestamp": 1731000000000
}

GCM v2 signals

// Console
window.dataLayer.filter(e => e[0] === "consent")

Mostra default e update commands.

Pixel comportamento limitado

Meta Pixel quando ad_storage: denied:

  • Não escreve _fbp, _fbc
  • Não dispara init matching
  • Eventos disparam mas em modo "no cookies"

Configuração por brand

brand.features.cookieConsentPopup (controlado no backoffice/BFF):

  • true → banner habilitado, mostra na primeira visita
  • false → banner suprimido (brand sem requisito LGPD ativo, ou modo cosmetic — ver próxima página)

Adicionalmente featuresConfig.cookieConsentCosmeticOnly (frontend) — ver Modo Cosmético.

Anti-patterns

  1. Desativar cookieConsentPopup numa brand BR ativa. Não-compliance LGPD. Pode ser autuado.
  2. Ativar cookieConsentCosmeticOnly sem aprovação compliance. Idem.
  3. Setar analytics_storage: granted no default (sem user consent). Quebra GCM v2 compliance.
  4. Esquecer security_storage: granted no default. GCM v2 exige os 7 sinais explicitamente — esquecimento pode causar GTM warnings.
  5. Não testar comportamento "Recusar" ao desenvolver tag GTM nova. Tag pode estar exigindo cookies que o user negou — falha silenciosa.