Problemas com o Consent Mode
Sintoma A: O GA4 ainda dispara antes do consentimento
Causa: O estado predefinido do Consent Mode não está definido antes de o GA4 carregar.
Correcção: Adicione o bloco de predefinição de consentimento antes do script GA4 e antes do ConsentForge:
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {
'analytics_storage': 'denied',
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'wait_for_update': 500
});
</script>
<!-- ConsentForge -->
<script src="https://cdn.consentforge.com/consentforge.min.js" data-token="..." defer></script>
<!-- GA4 -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXX"></script>
Sintoma B: gtag('consent', 'update') não está a disparar
Como verificar: DevTools → Consola → window.dataLayer.filter(e => e[0] === 'consent') — deve mostrar predefinição + actualização após o utilizador aceitar.
Causa: A função gtag não está disponível quando o ConsentForge tenta actualizar o consent mode.
Correcção: Garanta que gtag está definido em window antes de o ConsentForge carregar (através do bloco de predefinição acima).
Sintoma C: Consent Mode a funcionar mas o GA4 não mostra dados modelados
Causa: Os dados de conversão modelados demoram 5 a 7 dias a aparecer no Google Ads após a configuração inicial do Consent Mode.
Correcção: Aguarde 7 dias após a configuração correcta. Verifique no Google Ads → Ferramentas → Diagnósticos do Consent Mode.
Sintoma D: A tag de Inicialização de Consentimento GTM não está a disparar primeiro
Como verificar: Pré-visualização GTM → verifique a ordem de disparo das tags. A tag ConsentForge deve disparar no accionador "Inicialização de Consentimento".
Correcção: Altere o accionador da tag ConsentForge GTM para Inicialização de Consentimento - Todas as Páginas (não Visualização de Página).
Verificação
Após a correcção, confirme na Consola do DevTools:
// Deve mostrar predefinições 'denied' e depois actualização 'granted' após aceitar
window.dataLayer.filter(e => e[0] === 'consent')