Já implementei rastreamento de UTM de ponta a ponta em três empresas. Toda vez, as mesmas cinco coisas quebraram na mesma ordem, e toda vez a correção foi a mesma: puxar a templatização para o nível de campanha, empurrar o encaminhamento de conversão para o servidor, e colocar um dry run entre os dois. Isso é a maior parte deste post. O resto é o checklist de QA que pega as coisas que você não pensou em quebrar.
Se você ainda não tem certeza do que cada uma das cinco tags faz, parâmetros de UTM explicados é a introdução sobre a qual este pipeline se constrói.
Você não precisa de uma Customer Data Platform para isso. Vai precisar de uma eventualmente se o seu problema de atribuição virar "costurar quatro toques anônimos em três dispositivos em uma única jornada de cliente", mas para o caso que vejo com mais frequência - "marcar todo link de saída de forma consistente, capturar o clique, encaminhar a conversão para o Meta e o GA4 do lado do servidor, e sobreviver ao Safari" - um encurtador de URL com templates mais uma API de conversões dá conta do recado. Abaixo está a versão que funciona, com os modos de falha que já vi acontecer.
O que dá errado com o rastreamento de UTM
Os profissionais de marketing com quem trabalho não são ruins com UTMs. O problema é que as ferramentas por padrão tornam fácil digitar uma UTM uma vez, difícil aplicá-la de forma consistente em toda a organização, e impossível corrigir depois do lançamento. Quatro modos de falha aparecem repetidamente.
Desvio. Uma pessoa digita utm_source=newsletter, outra digita utm_source=Newsletter, uma terceira digita utm_source=email. Seis meses depois seu canal "newsletter" está dividido em nove variantes de string no GA4. Limpar isso depois do fato é um exercício de regex e reza. O script original urchinTracker() que introduziu essa convenção - o produto de web analytics Urchin do Google pré-Analytics, de código aberto brevemente em 2003 antes de ser absorvido - também não tinha uma camada de template. A convenção sempre foi "digite de forma consistente"; a ferramenta nunca aplicou isso.
Marcação manual em escala. Uma campanha de flyer com 80 links curtos em quatro lojas regionais são 320 URLs que você precisa digitar, colar em uma planilha, copiar para o seu encurtador, e torcer. Metade delas recebe o utm_content errado. Ninguém percebe até a campanha estar duas semanas no ar.
Lacunas de conversão server-side. O pixel dispara na página de agradecimento, o GA4 captura, o Meta captura, e você vai para casa. Então o Safari lança outra versão do ITP, as instalações de bloqueadores de anúncio sobem, e suas conversões reportadas caem um terço. As notas de lançamento do ITP 2.3 da Apple percorrem exatamente o mecanismo: a decoração de link é limitada, o document.referrer é removido, e qualquer fluxo de analytics que depende do navegador executando JS de terceiros se degrada silenciosamente. As conversões continuam acontecendo no seu servidor. Elas simplesmente não chegam às superfícies de anúncio.
Nenhum dry-run. A primeira conversão que flui pelo novo pipeline é o primeiro comprador real. Se algo está mal configurado, você descobre três dias depois, quando o algoritmo de otimização já retirou orçamento de uma campanha que na verdade estava funcionando.
Este post trata dos três primeiros com templates + importação em massa + encaminhamento server-side, e do quarto com uma etapa de verificação fácil de pular e cara de pular.
Templates de UTM de workspace e campanha
Templates empurram o problema de consistência para cima na pilha. Você define sua convenção de marcação uma vez no nível do workspace, aplica substituições por campanha onde são justificadas, e deixa cada link herdar. Não sobra lugar para um erro de digitação viver.
Defina primeiro os padrões do workspace. Valores literais fixam as variáveis que nunca mudam para sua organização (utm_medium = email para campanhas de newsletter); placeholders preenchem a partir do payload do link no momento da criação:
curl -X PUT \
https://api.elido.app/v1/workspaces/1/utm-template \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-d '{
"utm_source": "{{ channel }}",
"utm_medium": "{{ medium }}",
"utm_campaign": "{{ campaign }}",
"utm_content": "{{ creative }}",
"utm_term": "{{ audience.segment }}"
}'
Alguns detalhes que importam aqui:
- Os placeholders são preenchidos no momento da criação do link, não no momento do clique. O que chega na sua ferramenta de analytics é o que foi pretendido no momento em que o link foi criado, não o que o destino do link calculou no clique. Isso torna a reconstrução do log de auditoria muito mais fácil quando algo parece errado seis meses depois.
- Placeholders desconhecidos falham rápido. Se sua importação em massa está sem uma coluna
creativee o template do workspace referencia{{ creative }}, a API retorna um 422 com o nome da variável não resolvida. Sem aplicação parcial silenciosa. - A referência completa do template, incluindo os placeholders
link.tag.<name>que leem do array de tags do link (útil para agências multi-tenant que precisam embutir um identificador de cliente em toda URL), está no guia da documentação.
Depois aplique um template de campanha. Campanhas herdam do workspace e substituem o subconjunto que é específico da campanha:
curl -X POST \
https://api.elido.app/v1/campaigns \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-d '{
"name": "Spring 2026 - DACH",
"utm_template": {
"utm_campaign": "spring_2026_dach",
"utm_term": "{{ audience.locale }}"
}
}'
Qualquer coisa não definida na campanha cai para os padrões do workspace. O empilhamento em dois níveis cobre a maioria das estruturas organizacionais reais: convenções compartilhadas no nível do workspace, substituições específicas de equipe ou de temporada no nível da campanha. Se você se pegar querendo um terceiro nível de herança, isso é um sinal de alerta - geralmente significa que duas campanhas deveriam ser uma única campanha com valores de placeholder mais inteligentes.
O que as substituições por link abrem mão: uma substituição dispara independentemente do template. O que elas mantêm: a substituição fica registrada no log de auditoria com autor + timestamp + a diferença entre o resolvido e o final. Daqui a seis meses, quando alguém perguntar por que um link em uma campanha de 200 links tem utm_term=manual_override, você consegue responder.
Importação em massa a partir do Sheets - o workflow que a maioria dos profissionais de marketing realmente usa
Profissionais de marketing não ficam o dia todo no curl. O briefing da campanha chega como uma planilha com URLs de destino e metadados de campanha, o prazo de lançamento é sexta-feira, e a pergunta é como essa planilha vira 200 links curtos sem ninguém digitar a mesma string de UTM 200 vezes.
Os nomes de coluna do CSV correspondem aos nomes de placeholder do seu template (sem diferenciar maiúsculas de minúsculas). Colunas que o Elido não reconhece são descartadas com um aviso em vez de copiadas silenciosamente - isso é proposital. Cópia silenciosa é como você acaba com utm_brand_color aparecendo no GA4 porque alguém adicionou uma coluna para uma anotação interna.
destination_url,channel,medium,creative
https://shop.example.com/de,newsletter,email,hero_a
https://shop.example.com/fr,newsletter,email,hero_a
https://shop.example.com/de,paid_social,meta,carousel_v2
https://shop.example.com/fr,paid_social,meta,carousel_v2
Envie como multipart via POST:
curl -X POST \
https://api.elido.app/v1/links/bulk \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-F "csv=@launch_q2.csv" \
-F "campaign_id=cmp_8a2f"
Duas coisas que esse fluxo de validação te dá que a interface de um-link-por-vez não dá:
- Commit tudo ou nada. Uma única linha ruim aborta o upload inteiro e retorna os números das linhas problemáticas mais o motivo -
row 47: unresolved variable {{ creative }}é um erro muito melhor do que descobrir às 16h de uma sexta-feira que 47 dos seus 200 links resolveram para uma string de placeholder. - Prévia antes do lançamento. A linha de prévia de importação em massa do painel mostra a URL resolvida, incluindo a query string
utm_*renderizada, antes do commit. Olhe o segundo link para garantir que seu template fez o que você esperava, depois olhe o último link para garantir que as linhas mais abaixo do arquivo não desviaram. Duas olhadas, um minuto.
Se sua planilha não tem um formato estável - ordens de coluna embaralham, cabeçalhos são renomeados - o endpoint de importação em massa vai ser desagradável. A correção não está na nossa ferramenta; a correção é se comprometer com um esquema de CSV para os briefings da sua campanha e tratar o desvio de esquema como um bug de processo. Discutimos o padrão mais amplo na página de soluções para profissionais de marketing.
Encaminhamento de conversão server-side para Meta CAPI e GA4
Atribuição apenas por pixel perde de 20 a 40% das conversões para o ITP do Safari, bloqueadores de anúncio e banners de consentimento. O número varia por setor - e-commerce DTC vê a ponta alta do intervalo, B2B SaaS a ponta baixa - mas toda medição que já vi pós-iOS 14 coloca a confiabilidade do pixel bem abaixo da marca de 95% que as plataformas de anúncio assumem. O algoritmo de otimização recebe inputs mais ruidosos e seu CPA parece pior do que realmente é.
A documentação da Conversions API da Meta é explícita sobre isso: eventos de servidor são o que você quer, o pixel do lado do navegador é o complemento. O Measurement Protocol do GA4 faz o mesmo argumento. Os dois protocolos aceitam o mesmo formato: um evento server-side com os detalhes da conversão, um event_id para deduplicação, e idealmente identificadores de usuário com hash para que as plataformas possam costurar a conversão a um visitante conhecido.
O encanamento que fecha a lacuna é mecânico. Três passos.
Passo um - capture o click_id. Toda resposta de redirecionamento do Elido carrega um header X-Elido-Click-Id. Os SDKs de TS / Python / Go o expõem no objeto de resposta do redirecionamento; HTTP bruto também funciona:
curl -sI https://elido.me/launch | grep -i click-id
# X-Elido-Click-Id: clk_01HYZ7T8WV6KQX3M
Guarde-o em um cookie first-party na página de destino (elido_click_id, TTL de 90 dias - longo o suficiente para cobrir uma avaliação típica de SaaS, curto o suficiente para satisfazer as diretrizes de ePrivacy). Leia-o de volta no checkout.
Passo dois - conecte os destinos. Envie via PUT as credenciais para as superfícies para as quais você quer encaminhar. Qualquer subconjunto funciona; superfícies ausentes são puladas silenciosamente:
curl -X PUT \
https://api.elido.app/v1/workspaces/1/conversion-forwarding \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-d '{
"meta_capi": {
"pixel_id": "1234567890",
"access_token": "EAA…",
"test_event_code": null
},
"ga4_mp": {
"measurement_id": "G-ABC123",
"api_secret": "abc_def_ghi"
}
}'
O Mixpanel não é um destino de conversão. A integração do Elido com o Mixpanel encaminha cada clique em link curto como um evento link_click, e você o conecta separadamente em Integrações.
Passo três - envie a conversão via POST. Quando o pedido dispara, envie o evento com o click_id e os detalhes do pedido. event_id é sua chave de idempotência:
curl -X POST \
https://api.elido.app/v1/conversions \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-d '{
"click_id": "clk_01HYZ7T8WV6KQX3M",
"event_name": "purchase",
"event_id": "ord_98231",
"value": 89.00,
"currency": "EUR",
"user": {
"email": "[email protected]",
"phone": "+4915123456789",
"external_id": "cust_5128"
}
}'
Os campos de identidade do usuário recebem hash SHA-256 antes de serem encaminhados para o Meta e o GA4 - é o que as duas plataformas exigem. O contexto de UTM é extraído da linha de clique que corresponde ao click_id, então o evento encaminhado carrega a atribuição de campanha original mesmo que o usuário tenha navegado pelo site por uma hora antes de finalizar a compra. A mecânica completa, incluindo tratamento de reembolso e a chave de alternância do modelo de atribuição multi-toque, está no guia de encaminhamento de conversão.
Isso fecha a maior parte da lacuna. Existe um buraco residual - visitantes que bloqueiam o cookie de click_id, ou chegam por um caminho que não passa pelo Elido - mas para as campanhas para as quais você realmente direciona tráfego, você passou de "60-80% de confiabilidade de pixel" para "95%+ de confiabilidade server-side".
Três casos extremos que o log de auditoria vai te salvar
Templates e encaminhamento cuidam do caminho feliz. Os casos abaixo aparecem na terceira semana de qualquer campanha não trivial, e a resposta certa para todos eles vive no log de auditoria + no painel de conversões, não em tentar projetar um template mais elaborado.
Um caso que não está nesta lista porque você não consegue resolver com template: um clique que chega sem referrer e com um parâmetro de campanha que você não definiu. É o que assistentes de IA enviam, e rastreando tráfego do ChatGPT trata do que fazer com isso.
Reembolsos. Uma conversão de compra disparou, o cliente devolveu o item uma semana depois, e sua receita reportada agora está 8% alta demais. A correção é enviar via POST o mesmo event_id com event_name: "refund". Meta e GA4 tratam isso como uma conversão negativa contra a original. O motivo de event_id ter esse formato: idempotência no nível do id do evento significa que você também não consegue contar o reembolso em dobro. O padrão completo está documentado na seção de casos extremos do guia de encaminhamento de conversão - reembolsos, reembolsos parciais e crédito na loja têm cada um um formato ligeiramente diferente.
Falhas de click-id. Uma conversão dispara com um click_id que não corresponde a nenhum clique conhecido - erro de digitação, expirou além da retenção, workspace errado. A conversão ainda é registrada contra o workspace, mas encaminhada com contexto de UTM vazio. Isso é proposital: atribuição catch-all é mais útil do que descartar a conversão, e a flag click_id_unknown no log de auditoria permite filtrar a fatia não atribuída ao gerar relatórios. Se a fatia for maior que 5% das conversões, algo está errado em como você persiste o click_id na página de destino - geralmente o atributo SameSite do cookie ou o escopo do caminho.
Conversões de chegada tardia. Uma venda B2B SaaS fecha 47 dias depois do clique original. A retenção padrão de clique do Elido é 30 dias, então quando a conversão dispara, o clique já expirou e você está no caso de falha de click-id acima. Duas correções, dependendo do seu ciclo de vendas: aumente a retenção para 90 dias no workspace (plano Pro e acima), ou capture o click_id em um identificador first-party de vida longa (a coluna original_click_id do seu registro de cliente) para poder costurá-lo de volta no momento da conversão mesmo que o cookie tenha sumido. Já vimos os dois padrões em produção.
O log de auditoria mostra a diferença entre o UTM resolvido e o final por link, o código de resposta de encaminhamento por destino por conversão, e o estado de junção entre click_id e conversão. Quando o algoritmo de otimização retira orçamento de uma campanha que parece com desempenho fraco, o log de auditoria é o que permite dizer "não, a campanha está bem; perdemos três dias de encaminhamento para um api_secret do GA4 que foi rotacionado". Olhe para ele.
O QA pré-lançamento - faça um dry-run de todo o pipeline
Não deixe que a primeira conversão que passa por isso seja um comprador real. O custo de um dry run de 30 minutos é todo seu; o custo de um pipeline mal configurado é o algoritmo de otimização retirando orçamento da sua campanha de melhor desempenho por dois dias antes de você perceber. A assimetria é ruim.
Três passos, em ordem.
Dry run de importação em massa. O endpoint de importação em massa aceita dry_run=true como parâmetro de query. Ele roda a validação, resolve os templates, e retorna os links que seriam criados sem fazer o commit. Abra a resposta em qualquer visualizador de JSON; a URL resolvida de cada linha fica visível. Verifique pontualmente 3 a 5 linhas: o segundo link, o último link, e quaisquer linhas que substituíram os padrões do workspace. Confirme que a query string utm_* é exatamente o que o briefing da sua campanha diz que deveria ser.
Modo de teste do encaminhamento de conversão. O Meta CAPI aceita um parâmetro test_event_code, que roteia o evento para a aba Test Events no Events Manager em vez de produção. Defina-o na configuração de encaminhamento do workspace, envie de 10 a 20 conversões de amostra, e confirme que elas chegam. Mesma ideia para o GA4: defina debug_mode: true nos eventos e verifique no DebugView. Os dois são em tempo real. O objetivo não é verificar pontualmente que a API funciona; o objetivo é pegar um pixel_id mal configurado ou um api_secret que foi rotacionado e nunca atualizado.
Teste de fumaça de ponta a ponta. Clique em um dos seus links curtos reais a partir de uma sessão de navegador limpa. Observe o clique no painel de cliques recentes do painel do Elido. Finja que comprou algo - envie via POST uma conversão purchase com esse click_id a partir do seu terminal. Confirme que a conversão aparece nos Test Events do Meta e no DebugView do GA4 com o contexto de UTM correto anexado. O ciclo inteiro leva menos de 10 minutos depois que você já fez uma vez.
Depois que os três passarem, remova o test_event_code, defina debug_mode: false, e lance. O primeiro comprador real terá um pipeline limpo esperando por ele.
Quando você realmente vai querer uma CDP
Templates mais importação em massa mais encaminhamento server-side te leva a maior parte do caminho. Existe uma classe de problemas onde isso não é suficiente, e recorrer a uma CDP é a decisão certa.
Costura de identidade entre dispositivos. Um visitante clica em um link no celular, não converte, volta no desktop, se cadastra. Você quer os dois toques atribuídos à mesma pessoa. Rastreamento de UTM + click_id é no nível do toque; a camada de identidade de usuário que transforma os dois toques em uma única jornada é para o que uma CDP (Segment, mParticle, RudderStack) foi construída. O Elido armazena até 30 dias de cliques por visitante e aceita atribuição de último toque / primeiro toque / baseada em posição dentro dessa janela, mas a junção entre dispositivos precisa de um grafo de identidade que deliberadamente não operamos.
Personalização abaixo de 100ms. Se você está renderizando a página de destino com base nos toques anteriores do visitante em tempo real - puxando o coorte de um feature store e variando o título principal - você precisa da resolução de identidade próxima à renderização. Isso é território de CDP ou, mais frequentemente, uma plataforma de experimentação como PostHog ou LaunchDarkly sobreposta.
Atribuição multi-toque em escala. Último toque é suficiente para a maioria das campanhas. Se seu ciclo de vendas tem seis toques ao longo de quatro meses e você genuinamente precisa creditar cada um, você está em território onde a atribuição por cadeia de Markov ou valor de Shapley começa a importar. O Elido faz último toque / primeiro toque / baseado em posição; qualquer coisa mais sofisticada precisa de uma ferramenta com um grafo de identidade adequado e uma camada de modelo.
Para tudo mais - e "tudo mais" é a maioria das equipes de marketing com quem já trabalhei - o padrão de templates + importação em massa + encaminhamento server-side é suficiente. Configure o template do workspace uma vez, o template de campanha por lançamento, a configuração de encaminhamento uma vez por integração de plataforma, e rode o dry run antes de todo lançamento. Se você fizer os quatro, vai ter um pipeline de UTM mais rigoroso do que 80% das equipes de marketing que já auditei.
Construa uma vez, faça o dry-run antes de cada lançamento, e siga para a próxima campanha.
Relacionados no blog
- Parâmetros de UTM explicados: as cinco tags e como funcionam
- Rastreamento server-side do GA4 pela camada de redirecionamento
- Atribuição sem cookies explicada: o que ainda funciona em 2026
- Importação em massa de links curtos a partir de uma planilha do Google (o workflow real de campanha)
- Atribuição de clique depois do ITP do Safari: o que ainda funciona em 2026
- Como rastrear cliques em links: o que você pode e não pode ver
- Construtor de UTM gratuito: crie URLs de campanha rastreáveis
- O que é CTR e como aumentá-lo
Experimente Elido
Cole uma URL, obtenha um link curto
Sem cadastro. O link vive 30 dias. Cadastre-se para mantê-lo para sempre.
Grátis, sem necessidade de registo · 2 por dia