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:
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¶
Tabela: consent_history¶
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:
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¶
- Usuário anônimo em dispositivo 1:
- Aceita consentimento (GRANTED)
- Consentimento salvo localmente
-
Backend recebe mas não identifica usuário
-
Usuário faz login em dispositivo 1:
identify('email', 'user@example.com')chamado- Backend associa consentimento ao hash do email
-
Consentimento agora identificado
-
Usuário acessa em dispositivo 2:
- Faz login (mesmo email)
identify()chamado- Backend busca consentimento existente pelo hash
- 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:
- Analytics (Análise):
- Google Analytics
- Hotjar
- Mixpanel
-
Amplitude
-
Marketing (Publicidade):
- Google Ads
- Facebook Pixel
- LinkedIn Insight Tag
-
Twitter Pixel
-
Personalization (Personalização):
- Recomendações de produtos
- Customização de layout
-
Histórico de navegação
-
Third Party (Terceiros):
- Chat ao vivo (Intercom, Zendesk)
- Widgets de redes sociais
- Mapas embarcados
- 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'
});
});
Google Consent Mode v2¶
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¶
- Controle por Finalidade - Sistema de 5 finalidades
- Conformidade LGPD - Atendimento completo à legislação
- Modos de Banner - Configurações de exibição
- API JavaScript - Controle programático
Integrações¶
- Google Tag Manager - Integração GTM + Consent Mode v2
- Facebook Pixel - Gerenciamento automático de consentimento
Exemplos Práticos¶
- Site E-commerce - Implementação completa
- Aplicação React - SPA com Complyr
- WordPress - Plugin de consentimento
Próximos Passos¶
Agora que você entende o gerenciamento de consentimento, explore:
- Controle por Finalidade → - Entenda o sistema de 5 finalidades
- Conformidade LGPD → - Veja como o Complyr atende cada artigo da LGPD
- Guia Rápido → - Implemente o Complyr em 3 passos
- API JavaScript → - Controle programático de consentimento