Pular para conteúdo

Gerenciamento de Consentimento

Visão Geral

O Gerenciamento de Consentimento é o núcleo da conformidade com a LGPD no Complyr. Este sistema permite que websites coletem, armazenem, rastreiem e gerenciem consentimentos de usuários de forma granular, transparente e auditável.

O Complyr implementa um sistema de consentimento que atende todos os requisitos legais da LGPD (Lei Geral de Proteção de Dados - Lei 13.709/2018), especialmente:

  • Art. 7º, I: Consentimento explícito e informado do titular
  • Art. 8º, § 5º: Consentimento destacado de outras cláusulas contratuais
  • Art. 9º, § 1º: Não aceitação não pode impedir acesso ao serviço (exceto cookies essenciais)
  • Art. 18: Direitos do titular (acesso, correção, exclusão, portabilidade)

O Que é Consentimento na LGPD?

Segundo o Art. 5º, XII da LGPD:

Consentimento: manifestação livre, informada e inequívoca pela qual o titular concorda com o tratamento de seus dados pessoais para uma finalidade determinada.

Características do Consentimento LGPD

Característica Descrição Como o Complyr Implementa
Livre Sem coação ou vício de vontade Usuário pode aceitar ou recusar sem bloqueio de acesso
Informado Titular sabe para que seus dados serão usados Banner explica claramente cada finalidade
Inequívoco Ação afirmativa clara (não pode ser implícito) Requer clique em botão, não aceita scroll ou inércia
Finalidade Determinada Consentimento para propósito específico Controle granular por 5 finalidades (Analytics, Marketing, etc.)
Revogável Titular pode revogar a qualquer momento Método revokeConsent() disponível

Fluxo de Coleta de Consentimento

sequenceDiagram
    participant U as Usuário
    participant B as Browser
    participant S as Script Complyr
    participant L as LocalStorage
    participant A as API Backend

    U->>B: Acessa website
    B->>S: Carrega script Complyr
    S->>L: Verifica consentimento existente

    alt Consentimento existe e válido
        L-->>S: Retorna consentimento
        S->>S: Ativa finalidades concedidas
        S->>B: Site carrega normalmente
    else Consentimento não existe ou expirado
        S->>B: Exibe banner de consentimento
        B->>U: Mostra opções (Aceitar/Rejeitar/Customizar)

        alt Usuário aceita todos
            U->>S: Clica "Aceitar Todos"
            S->>L: Salva consentimento GRANTED
            S->>A: Envia consentimento para backend
            S->>S: Ativa todas as finalidades
        else Usuário customiza
            U->>S: Clica "Gerenciar Preferências"
            S->>B: Exibe modal de customização
            U->>S: Seleciona finalidades desejadas
            S->>L: Salva consentimento PARTIAL
            S->>A: Envia consentimento para backend
            S->>S: Ativa finalidades selecionadas
        else Usuário rejeita todos
            U->>S: Clica "Rejeitar Todos"
            S->>L: Salva consentimento DENIED
            S->>A: Envia consentimento para backend
            S->>S: Mantém apenas essenciais
        end

        A-->>S: Confirma salvamento
        S->>B: Dispara evento 'consent-updated'
        B->>B: Tags de terceiros ativadas/bloqueadas
    end

Estrutura de Armazenamento

LocalStorage (Frontend)

O Complyr armazena o consentimento do usuário em localStorage para persistência local:

// Chave: complyr_consent_{workspaceId}
{
  "workspaceId": "550e8400-e29b-41d4-a716-446655440000",
  "consentId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "status": "PARTIAL",
  "purposes": {
    "essential": {
      "granted": true,
      "grantedAt": "2025-01-15T10:00:00.000Z"
    },
    "analytics": {
      "granted": true,
      "grantedAt": "2025-01-15T10:00:00.000Z"
    },
    "marketing": {
      "granted": false,
      "grantedAt": null
    },
    "personalization": {
      "granted": true,
      "grantedAt": "2025-01-15T10:00:00.000Z"
    },
    "third_party": {
      "granted": false,
      "grantedAt": null
    }
  },
  "createdAt": "2025-01-15T10:00:00.000Z",
  "updatedAt": "2025-01-15T10:00:00.000Z",
  "expiresAt": "2026-01-15T10:00:00.000Z",
  "version": "1.0"
}

