Aprenda como implementar consentimento de cookies e integrá-lo com o Zenovay Analytics para conformidade de privacidade.
Você precisa de um banner de cookies?
Uso de cookies do Zenovay
| Modo | Armazenamento no cliente | Consentimento necessário |
|---|---|---|
| Modo sem cookies | Nenhum (IDs window-scoped em memória) | Geralmente não |
| Modo padrão | Um único cookie first-party para reconhecer visitantes recorrentes | Pode ser necessário |
O Zenovay é sempre sem cookies no servidor: nenhum endereço IP ou dado pessoal é armazenado. A tabela acima é apenas sobre o que o script de rastreamento escreve no navegador do visitante. O modo sem cookies impede que o script escreva qualquer cookie ou entrada localStorage.
Quando o consentimento é obrigatório
O consentimento é tipicamente obrigatório quando:
- Usando cookies persistentes
- Rastreamento entre sessões
- Identificação de visitantes recorrentes
- Coleta de dados pessoais
O consentimento pode não ser obrigatório quando:
- Usando modo sem cookies (sem cookies)
- Funcionalidade estritamente necessária
- Estatísticas agregadas anônimas
Modo sem cookies (sem cookies)
Você pode executar o script de rastreamento do Zenovay em modo sem cookies, que não escreve nada no navegador do visitante. Existem duas formas de habilitá-lo.
Opção 1: atributo de script. Adicione data-cookieless="true" à sua tag de script:
<script
defer
data-tracking-code="YOUR_TRACKING_CODE"
data-cookieless="true"
src="https://api.zenovay.com/z.js"
></script>
Opção 2: configuração do site. Abra o painel do seu site, vá para Configurações, e ative o toggle sem cookies (aparece nas abas Geral e Avançado). A aba Geral também regenera o snippet acima com data-cookieless="true" já adicionado.
Modo sem cookies:
- Não usa cookies nem localStorage (apenas IDs window-scoped em memória)
- Não cria identificadores persistentes
- Legalmente conforme antes do consentimento sob ePrivacy para o próprio script de rastreamento do Zenovay
- Dados ligeiramente menos precisos sobre visitantes recorrentes (espere ~10-15% menos uniques)
Outras ferramentas que você carrega (Meta Pixel, Google Analytics e similares) ainda definem seus próprios cookies e podem exigir consentimento independentemente dessa configuração.
Carregamento condicional
Verificação básica de consentimento
// Verificar consentimento antes de carregar
function loadZenovayIfConsented() {
const consent = localStorage.getItem('analytics_consent');
if (consent === 'granted') {
loadZenovay();
} else if (consent === 'denied') {
// Não carregar análises
} else {
showConsentBanner();
}
}
function loadZenovay() {
const script = document.createElement('script');
script.src = 'https://api.zenovay.com/z.js';
script.setAttribute('data-tracking-code', 'YOUR_TRACKING_CODE');
script.defer = true;
document.head.appendChild(script);
}
// Executar ao carregar a página
loadZenovayIfConsented();
Banner de consentimento simples
<div id="cookie-banner" style="display: none;">
<div class="cookie-content">
<p>Usamos análises para melhorar sua experiência.</p>
<button onclick="acceptCookies()">Aceitar</button>
<button onclick="declineCookies()">Recusar</button>
<a href="/privacy">Saiba mais</a>
</div>
</div>
<script>
function showConsentBanner() {
document.getElementById('cookie-banner').style.display = 'block';
}
function acceptCookies() {
localStorage.setItem('analytics_consent', 'granted');
document.getElementById('cookie-banner').style.display = 'none';
loadZenovay();
}
function declineCookies() {
localStorage.setItem('analytics_consent', 'denied');
document.getElementById('cookie-banner').style.display = 'none';
// Opcionalmente carregar em modo sem cookies
loadZenovayCookieless();
}
function loadZenovayCookieless() {
// data-cookieless="true" diz ao rastreador para usar apenas
// IDs window-scoped em memória - sem cookies, sem localStorage.
const script = document.createElement('script');
script.src = 'https://api.zenovay.com/z.js';
script.setAttribute('data-tracking-code', 'YOUR_TRACKING_CODE');
script.setAttribute('data-cookieless', 'true');
script.defer = true;
document.head.appendChild(script);
}
</script>
Plataformas populares de consentimento
Integração do Cookiebot
// Aguardar consentimento do Cookiebot
window.addEventListener('CookiebotOnAccept', function() {
if (Cookiebot.consent.statistics) {
loadZenovay();
}
});
// Lidar com mudanças de consentimento
window.addEventListener('CookiebotOnDecline', function() {
// Consentimento retirado - parar rastreamento
if (window.zenovay) {
window.zenovay('disable');
}
});
Configuração do Cookiebot:
- Adicionar Zenovay à categoria "Estatísticas"
- Definir nome do cookie:
zenovay_session - Definir provedor:
zenovay.com - Definir tipo:
HTTP - Definir expiração:
Sessãoou1 ano
Integração do OneTrust
// Callback de consentimento do OneTrust
function OptanonWrapper() {
if (OnetrustActiveGroups.includes('C0002')) {
// Cookies de desempenho consentidos
loadZenovay();
} else {
// Carregar em modo sem cookies
loadZenovayCookieless();
}
}
Categorias do OneTrust:
- C0001: Estritamente necessário
- C0002: Desempenho (Zenovay)
- C0003: Funcional
- C0004: Direcionamento
Integração do Osano
// Callback de consentimento do Osano
window.Osano.cm.addEventListener('osano-cm-consent-changed', function(event) {
if (event.ANALYTICS === 'ACCEPT') {
loadZenovay();
}
});
Integração do Termly
// Callback de consentimento do Termly
window.addEventListener('termly-consent-preferences-updated', function(e) {
if (e.detail.analytics) {
loadZenovay();
}
});
Modo de Consentimento do Google
Integração
// Inicializar Modo de Consentimento do Google
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {
'analytics_storage': 'denied'
});
// Atualizar ao consentir
function updateConsent(granted) {
gtag('consent', 'update', {
'analytics_storage': granted ? 'granted' : 'denied'
});
if (granted) {
loadZenovay();
}
}
Com Zenovay
Use a abordagem de carregamento condicional mostrada acima para carregar Zenovay apenas após o consentimento ser concedido via Modo de Consentimento do Google:
// Carregar Zenovay apenas após o consentimento de análises ser concedido
function updateConsent(granted) {
gtag('consent', 'update', {
'analytics_storage': granted ? 'granted' : 'denied'
});
if (granted) {
const script = document.createElement('script');
script.src = 'https://api.zenovay.com/z.js';
script.setAttribute('data-tracking-code', 'YOUR_TRACKING_CODE');
script.defer = true;
document.head.appendChild(script);
}
}
Implementação em React
Contexto de consentimento
// ConsentContext.js
import { createContext, useContext, useState, useEffect } from 'react';
const ConsentContext = createContext();
export function ConsentProvider({ children }) {
const [consent, setConsent] = useState(() => {
return localStorage.getItem('analytics_consent') || 'pending';
});
const grantConsent = () => {
localStorage.setItem('analytics_consent', 'granted');
setConsent('granted');
};
const denyConsent = () => {
localStorage.setItem('analytics_consent', 'denied');
setConsent('denied');
};
return (
<ConsentContext.Provider value={{ consent, grantConsent, denyConsent }}>
{children}
</ConsentContext.Provider>
);
}
export const useConsent = () => useContext(ConsentContext);
Componente de banner de consentimento
// CookieBanner.js
import { useConsent } from './ConsentContext';
export function CookieBanner() {
const { consent, grantConsent, denyConsent } = useConsent();
if (consent !== 'pending') return null;
return (
<div className="cookie-banner">
<p>Usamos cookies para analisar o tráfego do site.</p>
<button onClick={grantConsent}>Aceitar</button>
<button onClick={denyConsent}>Recusar</button>
</div>
);
}
Análises condicionais
// Analytics.js
import { useEffect } from 'react';
import { useConsent } from './ConsentContext';
export function Analytics({ websiteId }) {
const { consent } = useConsent();
useEffect(() => {
if (consent === 'granted') {
const script = document.createElement('script');
script.src = 'https://api.zenovay.com/z.js';
script.setAttribute('data-tracking-code', websiteId);
script.defer = true;
document.head.appendChild(script);
} else if (consent === 'denied') {
// Não carregar análises quando o consentimento é negado.
// Se ainda quiser rastreamento mínimo, carregue o script com
// data-cookieless="true" em vez disso (sem cookies, sem localStorage).
}
}, [consent, websiteId]);
return null;
}
Implementação em Vue.js
<!-- CookieConsent.vue -->
<template>
<div v-if="showBanner" class="cookie-banner">
<p>Usamos cookies para análises.</p>
<button @click="accept">Aceitar</button>
<button @click="decline">Recusar</button>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const showBanner = ref(false);
onMounted(() => {
const consent = localStorage.getItem('analytics_consent');
if (!consent) {
showBanner.value = true;
} else if (consent === 'granted') {
loadZenovay();
}
});
function accept() {
localStorage.setItem('analytics_consent', 'granted');
showBanner.value = false;
loadZenovay();
}
function decline() {
localStorage.setItem('analytics_consent', 'denied');
showBanner.value = false;
loadZenovayCookieless();
}
function loadZenovay() {
const script = document.createElement('script');
script.src = 'https://api.zenovay.com/z.js';
script.setAttribute('data-tracking-code', 'YOUR_TRACKING_CODE');
document.head.appendChild(script);
}
function loadZenovayCookieless() {
// data-cookieless="true" diz ao rastreador para usar apenas
// IDs window-scoped em memória - sem cookies, sem localStorage.
const script = document.createElement('script');
script.src = 'https://api.zenovay.com/z.js';
script.setAttribute('data-tracking-code', 'YOUR_TRACKING_CODE');
script.setAttribute('data-cookieless', 'true');
document.head.appendChild(script);
}
</script>
Página de preferências de consentimento
Permitir que os usuários mudem suas preferências:
<div class="cookie-preferences">
<h2>Preferências de Cookies</h2>
<div class="cookie-option">
<label>
<input type="checkbox" id="necessary" checked disabled>
Cookies Necessários (Obrigatório)
</label>
<p>Essencial para o funcionamento do site.</p>
</div>
<div class="cookie-option">
<label>
<input type="checkbox" id="analytics">
Cookies de Análises
</label>
<p>Nos ajudam a entender como os visitantes usam nosso site.</p>
</div>
<button onclick="savePreferences()">Salvar Preferências</button>
</div>
<script>
// Carregar preferências atuais
document.getElementById('analytics').checked =
localStorage.getItem('analytics_consent') === 'granted';
function savePreferences() {
const analytics = document.getElementById('analytics').checked;
localStorage.setItem('analytics_consent', analytics ? 'granted' : 'denied');
// Recarregar para aplicar as mudanças
location.reload();
}
</script>
Registro de consentimento
Rastrear consentimento para conformidade:
function logConsent(type, granted) {
fetch('/api/consent-log', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
type: type,
granted: granted,
timestamp: new Date().toISOString(),
userAgent: navigator.userAgent
})
});
}
function acceptCookies() {
logConsent('analytics', true);
localStorage.setItem('analytics_consent', 'granted');
loadZenovay();
}
Melhores práticas
Design do banner
- Linguagem clara: Explique o que os cookies fazem
- Opções iguais: Aceitar e recusar igualmente proeminentes
- Sem padrões escuros: Não engane os usuários para aceitar
- Controle granular: Deixe os usuários escolher categorias
- Revogação fácil: Permita alterar preferências
Técnico
- Não carregar antes do consentimento: Carregue rastreamento apenas após consentimento
- Respeite a revogação: Pare o rastreamento quando o consentimento for retirado
- Lembre as preferências: Não pergunte repetidamente
- Teste completamente: Verifique se o fluxo de consentimento funciona
Conformidade
- Documente o consentimento: Registre quando o consentimento é dado/retirado
- Revisão regular: Atualize conforme as regulamentações mudam
- Trilha de auditoria: Mantenha registros para conformidade
Solução de problemas
Rastreamento ainda ativo após recusar
Verifique:
- Script não codificado em HTML
- Verificação de consentimento executada antes de qualquer rastreamento
- Sem problemas de cache
Banner exibido repetidamente
Verifique:
- localStorage não está bloqueado
- Cookie não expira imediatamente
- Mesmo domínio para todas as páginas
Plataforma de consentimento não se ativa
Certifique-se:
- Código de integração correto
- Plataforma completamente carregada antes da verificação
- Nomes de callbacks correspondem