Como instalar o banner do Concedo pelo Google Tag Manager
Guia de instalação do banner do Concedo em sites cujas tags passam pelo Google Tag Manager, com o template de contêiner que você importa em vez de digitar.
Leia a seção "Antes de tudo" antes de escolher este caminho. Instalar o loader pelo GTM resolve alguns cenários e atrapalha outros. A diferença está na ordem em que as peças executam.
Antes de tudo: o GTM não substitui a CMP
Quase toda instalação malfeita nasce de confundir três coisas.
1. O Concedo classifica o GTM como necessarios, de propósito. O contêiner transporta
tags; sozinho, ele não rastreia ninguém. Bloqueá-lo cegaria o site inteiro, inclusive as tags
que deveriam rodar. O que o GTM injeta cai na interceptação de document.createElement do
motor de bloqueio, e o lado do Google fica coberto pelo Consent Mode v2.
2. A verificação de consentimento do GTM segura a tag que o GTM dispara, e só ela. Um Meta Pixel colado direto no tema do site continua rodando, porque o GTM não tem autoridade sobre o HTML da página. Quem segura esse caso é o motor de bloqueio do Concedo.
3. O loader precisa executar antes de qualquer tag. O snippet do Concedo declara o
consent default negado de forma síncrona e liga a interceptação. Se ele executar depois de
uma tag, abre-se uma janela em que a tag rodou sem consentimento. Cookie criado nessa janela
é problema de LGPD.
Daí vem a diferença entre os dois métodos. Quando o loader é entregue pelo próprio
contêiner (método A), ele é um arquivo remoto, e o GTM não espera por ele antes de disparar as
demais tags. Medimos isso: no método A, as tags que o contêiner injeta em seguida saem antes
de o loader executar, e o motor de bloqueio já não tem o que interceptar. Quem as segura ali é
a verificação de consentimento tag a tag ("Configure a verificação de consentimento de cada
tag") somada ao Consent Mode v2, sem participação do bloqueio automático. Com o loader no
<head> (método B), as mesmas tags do mesmo contêiner não deixam nem a requisição sair.
Qual método usar
| Situação | Método recomendado |
|---|---|
| Todas as tags do site passam pelo GTM e você não pode editar o HTML | Loader no GTM, pelo gatilho de inicialização do consentimento (Método A) |
Você consegue editar o <head> do site | Loader direto no <head>, e o GTM só para as tags (Método B) |
| Existe pixel colado no tema, em plugin ou em app da plataforma | Loader direto no <head>, obrigatoriamente |
Prefira sempre o loader direto no <head>, acima do contêiner do GTM. O contêiner carrega de
forma assíncrona; o loader do Concedo, não. Pôr o loader dentro do GTM faz a peça que precisa
ser síncrona depender de uma peça assíncrona. Funciona, porque o gatilho de inicialização do
consentimento roda antes de qualquer outro gatilho, mas é uma garantia a menos.
Escolha um caminho só, nunca os dois
Método A ou método B. Instalar pelos dois "para garantir" é o erro mais caro deste guia. O estrago vai além do banner duplicado: sobra consentimento nenhum.
Medido em 2026-08-25, com dois <script> do loader de verdade na mesma página:
| Uma instalação | Duas instalações | |
|---|---|---|
| Banners na tela | 1 | 2, um cobrindo o outro |
| Clique do visitante no banner | passa | não passa |
| Página responde depois da escolha | sim | não, a aba trava |
| Consentimentos registrados | 1 | 0 |
Cada <script> executa o pacote outra vez, com banner, motor de bloqueio e decisão próprios.
Com ponteiro de verdade o visitante não consegue clicar em nenhum dos dois, e a aba congela
quando só um dos motores recebe a decisão. Quando a escolha chega aos dois, o que só acontece
de forma forçada, a mesma decisão vira duas linhas no seu histórico de consentimentos.
Como descobrir se o seu site está assim
Olhar o código-fonte da página não resolve: o loader instalado pelo GTM não está no HTML, ele só aparece no DOM depois que o contêiner roda. Abra o site em janela anônima, abra o console do navegador e rode:
[...document.querySelectorAll('script[src*="/cmp/v1/loader.js"]')].map((s) => s.dataset.chave);
A resposta precisa ser uma lista com um item, que é a chave pública deste site.
- Dois itens: instalação dupla. Siga o "Como consertar" abaixo.
- Dois itens com chaves diferentes: além da duplicidade, uma delas é de outro site ou ficou de uma configuração antiga. O banner que sobrar pode estar aplicando a política errada, sem nenhum sinal na tela.
- Nenhum item: o loader não está instalado nessa página. Vá para "Publique e verifique".
O aviso também sai sozinho no console, assim que a segunda cópia executa:
[Concedo] snippet duplicado nesta página; a segunda cópia foi ignorada.
Como consertar
- Decida qual instalação fica, pela tabela de "Antes de tudo". Na dúvida, fica a do
<head>(método B). - Tire a outra e publique a remoção. No GTM, pausar ou excluir a tag do Concedo não muda nada em produção até você publicar a versão do contêiner. No tema, apagar a linha exige limpar o cache do site, do plugin de cache e da CDN.
- Rode o comando acima de novo, em janela anônima. Precisa devolver um item só.
- Refaça "O teste que aprova a instalação" inteiro. Quem visitou o site enquanto ele estava duplicado não chegou a registrar escolha nenhuma, então o banner volta a aparecer normalmente para essas pessoas, e não há o que restaurar.
O que a correção do loader alcança, e o que ela não alcança
O loader desiste sozinho quando encontra uma instalação viva na página: a segunda cópia escreve o aviso no console e não instala nada, nem banner nem motor de bloqueio. Ela também nunca derruba a primeira, que a essa altura pode já ter desenhado o banner e gravado a escolha do titular.
Essa guarda é uma rede de proteção. Ela não alcança:
- Navegador com o loader antigo em cache. O arquivo é servido com
max-age=600e revalidação em segundo plano por até 24 h. Enquanto o visitante estiver com a versão anterior, a página dele continua com os dois banners e sem registrar nada. - Cópia local do loader. Otimizador que combina, minifica ou hospeda scripts de terceiro no seu próprio domínio congela a versão que copiou, e ela nunca recebe correção nenhuma. Mantenha o caminho do loader na lista de exclusões.
- Escolher a instalação certa. Vence quem executa primeiro. Se as duas cópias carregam chaves diferentes, o site fica com a política da primeira, em silêncio.
- Os registros já gravados. Consentimento duplicado que já foi para o histórico não some sozinho.
- O desperdício. O segundo
<script>continua sendo baixado e executado; ele apenas não instala nada.
Com guarda ou sem ela, duas instalações continuam sendo instalação errada.
Ative os recursos de consentimento no contêiner
- No GTM, abra Administrador → Configurações do contêiner.
- Marque Ativar visão geral do consentimento (Enable consent overview).
- Salve.
Uma coluna nova aparece na lista de tags, mostrando quais tags já têm verificação de consentimento configurada e quais não têm. É por essa coluna que você vai conferir o trabalho no fim.
Método A: loader do Concedo dentro do GTM
Use apenas quando não houver como editar o <head> do site.
Importe o template do Concedo
Baixe o template de contêiner do Concedo e importe no GTM: Administrador → Importar contêiner → Escolher arquivo de contêiner.
Na tela de importação, três escolhas que importam:
- Espaço de trabalho: um espaço novo, não o que você está usando para outra coisa.
- Opção de importação: Mesclar. Nunca Substituir, que apaga todas as tags, gatilhos e variáveis já existentes no seu contêiner.
- Dentro de Mesclar, Renomear tags, gatilhos e variáveis conflitantes.
O arquivo traz exatamente duas peças, ambas com o prefixo Concedo no nome para não colidir
com nada seu: uma tag de HTML personalizado com o loader e uma variável constante com a sua
chave pública. Ele não cria gatilho: a tag é ligada ao gatilho de inicialização do
consentimento, que já existe em todo contêiner. Confira a pré-visualização de alterações
antes de confirmar, porque ela lista item por item o que a importação vai fazer.
Cole a sua chave pública na variável
Depois de importar, abra Variáveis → Concedo - chave publica do site e cole a chave
pública que aparece no painel do Concedo, no cartão "Copie o snippet do seu site" (é a parte
pk_... do snippet; use o botão Copiar snippet e aproveite só esse trecho).
A variável vem vazia de propósito: chave errada é pior do que chave ausente. Com a
variável vazia, o loader não instala o banner e escreve
[Concedo] snippet sem data-chave — banner não instalado no console, erro que aparece já no
primeiro teste. Com a chave de outro site, ele instalaria o banner errado, com a política
errada, em silêncio.
Ou crie a tag à mão
Se preferir não importar arquivo nenhum, a tag é esta. Repare que ela não se resume à
linha do <script src>:
- Tipo: HTML personalizado.
- Nome sugerido:
Concedo - loader (inicialização do consentimento), igual ao do template. - HTML:
<script>
(function (w, d, chave) {
w.dataLayer = w.dataLayer || [];
function gtag() {
w.dataLayer.push(arguments);
}
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
analytics_storage: 'denied',
functionality_storage: 'denied',
personalization_storage: 'denied',
security_storage: 'granted',
wait_for_update: 500,
});
gtag('set', 'ads_data_redaction', true);
var s = d.createElement('script');
s.src = 'https://app.concedo.com.br/cmp/v1/loader.js';
s.async = false;
s.setAttribute('data-chave', chave);
(d.head || d.documentElement).appendChild(s);
})(window, document, 'pk_seu_identificador');
</script>
- Opções avançadas → Prioridade de disparo da tag: um número alto (por exemplo,
1000). Prioridade maior dispara primeiro dentro do mesmo gatilho. - NÃO marque "Oferecer suporte a document.write".
O consent default sai inline, antes de o loader ser criado, porque o loader é um arquivo
remoto e o GTM não espera por ele. Uma tag que trouxesse apenas o <script src> deixaria a
tag do Google do próprio contêiner disparar com consentimento indefinido, e o gtag trata
indefinido como concedido. É a diferença entre gcs=G100 e um _ga criado antes de o
visitante ver o banner.
Use o gatilho certo: é aqui que não se pode errar
- Gatilho: Inicialização do consentimento - Todas as páginas (Consent Initialization – All Pages).
Esse é o único gatilho que o GTM garante executar antes de todos os outros. Não use "Inicialização" nem "Todas as páginas": ambos rodam depois, e nesse intervalo alguma tag já terá disparado. O template já vem com esse gatilho configurado; depois de importar, confira que o acionador da tag está escrito assim.
Não crie uma segunda tag de consent default
A tag do Concedo já emite o default negado, e o loader emite o mesmo default quando executa. Os dois são idênticos e negados: não há conflito entre eles.
O que não pode existir é um terceiro default, com valores diferentes, deixado no
contêiner por uma implementação anterior de CMP. Dois defaults divergentes produzem estado
imprevisível entre navegadores. Se existir uma tag assim, pause-a e confira o dataLayer
em "A ordem no dataLayer".
O que o método A não bloqueia
No método A, o motor de bloqueio do Concedo não alcança a tag que o próprio contêiner
injeta. Quando o loader remoto termina de carregar e liga a interceptação, o contêiner já
criou os <script> das tags e as requisições já saíram.
Medido em 2026-08-25 contra um contêiner que dispara GA4, Meta Pixel e TikTok Pixel sem
verificação de consentimento configurada: os três executaram e os cookies _ga, _fbp e
_ttp nasceram antes de qualquer clique no banner. O mesmo contêiner, no mesmo site, com o
loader no <head> (método B): nenhuma requisição saiu e nenhum cookie nasceu.
O método A funciona. O que muda é qual peça faz o trabalho:
| Método A (loader no GTM) | Método B (loader no <head>) | |
|---|---|---|
| Quem segura a tag do contêiner | A verificação de consentimento de cada tag | O motor de bloqueio do Concedo |
| Tag do Google sem verificação configurada | Dispara em modo negado pelo Consent Mode: sem cookie, mas com requisição | Nem a requisição sai |
| Tag de HTML personalizado sem verificação configurada | Vaza | Nem a requisição sai |
| Script colado no tema, fora do GTM | Vaza (o GTM não o alcança) | Bloqueado |
Por isso a verificação tag a tag é obrigatória no método A. Pular esse passo deixa as tags de HTML personalizado sem bloqueio nenhum.
Método B: loader no <head>, GTM só para as tags
Recomendado sempre que possível.
<head>
<!-- 1. Concedo: primeira coisa do head, sem async, sem defer -->
<script
src="https://app.concedo.com.br/cmp/v1/loader.js"
data-chave="pk_seu_identificador"
></script>
<!-- 2. Contêiner do GTM, logo abaixo -->
<script>
(function (w, d, s, l, i) {
/* snippet padrão do GTM */
})(window, document, 'script', 'dataLayer', 'GTM-XXXXXXX');
</script>
</head>
Duas exigências que não são questão de estilo:
- O loader fica o mais alto possível dentro do
<head>, acima do contêiner do GTM. - Sem
asynce semdefer. Comasync, as tags disparam primeiro e não há o que bloquear.
Cuidado com otimizadores (WP Rocket, LiteSpeed, Autoptimize, apps de "speed" de plataforma de e-commerce): combinar, minificar ou adiar o loader recria exatamente a janela que a instalação existe para fechar. Coloque o caminho do loader na lista de exclusões.
Configure a verificação de consentimento de cada tag
Para cada tag do contêiner, abra Configurações avançadas → Configurações de consentimento adicionais e declare de quais sinais ela depende.
| Tag | Sinais exigidos |
|---|---|
| Google Analytics 4 | analytics_storage |
| Google Ads (conversão e remarketing) | ad_storage, ad_user_data, ad_personalization |
| Meta Pixel (HTML personalizado) | ad_storage, ad_user_data |
| TikTok Pixel (HTML personalizado) | ad_storage |
| Hotjar, Clarity, mapas de calor (HTML personalizado) | analytics_storage |
| LinkedIn Insight Tag (HTML personalizado) | ad_storage, ad_user_data |
As tags do Google já trazem verificação embutida e respeitam o Consent Mode sozinhas. As de HTML personalizado, não: sem a configuração manual, o GTM as dispara assim que o gatilho ocorrer, independentemente do consentimento. É aqui que a maioria dos contêineres brasileiros vaza, e no método A esse vazamento não tem nenhuma rede embaixo (veja "O que o método A não bloqueia").
Este passo é seu, não do template: o Concedo não tem como saber quais tags existem no seu contêiner, e uma importação que mexesse nas suas tags seria exatamente o tipo de coisa que ninguém deve deixar um terceiro fazer.
O mapeamento entre as categorias do banner e os sinais do Google está detalhado no guia do Consent Mode v2.
Dispare as tags a partir do evento do Concedo
Quando o visitante escolhe, o Concedo emite o gtag('consent','update', ...)
correspondente. As tags do Google reagem sozinhas.
Para tags de HTML personalizado que você prefira carregar só depois do aceite, em vez de
deixá-las esperando o sinal, use um gatilho de evento personalizado do dataLayer e confira
o estado antes de disparar. Isso vale como redundância sobre a verificação tag a tag, e não
como substituto dela.
Tags que o GTM não alcança
Se, além do GTM, existir script de terceiro colado no HTML do site, marque-o para que o motor de bloqueio o segure:
<script type="text/plain" data-category="marketing" src="https://exemplo/pixel.js"></script>
O atributo é data-category, em inglês, e aceita necessarios, estatisticas,
marketing e personalizacao. Trocar type="text/javascript" por type="text/plain" faz
o navegador não executar o script; depois do aceite, ele é recriado com o src real e roda
normalmente, com o async preservado para não alterar a ordem da página.
A marcação continua valendo mesmo com o bloqueio automático ligado, porque são quatro mecanismos, com alcances diferentes.
| Mecanismo | Cobre | Impede a requisição de rede? |
|---|---|---|
type="text/plain" data-category="..." | Tag estática que o dono do site marcou | Sim |
Interceptação de document.createElement + setter de src | Tag injetada por JavaScript (GTM, lazy-load, pixel tardio) | Sim |
Reescrita de document.write | Tag de site legado escrita durante o parse | Sim |
MutationObserver no documentElement | Tag estática não marcada | Não, impede a execução, mas o navegador já pediu o arquivo |
Sem a convenção text/plain, um rastreador conhecido colado no HTML não roda e não cria
cookie próprio, mas o terceiro ainda recebe a requisição e pode gravar cookie dele pelo
cabeçalho Set-Cookie. Medido em 2026-08-24 contra o TikTok real: o _ttp nasce em
.tiktok.com sem que uma linha do script execute. Para bloqueio completo, marque as tags
estáticas.
Pixel montado com new Image() também não é interceptado: ele não passa por
document.createElement, e patchear HTMLImageElement afetaria toda imagem do seu site.
Terceiro desconhecido não é bloqueado. Ele continua carregando até o scanner trazê-lo para a base; no GTM, quem cobre esse caso é a verificação de consentimento tag a tag, que não depende da base. O motivo da escolha está em como o bloqueio automático funciona.
Publique e verifique
Publique o contêiner e faça a verificação em janela anônima, depois de limpar o cache do site e da CDN.
A ordem no dataLayer
No console, antes de qualquer interação com o banner:
dataLayer.filter(function (e) {
return e[0] === 'consent';
});
O primeiro item precisa ser um consent default com tudo negado, e ele precisa vir
antes de qualquer evento de configuração de tag. Se o config do GA4 aparecer primeiro, a
ordem está errada; revise o gatilho em "Use o gatilho certo".
O parâmetro gcs
Na aba Rede, filtre por collect e leia o parâmetro gcs da requisição do GA4:
| Valor | ad_storage | analytics_storage |
|---|---|---|
G100 | negado | negado |
G101 | negado | concedido |
G110 | concedido | negado |
G111 | concedido | concedido |
Se o gcs não existir na requisição, o Consent Mode não está funcionando.
O teste que aprova a instalação
- Recusar tudo e navegar por três páginas. Na aba Rede, procure
google-analytics.com,googleadservices.com,facebook.net,analytics.tiktok.com. Em Aplicativo → Cookies, procure_ga,_gcl_au,_fbp,_ttp. Nada pode aparecer. - Aceitar tudo e recarregar. Agora tudo deve carregar. Se não carregar, o bloqueio ficou preso e você perdeu mensuração, que é tão ruim quanto o contrário.
- Só estatísticas. GA4 dispara; Meta e TikTok, não.
- Revisita. Feche e reabra o navegador: a escolha precisa ter sido lembrada.
O Modo de visualização do GTM e o Tag Assistant mostram, por tag disparada, o estado de consentimento no momento do disparo. É o caminho mais rápido até a tag que ficou sem verificação configurada.
Erros comuns
| Erro | Sintoma | Correção |
|---|---|---|
| Gatilho "Todas as páginas" no loader | Cookie de terceiro criado antes de qualquer interação | Trocar pelo gatilho de inicialização do consentimento |
Variável Concedo - chave publica do site vazia | [Concedo] snippet sem data-chave no console e nenhum banner | Colar a chave pública do painel |
| Importação feita com Substituir em vez de Mesclar | Tags do contêiner sumiram | Restaurar a versão anterior do contêiner e importar de novo mesclando |
consent default de outra CMP no contêiner | Estado imprevisível entre navegadores | Pausar a tag antiga; a do Concedo e a do loader são idênticas e negadas |
| Método A sem a verificação tag a tag | _fbp e _ttp nascem antes do banner, mesmo com o banner na tela | Configurar os sinais tag a tag, ou migrar para o método B |
| Tag de HTML personalizado sem verificação de consentimento | gcs=G100 e mesmo assim o _fbp aparece | Configurar os sinais exigidos na tag |
Loader com async/defer por otimizador | Funciona no seu navegador e falha no do cliente | Excluir o loader das otimizações e limpar o cache |
| Contêiner não publicado | Funciona no modo de visualização e não em produção | Publicar a versão |
| Duas CMPs instaladas | Dois banners, dois defaults | Remover a antiga de verdade, inclusive resquício no tema |
| Loader do Concedo no tema e no GTM | Dois banners, nenhum clicável, aba travada e nenhum consentimento registrado | Remover uma das duas e publicar a remoção; conferir em "Escolha um caminho só" |
Limites honestos deste caminho
- No método A, o bloqueio automático não alcança as tags do próprio contêiner. Quem as segura é a verificação de consentimento de cada tag. Medição e tabela em "O que o método A não bloqueia".
- O GTM não alcança script colado no HTML, injetado por plugin ou por app de plataforma.
- Em plataformas com checkout hospedado em domínio próprio (Nuvemshop, Shopify, VTEX), o contêiner do tema geralmente não roda nas páginas de checkout da plataforma. Confira o comportamento na sua loja antes de considerar a instalação concluída.
- Se o contêiner do GTM for bloqueado por extensão de bloqueio de anúncios no navegador do visitante, o loader instalado pelo método A não carrega, e sem loader não há banner. Mais um motivo para preferir o método B.
- A guarda contra instalação dupla depende do loader atualizado no navegador do visitante. Ela impede a segunda cópia de instalar banner, mas só a partir da versão que aquele navegador tiver baixado. Com o loader antigo em cache, ou congelado por um otimizador que o hospeda no seu domínio, a página segue com dois banners e sem registrar consentimento. Detalhes em "Escolha um caminho só".
- A verificação automática do snippet não enxerga o método A. Ela baixa o HTML do seu site; instalado pelo GTM, o loader só aparece depois que o contêiner roda no navegador. Nesse caso, publique o registro TXT mostrado no painel para provar o controle do domínio e liberar a análise interna. O TXT não confirma que o banner está no ar: conclua também a conferência de "Publique e verifique".
Próximos passos
- Escolha o método pela tabela de "Antes de tudo": um só, nunca os dois.
- Configure a verificação de consentimento tag a tag, o passo mais esquecido de todos.
- Guarde a lista do scanner gratuito como critério de aprovação: no fim, nada dela pode disparar antes do aceite.
- Faça a verificação de "Publique e verifique" inteira, incluindo compra de teste se for loja.
- Para o detalhamento de cada sinal e da modelagem de conversões, leia o guia do Google Consent Mode v2.
- Se o seu site é WordPress, Shopify, Nuvemshop, Wix ou VTEX, o passo a passo do tema está em instalar por plataforma.
Continue lendo
Cookies e LGPD à luz do Guia Orientativo da ANPD
Como a ANPD interpreta cookies: classificação por finalidade, base legal, requisitos do consentimento e os erros mais comuns do banner.
Google Consent Mode v2: os sinais, a ordem e o teste
Os sete sinais e os quatro obrigatórios, básico x avançado, código pronto para gtag e GTM, e como conferir a ordem pelo parâmetro gcs.
Multa da ANPD: o valor real para uma empresa pequena
O teto de R$ 50 milhões não é o seu número. Como a ANPD chega ao valor, o que ela já aplicou e por onde um processo começa numa PME.
Por que o remarketing quebrou: os sinais que mudaram
Público que encolhe e conversão que cai sem queda de venda: como separar cookie de terceiro, ITP, ATT e Consent Mode v2, e o plano de recuperação.