Características: - Persistência: Sobrevive fechamento do navegador - Escopo: Por domínio e workspace - Tamanho: ~1-2 KB por consentimento - Expiração: 12 meses (renovação automática ao revisitar)

Backend (Auditoria e Compliance)

Todos os consentimentos são enviados ao backend para:

// Tabela: consent_schema.consents
{
  id: "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  workspaceId: "550e8400-e29b-41d4-a716-446655440000",
  templateId: "abc12345-6789-0def-1234-567890abcdef",
  status: "PARTIAL",
  purposeRecords: [
    {
      purposeId: "analytics",
      granted: true,
      grantedAt: "2025-01-15T10:00:00.000Z",
      revokedAt: null
    },
    {
      purposeId: "marketing",
      granted: false,
      grantedAt: null,
      revokedAt: null
    }
  ],
  userAgent: "Mozilla/5.0...",
  ipAddress: "203.0.113.42",  // Hasheado com SHA-256
  language: "pt-BR",
  createdAt: "2025-01-15T10:00:00.000Z",
  updatedAt: "2025-01-15T10:00:00.000Z",
  expiresAt: "2026-01-15T10:00:00.000Z"
}

Benefícios do Armazenamento Backend: - ✅ Auditoria completa para compliance - ✅ Prova legal de consentimento obtido - ✅ Relatórios e dashboards de aceitação - ✅ Sincronização cross-device (opcional) - ✅ Histórico de mudanças - ✅ Proteção contra manipulação local

Estados de Consentimento

O Complyr rastreia 6 estados diferentes de consentimento:

1. NONE (Nenhum Consentimento)

Quando: Usuário nunca interagiu com o banner de consentimento.

Comportamento: - Banner de consentimento exibido - Apenas cookies essenciais permitidos - Tags de terceiros bloqueadas - Google Analytics, Facebook Pixel não executam

Exemplo de Detecção:

const consent = localStorage.getItem('complyr_consent_' + workspaceId);
if (!consent) {
  console.log('Estado: NONE - Exibir banner');
}

2. GRANTED (Todas Finalidades Aceitas)

Quando: Usuário clicou "Aceitar Todos" no banner.

Comportamento: - Banner oculto - Todas as finalidades ativadas - Cookies essenciais + analytics + marketing + personalization + third_party - Tags de terceiros ativadas (GTM, FB Pixel, etc.)

LocalStorage:

{
  "status": "GRANTED",
  "purposes": {
    "essential": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "analytics": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "marketing": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "personalization": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "third_party": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" }
  }
}

3. PARTIAL (Algumas Finalidades Aceitas)

Quando: Usuário customizou preferências (aceitou algumas, rejeitou outras).

Comportamento: - Banner oculto - Apenas finalidades aceitas ativadas - Controle granular por finalidade - Tags ativadas conforme escolhas

Exemplo:

{
  "status": "PARTIAL",
  "purposes": {
    "essential": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "analytics": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "marketing": { "granted": false, "grantedAt": null },
    "personalization": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "third_party": { "granted": false, "grantedAt": null }
  }
}

Interpretação: - ✅ Analytics ativado (Google Analytics pode executar) - ❌ Marketing bloqueado (Facebook Pixel bloqueado) - ✅ Personalization ativado (Recomendações permitidas) - ❌ Third Party bloqueado (Chat ao vivo bloqueado)

4. DENIED (Todas Finalidades Negadas)

Quando: Usuário clicou "Rejeitar Todos" no banner.

