Pular para o conteúdo
Concedo
Comece grátis
Menu

Como instalar o banner do Concedo pelo Google Tag Manager

Publicado em 24 de agosto de 2026 · atualizado em 2 de setembro de 2026

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çãoMétodo recomendado
Todas as tags do site passam pelo GTM e você não pode editar o HTMLLoader no GTM, pelo gatilho de inicialização do consentimento (Método A)
Você consegue editar o <head> do siteLoader direto no <head>, e o GTM só para as tags (Método B)
Existe pixel colado no tema, em plugin ou em app da plataformaLoader 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çãoDuas instalações
Banners na tela12, um cobrindo o outro
Clique do visitante no bannerpassanão passa
Página responde depois da escolhasimnão, a aba trava
Consentimentos registrados10

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

  1. Decida qual instalação fica, pela tabela de "Antes de tudo". Na dúvida, fica a do <head> (método B).
  2. 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.
  3. Rode o comando acima de novo, em janela anônima. Precisa devolver um item só.
  4. 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=600 e 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

  1. No GTM, abra Administrador → Configurações do contêiner.
  2. Marque Ativar visão geral do consentimento (Enable consent overview).
  3. 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.

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êinerA verificação de consentimento de cada tagO motor de bloqueio do Concedo
Tag do Google sem verificação configuradaDispara em modo negado pelo Consent Mode: sem cookie, mas com requisiçãoNem a requisição sai
Tag de HTML personalizado sem verificação configuradaVazaNem a requisição sai
Script colado no tema, fora do GTMVaza (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:

  1. O loader fica o mais alto possível dentro do <head>, acima do contêiner do GTM.
  2. Sem async e sem defer. Com async, 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.

TagSinais exigidos
Google Analytics 4analytics_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.

MecanismoCobreImpede a requisição de rede?
type="text/plain" data-category="..."Tag estática que o dono do site marcouSim
Interceptação de document.createElement + setter de srcTag injetada por JavaScript (GTM, lazy-load, pixel tardio)Sim
Reescrita de document.writeTag de site legado escrita durante o parseSim
MutationObserver no documentElementTag estática não marcadaNã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:

Valorad_storageanalytics_storage
G100negadonegado
G101negadoconcedido
G110concedidonegado
G111concedidoconcedido

Se o gcs não existir na requisição, o Consent Mode não está funcionando.

O teste que aprova a instalação

  1. 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.
  2. 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.
  3. Só estatísticas. GA4 dispara; Meta e TikTok, não.
  4. 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

ErroSintomaCorreção
Gatilho "Todas as páginas" no loaderCookie de terceiro criado antes de qualquer interaçãoTrocar pelo gatilho de inicialização do consentimento
Variável Concedo - chave publica do site vazia[Concedo] snippet sem data-chave no console e nenhum bannerColar a chave pública do painel
Importação feita com Substituir em vez de MesclarTags do contêiner sumiramRestaurar a versão anterior do contêiner e importar de novo mesclando
consent default de outra CMP no contêinerEstado imprevisível entre navegadoresPausar 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 telaConfigurar os sinais tag a tag, ou migrar para o método B
Tag de HTML personalizado sem verificação de consentimentogcs=G100 e mesmo assim o _fbp apareceConfigurar os sinais exigidos na tag
Loader com async/defer por otimizadorFunciona no seu navegador e falha no do clienteExcluir o loader das otimizações e limpar o cache
Contêiner não publicadoFunciona no modo de visualização e não em produçãoPublicar a versão
Duas CMPs instaladasDois banners, dois defaultsRemover a antiga de verdade, inclusive resquício no tema
Loader do Concedo no tema e no GTMDois banners, nenhum clicável, aba travada e nenhum consentimento registradoRemover 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

  1. Escolha o método pela tabela de "Antes de tudo": um só, nunca os dois.
  2. Configure a verificação de consentimento tag a tag, o passo mais esquecido de todos.
  3. Guarde a lista do scanner gratuito como critério de aprovação: no fim, nada dela pode disparar antes do aceite.
  4. Faça a verificação de "Publique e verifique" inteira, incluindo compra de teste se for loja.
  5. Para o detalhamento de cada sinal e da modelagem de conversões, leia o guia do Google Consent Mode v2.
  6. Se o seu site é WordPress, Shopify, Nuvemshop, Wix ou VTEX, o passo a passo do tema está em instalar por plataforma.

Continue lendo

O que o seu site carrega antes de alguém aceitar?

O scanner abre algumas páginas como um visitante anônimo e lista os cookies, scripts e iframes de terceiros que disparam sem consentimento nenhum.

Sem cadastro e sem cartão. O resultado abre numa página de endereço próprio, que não é indexada e que ninguém encontra sem o link.