O Problema Que Ninguém Vê até Ser Tarde Demais
Era uma campanha de e-mail para base de 480.000 assinantes de uma grande rede varejista. O utm_campaign estava definido no briefing como "Semana do Cliente — 50% OFF". Parecia inofensivo. O disparo foi feito, os cliques chegaram, as conversões aconteceram — e o Google Analytics 4 mostrava tráfego, mas a atribuição de campanha estava fragmentada em ao menos oito variações diferentes: (not set), Semana do Cliente, 50, OFF, entre outros fragmentos sem sentido.
Levou três semanas para identificar a causa raiz. O problema era que o valor do parâmetro UTM não estava codificado corretamente. O traço duplo (—), que é um caractere Unicode diferente do hífen simples (-), e o símbolo % dentro da string foram interpretados pelo servidor e pelos redirecionadores de e-mail de formas distintas, quebrando o parâmetro no meio.
Três semanas de dados contaminados. Uma campanha que movia R$ 2,3 milhões em verbas publicitárias sem dados confiáveis de atribuição.
Quais Caracteres Precisam Ser Codificados em URLs
A especificação RFC 3986 define quais caracteres são "seguros" em URLs e quais precisam de codificação percentual. Para parâmetros de query string — exatamente onde ficam os UTMs — a lista de caracteres que exigem encode é extensa:
- Espaço →
%20(ou+em alguns contextos, mas%20é mais seguro) - & →
%26(o & é o separador de parâmetros; dentro de um valor, precisa ser codificado) - % →
%25(o próprio símbolo de porcentagem precisa de escape) - = →
%3D(separa chave de valor; dentro de um valor, precisa de encode) - + →
%2B - # →
%23(inicia um fragmento — nunca deve aparecer antes do fragmento intencional) - ã, õ, ç e outros caracteres acentuados → UTF-8 percentual:
ã=%C3%A3,ç=%C3%A7,õ=%C3%B5 - Traço duplo (—, em dash) →
%E2%80%94
O ponto crítico para o marketing de varejo: nomes de campanhas brasileiras frequentemente incluem acentos, o símbolo de porcentagem (50% OFF) e travessões. Toda essa combinação é uma bomba-relógio se não for encodada antes de entrar na URL.
encodeURIComponent vs encodeURI: Qual Usar em UTMs
JavaScript oferece duas funções nativas de codificação, e a confusão entre elas é comum mesmo entre desenvolvedores experientes.
encodeURI(url) codifica uma URL completa, mas preserva os caracteres que têm função estrutural: :, /, ?, &, =, #. É útil quando você tem a URL completa e quer apenas torná-la segura sem destruir sua estrutura.
encodeURIComponent(valor) codifica tudo, inclusive os caracteres estruturais. É a função correta para codificar valores de parâmetros — incluindo os valores de UTMs. Se você quer que utm_campaign=Semana do Cliente — 50% OFF seja transmitido corretamente, o valor deve passar por encodeURIComponent:
const campaign = "Semana do Cliente — 50% OFF";
const encoded = encodeURIComponent(campaign);
// resultado: "Semana%20do%20Cliente%20%E2%80%94%2050%25%20OFF"
const url = `https://loja.com.br/promo?utm_source=email&utm_campaign=${encoded}`;
Nunca use encodeURI para codificar valores de parâmetros. Ela não codifica & e =, o que significa que um valor como A&B seria interpretado como dois parâmetros separados.
Como o GA4 Interpreta Parâmetros Malformados
O Google Analytics 4 processa os parâmetros UTM na chegada do clique. Quando o valor de utm_campaign chega malformado — por exemplo, utm_campaign=Semana%20do%20Cliente%20—%2050 seguido de OFF como se fosse outro parâmetro — o GA4 registra o que consegue interpretar e descarta o restante ou cria sessões com atribuição incorreta.
O resultado prático em relatórios:
- Uma campanha aparece como várias campanhas diferentes com tráfego fragmentado
- Sessões atribuídas a
(not set)aumentam sem motivo aparente - A métrica de conversão por campanha fica subestimada para a campanha real e "vazada" para outras categorias
- Relatórios de ROAS ficam imprecisos — verba investida vs receita atribuída não bate
Esse tipo de contaminação é especialmente grave em campanhas de alto volume porque os dados contaminados ficam armazenados definitivamente. O GA4 não retroage dados históricos quando o problema é corrigido — você perde aquele período para sempre em termos de análise confiável.
Checklist de Validação Antes de Disparar uma Campanha
Com base em anos operando campanhas de e-mail para bases multimilionárias no varejo brasileiro, este é o protocolo de validação de URLs que adotamos:
- Gere todos os links da campanha com uma ferramenta de URL building — nunca à mão no bloco de notas
- Cole cada URL no URL Encoder/Decoder e verifique a versão decodificada para confirmar que o valor original é preservado corretamente
- Teste o link no GA4 DebugView — ative o modo debug e clique no link para ver em tempo real como o GA4 interpreta cada parâmetro
- Verifique caracteres especiais no nome da campanha: acentos, %, &, #, traços duplos, aspas
- Valide redirecionamentos — se a URL passa por encurtadores ou redirecionadores do ESP (plataforma de e-mail), verifique se eles preservam os parâmetros encodados
- Teste em pelo menos 3 clientes de e-mail: Outlook tende a corromper URLs longas, Gmail e Apple Mail geralmente preservam
- Confirme na campanha ao vivo 30 minutos após o disparo — veja no GA4 Realtime se a fonte/meio aparece corretamente
A Ferramenta Certa para o Trabalho
O URL Encoder/Decoder da Toolbox Dev Design permite colar uma URL completa com UTMs e ver instantaneamente a versão encodada e decodificada lado a lado. Para campanhas de varejo, o fluxo ideal é: escrever o valor do UTM em linguagem natural → encodar → copiar o resultado para o template de e-mail. Nunca o contrário.
Perguntas Frequentes
É possível recuperar os dados de campanha que foram registrados errado no GA4?
Não. O GA4 não permite edição retroativa de dados históricos. Uma vez que uma sessão é registrada com atribuição incorreta, esse dado permanece assim permanentemente. A única saída é corrigir o problema para as coletas futuras e usar anotações no GA4 para documentar o período afetado, facilitando a interpretação futura dos relatórios.
O Google Tag Manager resolve o problema de UTMs malformados automaticamente?
Não automaticamente. O GTM processa os parâmetros que chegam na URL — se o UTM já chega malformado, o GTM vai ler o valor malformado. O GTM pode ajudar a normalizar valores via variáveis JavaScript customizadas após a chegada, mas a solução mais robusta é garantir que a URL saia correta da plataforma de e-mail ou da planilha de UTMs da campanha.
Devo usar hífen ou underline nos valores de UTM?
Ambos são seguros em termos de URL encoding — nem hífen nem underline precisam ser codificados. A escolha é de convenção: hífens são preferíveis para utm_campaign e utm_content porque facilitam a leitura nos relatórios. O importante é ser consistente em toda a organização e documentar o padrão adotado. Nunca use espaços, acentos ou caracteres especiais diretamente — sempre encode ou substitua por hífen.
Plataformas de e-mail como Klaviyo ou RD Station encodam os UTMs automaticamente?
Depende da plataforma e da configuração. Algumas encodam automaticamente, outras não. Algumas encodam o link como um todo mas podem dobrar o encoding (encodar um link já encodado, gerando %2520 em vez de %20). A prática mais segura é sempre testar enviando um e-mail de teste para si mesmo e verificar o link resultante antes do disparo para a base completa.