Comportamento: - Banner oculto - Apenas cookies essenciais permitidos - Tags de terceiros completamente bloqueadas - Google Analytics, Facebook Pixel não executam

LocalStorage:

{
  "status": "DENIED",
  "purposes": {
    "essential": { "granted": true, "grantedAt": "2025-01-15T10:00:00Z" },
    "analytics": { "granted": false, "grantedAt": null },
    "marketing": { "granted": false, "grantedAt": null },
    "personalization": { "granted": false, "grantedAt": null },
    "third_party": { "granted": false, "grantedAt": null }
  }
}

Importante: Essential sempre granted: true (legítimo interesse - Art. 7º, IX LGPD).

5. REVOKED (Consentimento Revogado)

Quando: Usuário revogou consentimento anteriormente concedido.

Comportamento: - Consentimento anterior invalidado - Cookies removidos (exceto essenciais) - Tags de terceiros desativadas - LocalStorage limpo - Backend notificado da revogação

Transição:

GRANTED/PARTIAL → REVOKED → NONE

Como Revogar:

// Usuário revoga consentimento
window.complyr.revokeConsent('Usuário solicitou exclusão de dados');

// Sistema limpa dados
localStorage.removeItem('complyr_consent_' + workspaceId);
document.cookie.split(";").forEach(cookie => {
  // Remove cookies não essenciais
  if (!isEssentialCookie(cookie)) {
    document.cookie = cookie + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
  }
});

6. EXPIRED (Consentimento Expirado)

Quando: Passaram-se 12 meses desde a concessão do consentimento.

Comportamento: - Banner exibido novamente - Consentimento anterior invalidado - Usuário deve reconfirmar escolhas - Tags bloqueadas até nova confirmação

Lógica de Expiração:

// Verificação de expiração
const consent = JSON.parse(localStorage.getItem('complyr_consent_' + workspaceId));
const now = new Date();
const expiresAt = new Date(consent.expiresAt);

if (now > expiresAt) {
  console.log('Estado: EXPIRED - Solicitar novo consentimento');
  displayBanner();
}

LGPD: Art. 8º, § 6º - Consentimento pode expirar se não houver renovação periódica.

Ciclo de Vida do Consentimento

stateDiagram-v2
    [*] --> NONE: Primeira visita

    NONE --> GRANTED: Aceita todos
    NONE --> PARTIAL: Customiza (aceita alguns)
    NONE --> DENIED: Rejeita todos

    GRANTED --> PARTIAL: Revisa preferências (remove algumas)
    GRANTED --> DENIED: Rejeita todos
    GRANTED --> REVOKED: Revoga consentimento
    GRANTED --> EXPIRED: 12 meses passam

    PARTIAL --> GRANTED: Aceita restantes
    PARTIAL --> DENIED: Rejeita todos
    PARTIAL --> REVOKED: Revoga consentimento
    PARTIAL --> EXPIRED: 12 meses passam

    DENIED --> GRANTED: Muda de ideia (aceita todos)
    DENIED --> PARTIAL: Aceita alguns
    DENIED --> REVOKED: Revoga (já negado)
    DENIED --> EXPIRED: 12 meses passam

    REVOKED --> NONE: Nova visita (recomeça fluxo)
    EXPIRED --> NONE: Solicita novamente

    NONE --> NONE: Usuário fecha banner sem interagir

Expiração e Renovação

Prazo de Validade (12 Meses)

Fundamento Legal: LGPD não especifica prazo, mas GDPR recomenda 12 meses. Complyr adota este padrão como boa prática.

Cálculo:

// Quando consentimento é criado
const createdAt = new Date();
const expiresAt = new Date(createdAt);
expiresAt.setFullYear(expiresAt.getFullYear() + 1); // +1 ano

// Salvar no localStorage
consent.expiresAt = expiresAt.toISOString();

Renovação Automática

Quando usuário revisita o site antes da expiração, o Complyr pode renovar automaticamente:

// Verificar se está próximo da expiração (dentro de 30 dias)
const now = new Date();
const expiresAt = new Date(consent.expiresAt);
const daysUntilExpiration = (expiresAt - now) / (1000 * 60 * 60 * 24);

if (daysUntilExpiration < 30 && daysUntilExpiration > 0) {
  // Renovar silenciosamente
  consent.expiresAt = new Date(now.setFullYear(now.getFullYear() + 1)).toISOString();
  localStorage.setItem('complyr_consent_' + workspaceId, JSON.stringify(consent));

  // Notificar backend
  await sendConsentUpdate(consent);
}

Benefícios: - Melhor experiência do usuário (não interrompe navegação) - Mantém compliance (usuário continua usando o site = confirmação implícita) - Reduz abandono por banner repetitivo

Histórico de Consentimento

O Complyr mantém histórico completo de mudanças de consentimento:

-- Tabela: consent_schema.consent_history
id UUID PRIMARY KEY
consent_id UUID (FK to consents)
workspace_id UUID
previous_status VARCHAR(20)
new_status VARCHAR(20)
changed_purposes JSONB  -- Quais finalidades mudaram
reason VARCHAR(255)  -- Motivo (opcional)
user_agent TEXT
ip_address VARCHAR(64)  -- SHA-256 hash
created_at TIMESTAMP

Exemplo de Registro:

{
  "id": "hist-123",
  "consentId": "consent-456",
  "workspaceId": "workspace-789",
  "previousStatus": "GRANTED",
  "newStatus": "PARTIAL",
  "changedPurposes": {
    "marketing": {
      "from": true,
      "to": false,
      "reason": "Usuário desativou marketing"
    }
  },
  "reason": "User updated preferences",
  "userAgent": "Mozilla/5.0...",
  "ipAddress": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "createdAt": "2025-01-15T11:30:00.000Z"
}

Visualização de Histórico

API Endpoint:

GET /consents/{consentId}/history

Response:

{
  "consentId": "consent-456",
  "history": [
    {
      "timestamp": "2025-01-15T10:00:00Z",
      "action": "CREATED",
      "status": "GRANTED",
      "purposes": ["analytics", "marketing", "personalization"]
    },
    {
      "timestamp": "2025-01-15T11:30:00Z",
      "action": "UPDATED",
      "status": "PARTIAL",
      "changedPurposes": {
        "marketing": "revoked"
      }
    },
    {
      "timestamp": "2025-01-15T12:00:00Z",
      "action": "REVOKED",
      "status": "REVOKED",
      "reason": "User requested data deletion"
    }
  ],
  "total": 3
}

Audit Trail (Trilha de Auditoria)

Integração com Audit-Service

Todas as ações de consentimento geram eventos de auditoria:

// Evento disparado ao criar consentimento
await auditService.log({
  action: 'CONSENT_CREATED',
  entityType: 'consent',
  entityId: consent.id,
  workspaceId: workspace.id,
  userId: user?.id,
  metadata: {
    status: 'GRANTED',
    purposes: ['analytics', 'marketing'],
    ipAddress: hashIpAddress(req.ip),
    userAgent: req.headers['user-agent']
  }
});

// Evento disparado ao atualizar consentimento
await auditService.log({
  action: 'CONSENT_UPDATED',
  entityType: 'consent',
  entityId: consent.id,
  workspaceId: workspace.id,
  changes: {
    status: { from: 'GRANTED', to: 'PARTIAL' },
    purposes: {
      marketing: { from: true, to: false }
    }
  }
});

// Evento disparado ao revogar consentimento
await auditService.log({
  action: 'CONSENT_REVOKED',
  entityType: 'consent',
  entityId: consent.id,
  workspaceId: workspace.id,
  reason: 'User requested data deletion',
  metadata: {
    revokedPurposes: ['analytics', 'marketing', 'personalization']
  }
});

Benefícios: - ✅ Prova legal de conformidade LGPD - ✅ Rastreabilidade completa de ações - ✅ Suporte a auditorias regulatórias - ✅ Análise de padrões de consentimento - ✅ Detecção de anomalias

Sincronização Cross-Device

Identificação de Usuários

Para sincronizar consentimento entre dispositivos, use o método identify():

// Após login do usuário
document.addEventListener('complyr:loaded', function() {
  if (window.complyr && userLoggedIn) {
    window.complyr.identify('email', user.email);
  }
});

Como Funciona

  1. Usuário anônimo em dispositivo 1:
  2. Aceita consentimento (GRANTED)
  3. Consentimento salvo localmente
  4. Backend recebe mas não identifica usuário

  5. Usuário faz login em dispositivo 1:

  6. identify('email', 'user@example.com') chamado
  7. Backend associa consentimento ao hash do email
  8. Consentimento agora identificado

  9. Usuário acessa em dispositivo 2:

  10. Faz login (mesmo email)
  11. identify() chamado
  12. Backend busca consentimento existente pelo hash
  13. Sincroniza para dispositivo 2

Código Backend:

// Quando identify() é chamado
const emailHash = sha256(userEmail.toLowerCase());

// Buscar consentimento existente para este usuário
const existingConsent = await consentRepository.findByUserIdentification(
  workspaceId,
  'email',
  emailHash
);

if (existingConsent) {
  // Sincronizar para novo dispositivo
  return existingConsent;
} else {
  // Primeiro dispositivo - criar novo consentimento
  const consent = await consentRepository.create({...});

  // Associar ao usuário
  await consentUserIdentificationRepository.create({
    consentId: consent.id,
    identificationType: 'email',
    identifierHash: emailHash
  });

  return consent;
}

Benefícios: - ✅ Experiência consistente entre dispositivos - ✅ Usuário não precisa aceitar consentimento em cada dispositivo - ✅ Histórico unificado - ✅ Privacidade mantida (SHA-256 hashing)

Cookies Essenciais vs Não-Essenciais

Cookies Essenciais (Sempre Permitidos)

Definição (LGPD Art. 7º, IX): Cookies necessários para funcionamento legítimo do serviço.

Exemplos: - Autenticação (session tokens, JWT) - Carrinho de compras (e-commerce) - Preferências de idioma - Proteção CSRF - Balance de carga (load balancing)

Características: - ✅ Não requerem consentimento - ✅ Podem ser first-party ou third-party - ✅ Devem ser estritamente necessários - ✅ Não podem ser usados para tracking

Exemplo de Código:

// Cookies essenciais sempre ativos
const essentialCookies = [
  'session_token',
  'csrf_token',
  'language_preference',
  'shopping_cart',
  'load_balancer_id'
];

// Estes cookies são definidos independentemente do consentimento
document.cookie = 'session_token=abc123; Secure; HttpOnly; SameSite=Strict';

Cookies Não-Essenciais (Requerem Consentimento)

Definição: Cookies usados para finalidades além do funcionamento básico.

Categorias:

  1. Analytics (Análise):
  2. Google Analytics
  3. Hotjar
  4. Mixpanel
  5. Amplitude

  6. Marketing (Publicidade):

  7. Google Ads
  8. Facebook Pixel
  9. LinkedIn Insight Tag
  10. Twitter Pixel

  11. Personalization (Personalização):

  12. Recomendações de produtos
  13. Customização de layout
  14. Histórico de navegação

  15. Third Party (Terceiros):

  16. Chat ao vivo (Intercom, Zendesk)
  17. Widgets de redes sociais
  18. Mapas embarcados
  19. Vídeos de terceiros

Bloqueio Automático:

// Complyr bloqueia cookies não-essenciais automaticamente
if (consent.status === 'NONE' || consent.status === 'DENIED') {
  // Bloquear scripts de terceiros
  blockScript('https://www.googletagmanager.com/gtag/js');
  blockScript('https://connect.facebook.net/en_US/fbevents.js');

  // Remover cookies não-essenciais existentes
  removeNonEssentialCookies();
}

// Quando consentimento é concedido
if (consent.purposes.analytics.granted) {
  // Ativar Google Analytics
  loadScript('https://www.googletagmanager.com/gtag/js?id=GA_ID');
}

if (consent.purposes.marketing.granted) {
  // Ativar Facebook Pixel
  loadScript('https://connect.facebook.net/en_US/fbevents.js');
}

Melhores Práticas

1. Transparência Total

❌ Ruim:

<!-- Texto genérico e vago -->
<p>Este site usa cookies para melhorar sua experiência.</p>
<button>Aceitar</button>

✅ Bom:

<!-- Texto específico e claro -->
<p>
  Usamos cookies para três finalidades:
  <ul>
    <li><strong>Essenciais</strong>: Login e carrinho de compras</li>
    <li><strong>Analytics</strong>: Google Analytics para melhorar o site</li>
    <li><strong>Marketing</strong>: Facebook Pixel para anúncios relevantes</li>
  </ul>
  Você pode aceitar todos ou escolher individualmente.
</p>
<button>Aceitar Todos</button>
<button>Gerenciar Preferências</button>
<a href="/politica-privacidade">Política de Privacidade</a>

2. Controle do Usuário

✅ Sempre Forneça: - Botão "Aceitar Todos" - Botão "Rejeitar Todos" - Botão "Gerenciar Preferências" (customização) - Link para Política de Privacidade - Link "Gerenciar Cookies" no footer (sempre visível)

Código de Exemplo:

<!-- Link no footer para revisitar preferências -->
<footer>
  <a href="#" onclick="window.complyr.openPreferences(); return false;">
    Gerenciar Cookies
  </a>
</footer>

3. Não Bloquear Acesso (LGPD Art. 9º, § 1º)

❌ Ilegal (Cookie Wall):

// NUNCA faça isso
if (!consentGranted) {
  document.body.innerHTML = '<h1>Você deve aceitar cookies para continuar</h1>';
  // Bloqueia totalmente o acesso
}

✅ Legal:

// Permitir acesso com funcionalidade reduzida
if (!consentGranted) {
  console.log('Consentimento não concedido - modo restrito');
  // Desabilita features não-essenciais mas permite navegação
  disableAnalytics();
  disableMarketing();
  disablePersonalization();
}
// Site continua funcionando normalmente

4. Registro de Timestamp e IP

Para Compliance:

// Sempre registrar quando e de onde veio o consentimento
const consent = {
  workspaceId: workspace.id,
  status: 'GRANTED',
  purposes: userChoices,
  userAgent: req.headers['user-agent'],
  ipAddress: sha256(req.ip),  // SEMPRE hasheado
  language: req.headers['accept-language'],
  createdAt: new Date(),
  expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000), // +1 ano
};

IMPORTANTE: IP address DEVE ser hasheado antes de salvar (SHA-256).

5. Versionamento de Consentimento

Quando Política Muda:

// Invalidar consentimentos antigos quando política muda
const consent = getStoredConsent();
const currentPolicyVersion = '2.0';

if (consent.policyVersion !== currentPolicyVersion) {
  console.log('Política mudou - solicitar novo consentimento');
  displayBanner({
    message: 'Nossa política de privacidade foi atualizada. Por favor, revise suas preferências.',
    highlightChanges: true
  });
}

6. Auditoria Regular

Verifique Periodicamente: - [ ] Consentimentos estão sendo salvos corretamente - [ ] Histórico de mudanças está completo - [ ] IPs estão hasheados (SHA-256) - [ ] Cookies não-essenciais estão bloqueados sem consentimento - [ ] Banner aparece para novos usuários - [ ] Expiração de 12 meses está funcionando - [ ] Link "Gerenciar Cookies" está acessível

Código de Verificação:

# Verificar se IPs estão hasheados (não devem conter pontos)
SELECT ip_address FROM consent_schema.consents
WHERE ip_address LIKE '%.%';
-- Resultado esperado: 0 linhas

# Verificar consentimentos expirados
SELECT COUNT(*) FROM consent_schema.consents
WHERE expires_at < NOW() AND status != 'EXPIRED';
-- Resultado esperado: 0

Integração com Google Tag Manager

Atualização Automática do dataLayer

Quando consentimento muda, o Complyr atualiza automaticamente o dataLayer do GTM:

// Evento 'consent-updated' disparado
document.addEventListener('consent-updated', function(event) {
  const purposes = event.detail;

  // Atualizar dataLayer
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({
    'event': 'consent-updated',
    'consent_analytics': purposes.analytics ? 'granted' : 'denied',
    'consent_marketing': purposes.marketing ? 'granted' : 'denied',
    'consent_personalization': purposes.personalization ? 'granted' : 'denied',
    'consent_third_party': purposes.third_party ? 'granted' : 'denied'
  });
});

O Complyr suporta Google Consent Mode v2 automaticamente:

// Configuração inicial (antes de carregar GTM)
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }

gtag('consent', 'default', {
  'ad_storage': 'denied',
  'ad_user_data': 'denied',
  'ad_personalization': 'denied',
  'analytics_storage': 'denied',
  'personalization_storage': 'denied',
  'functionality_storage': 'granted',  // Essential sempre granted
  'security_storage': 'granted'
});

// Quando usuário aceita
gtag('consent', 'update', {
  'ad_storage': purposes.marketing ? 'granted' : 'denied',
  'ad_user_data': purposes.marketing ? 'granted' : 'denied',
  'ad_personalization': purposes.marketing ? 'granted' : 'denied',
  'analytics_storage': purposes.analytics ? 'granted' : 'denied',
  'personalization_storage': purposes.personalization ? 'granted' : 'denied'
});

Saiba mais: Integração com Google Tag Manager →

Integração com Facebook Pixel

Gerenciamento Automático de Consentimento

O Complyr controla automaticamente o Facebook Pixel:

// Antes do consentimento: Pixel bloqueado
// (script não carregado)

// Quando usuário aceita marketing
if (purposes.marketing) {
  // Carregar Facebook Pixel
  !function(f,b,e,v,n,t,s){...}(window, document, 'script',
    'https://connect.facebook.net/en_US/fbevents.js');

  // Inicializar
  fbq('init', 'YOUR_PIXEL_ID');

  // Conceder consentimento
  fbq('consent', 'grant');

  // Track pageview
  fbq('track', 'PageView');
}

// Quando usuário revoga marketing
if (!purposes.marketing && window.fbq) {
  // Revogar consentimento
  fbq('consent', 'revoke');
}

Saiba mais: Integração com Facebook Pixel →

Perguntas Frequentes

1. O que acontece se o usuário não interagir com o banner?

Resposta: O Complyr assume estado NONE e permite apenas cookies essenciais. O banner permanece visível até que o usuário tome uma ação (aceitar, rejeitar ou customizar). Isso está em conformidade com a LGPD, que exige consentimento inequívoco (Art. 5º, XII).

Código:

// Banner não desaparece até ação explícita
if (consent.status === 'NONE') {
  displayBanner();
  blockNonEssentialCookies();
}

2. Posso usar consentimento implícito (scroll ou tempo no site)?

Resposta: NÃO. A LGPD exige consentimento inequívoco (Art. 5º, XII), o que significa que precisa ser uma ação afirmativa clara. Scroll, navegação ou permanência no site não são válidos.

❌ Ilegal:

// NUNCA faça isso
window.addEventListener('scroll', function() {
  if (window.scrollY > 100) {
    assumeConsent(); // Ilegal!
  }
});

✅ Legal:

// Requer clique explícito
document.getElementById('accept-btn').addEventListener('click', function() {
  grantConsent(); // Legal
});

3. Quanto tempo posso armazenar o consentimento?

Resposta: O Complyr usa 12 meses como padrão (alinhado com GDPR). A LGPD não especifica prazo, mas a ANPD (Autoridade Nacional de Proteção de Dados) recomenda renovação periódica. Após expiração, o usuário deve reconfirmar.

Configuração:

// Padrão: 12 meses
const CONSENT_EXPIRATION_DAYS = 365;

const expiresAt = new Date();
expiresAt.setDate(expiresAt.getDate() + CONSENT_EXPIRATION_DAYS);

consent.expiresAt = expiresAt.toISOString();

4. Preciso pedir consentimento para cookies essenciais?

Resposta: NÃO. Cookies estritamente necessários para funcionamento do serviço (login, carrinho, CSRF) são baseados em legítimo interesse (LGPD Art. 7º, IX) e não requerem consentimento. Porém, você deve informar sua existência na Política de Privacidade.

Exemplo:

// Cookies essenciais sempre ativos
const essentialCookies = {
  session: true,    // Login
  csrf: true,       // Segurança
  cart: true,       // E-commerce
  language: true    // UX básica
};

// Não bloqueia mesmo sem consentimento
setEssentialCookie('session_token', value);

5. O que fazer quando usuário revoga consentimento?

Resposta: Você DEVE: 1. Parar imediatamente o processamento de dados não-essenciais 2. Remover cookies não-essenciais 3. Desativar tags de terceiros (GA, FB Pixel) 4. Registrar a revogação para auditoria 5. Opcionalmente, excluir dados históricos se solicitado

Código:

window.complyr.revokeConsent('User requested data deletion');

// Sistema automaticamente:
// 1. Remove cookies não-essenciais
// 2. Limpa localStorage
// 3. Desativa tags
// 4. Registra evento no backend
// 5. Notifica audit-service

6. Posso diferenciar consentimento entre subdomínios?

Resposta: SIM. Cada workspace pode ter um domínio diferente, e consentimentos são isolados por workspace:

// Site principal: www.example.com (workspace-1)
const consent1 = getConsent('workspace-1');

// Blog: blog.example.com (workspace-2)
const consent2 = getConsent('workspace-2');

// Consentimentos independentes

Alternativamente, você pode compartilhar consentimento entre subdomínios usando o mesmo workspace ID.

7. Como sincronizar consentimento entre dispositivos?

Resposta: Use o método identify() após login:

// Após login bem-sucedido
document.addEventListener('complyr:loaded', function() {
  if (window.complyr && userLoggedIn) {
    window.complyr.identify('email', user.email);
  }
});

O backend usa SHA-256 hash do email para buscar consentimento existente e sincronizar entre dispositivos.

8. Preciso traduzir o banner para vários idiomas?

Resposta: SIM, se seu site atende usuários de diferentes países. A LGPD exige consentimento informado, o que implica linguagem compreensível pelo titular (Art. 5º, XII).

Configuração:

// Detecção automática de idioma
const userLanguage = navigator.language || navigator.userLanguage;

const bannerTexts = {
  'pt-BR': {
    title: 'Este site usa cookies',
    description: 'Usamos cookies para melhorar sua experiência...',
    acceptAll: 'Aceitar Todos',
    rejectAll: 'Rejeitar Todos'
  },
  'en-US': {
    title: 'This website uses cookies',
    description: 'We use cookies to improve your experience...',
    acceptAll: 'Accept All',
    rejectAll: 'Reject All'
  }
};

displayBanner(bannerTexts[userLanguage]);

Recursos Relacionados

Documentação Técnica

Integrações

Exemplos Práticos

Próximos Passos

Agora que você entende o gerenciamento de consentimento, explore:

  1. Controle por Finalidade → - Entenda o sistema de 5 finalidades
  2. Conformidade LGPD → - Veja como o Complyr atende cada artigo da LGPD
  3. Guia Rápido → - Implemente o Complyr em 3 passos
  4. API JavaScript → - Controle programático de consentimento