{"id":983,"date":"2026-04-01T16:59:50","date_gmt":"2026-04-01T16:59:50","guid":{"rendered":"https:\/\/cms.funnelsheet.com\/?p=983"},"modified":"2026-04-01T16:59:50","modified_gmt":"2026-04-01T16:59:50","slug":"how-to-preserve-utm-parameters-on-pages-that-use-iframes","status":"publish","type":"post","link":"https:\/\/cms.funnelsheet.com\/?p=983","title":{"rendered":"How to Preserve UTM Parameters on Pages That Use iFrames"},"content":{"rendered":"<p>Preservar par\u00e2metros UTM em p\u00e1ginas que utilizam iFrames \u00e9 um problema que aparece em campanhas com grande diversidade de criativos e parcerias de conte\u00fado. Quando a landing carrega um iFrame com conte\u00fado de terceiros ou de uma origem diferente, os par\u00e2metros como utm_source, utm_medium e utm_campaign nem sempre chegam at\u00e9 o c\u00f3digo de rastreamento do dom\u00ednio pai. O resultado \u00e9 uma atribui\u00e7\u00e3o nebulosa: cliques, visitas e convers\u00f5es parecem n\u00e3o se conectar, o que mina a confiabilidade do funil e inviabiliza decis\u00f5es r\u00e1pidas. Este texto foca exatamente nessa dor: por que os UTMs somem, o que realmente funciona na pr\u00e1tica e como estruturar uma passagem segura e audit\u00e1vel entre a p\u00e1gina principal e o iframe para manter a rastreabilidade com GA4, GTM Server-Side e BigQuery. Voc\u00ea vai encontrar caminhos acion\u00e1veis, desde ajustes de URL do iframe at\u00e9 estrat\u00e9gias de comunica\u00e7\u00e3o entre janelas, sempre com foco em implementa\u00e7\u00e3o realista, n\u00e3o em tutoriais para iniciantes. <\/p>\n<p>Voc\u00ea ver\u00e1 como diagnosticar rapidamente onde o problema est\u00e1 ocorrendo, quais regras t\u00e9cnicas importam (origem cruzada, mesma origem, mensagens entre janelas, altera\u00e7\u00f5es de src) e como construir uma linha de passagem entre o dom\u00ednio da landing e o iframe para manter a consist\u00eancia de dados. No fim, ter\u00e1 um checklist pr\u00e1tico de implementa\u00e7\u00e3o, um roteiro de valida\u00e7\u00e3o com GA4\/DebugView e um conjunto de decis\u00f5es que ajudam a escolher entre abordagens client-side ou server-side, evitando surpresas na auditoria de dados.<\/p>\n\n\n                        <figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1161\" height=\"1200\" src=\"https:\/\/cms.funnelsheet.com\/wp-content\/uploads\/2026\/04\/2gjp_az2o_i.jpg\" alt=\"a hard drive is shown on a white surface\" class=\"wp-image-899\" srcset=\"https:\/\/cms.funnelsheet.com\/wp-content\/uploads\/2026\/04\/2gjp_az2o_i.jpg 1161w, https:\/\/cms.funnelsheet.com\/wp-content\/uploads\/2026\/04\/2gjp_az2o_i-290x300.jpg 290w, https:\/\/cms.funnelsheet.com\/wp-content\/uploads\/2026\/04\/2gjp_az2o_i-991x1024.jpg 991w, https:\/\/cms.funnelsheet.com\/wp-content\/uploads\/2026\/04\/2gjp_az2o_i-768x794.jpg 768w\" sizes=\"auto, (max-width: 1161px) 100vw, 1161px\" \/><\/figure>\n                        \n\n<h2>O problema real por tr\u00e1s da perda de UTMs com iFrames<\/h2>\n<blockquote><p>As UTMs n\u00e3o s\u00e3o propagadas automaticamente para o conte\u00fado interno do iframe. Quando a origem \u00e9 diferente, o navegador restringe o acesso aos par\u00e2metros da URL pai, o que impede a captura de dados de atribui\u00e7\u00e3o do lado interno.<\/p><\/blockquote>\n<h3>Sandboxing e pol\u00edticas de mesma origem<\/h3>\n<p>Quando um iframe carrega conte\u00fado de outra origem, a pol\u00edtica de mesma origem impede que o c\u00f3digo dentro do iframe veja a URL da p\u00e1gina pai. Mesmo que o URL pai contenha utm_source, utm_medium e utm_campaign, o conte\u00fado no iframe pode n\u00e3o ter acesso a esses valores de forma confi\u00e1vel. Em muitos cen\u00e1rios, isso resulta em dados de convers\u00e3o atribu\u00eddos \u00e0 origem do iframe em vez da origem real da visita. Em termos pr\u00e1ticos, voc\u00ea pode ver cliques com UTMs ausentes no relat\u00f3rio do GA4 para eventos disparados a partir do conte\u00fado do iframe.<\/p>\n<h3>Cross-domain e acesso aos par\u00e2metros<\/h3>\n<p>Se o iframe n\u00e3o estiver sob a mesma origem, a \u00fanica maneira confi\u00e1vel de preservar UTMs \u00e9 atrav\u00e9s de passagem expl\u00edcita de par\u00e2metros no momento de carregar o iframe (src) ou por mecanismos de comunica\u00e7\u00e3o entre janelas (postMessage) quando o conte\u00fado do iframe \u00e9 seu ou voc\u00ea tem controle sobre ele. Sem isso, a captura de dados fica fragmentada entre o dom\u00ednio da landing e o dom\u00ednio do iframe, inviabilizando atribui\u00e7\u00e3o fiel na cad\u00eancia de convers\u00f5es.<\/p>\n<h3>Impacto na atribui\u00e7\u00e3o e na qualidade de dados<\/h3>\n<p>A consequ\u00eancia direta \u00e9 a distor\u00e7\u00e3o de dados: convers\u00f5es que ocorrem ap\u00f3s intera\u00e7\u00f5es em iFrames podem n\u00e3o aparecer com o mesmo source\/medium da campanha original. Em GA4, isso pode se traduzir em relat\u00f3rios com \u201c(entradas diretas)\u201d ou cadeias de eventos desconexas. Em GTM Server-Side, a complexidade aumenta: voc\u00ea precisa garantir que os eventos da p\u00e1gina pai e do iframe sejam ligados de forma determin\u00edstica, preferencialmente com uma identifica\u00e7\u00e3o comum (user_id, client_id, session_id) que possa ser mapeada entre os contextos. A verifica\u00e7\u00e3o constante com ferramentas de debug se torna indispens\u00e1vel para evitar surpresas durante auditorias.<\/p>\n<h2>Abordagens pr\u00e1ticas para preservar UTMs em iFrames<\/h2>\n<blockquote><p>Quando o iframe \u00e9 dom\u00ednio diferente, a solu\u00e7\u00e3o mais previs\u00edvel \u00e9 passar UTMs no src do iframe ou estabelecer uma via de comunica\u00e7\u00e3o entre pai e iframe. Sem essa passagem, a maior parte das plataformas n\u00e3o ter\u00e1 contexto suficiente para atribuir corretamente a convers\u00e3o.<\/p><\/blockquote>\n<h3>Passar UTMs no src do iframe<\/h3>\n<p>A forma mais direta \u00e9 construir o URL do iframe dinamicamente com os par\u00e2metros UTM extra\u00eddos da URL da p\u00e1gina pai. Em termos pr\u00e1ticos, voc\u00ea l\u00ea utm_source, utm_medium, utm_campaign (e opcionalmente utm_term, utm_content) do location.search da p\u00e1gina principal e os acrescenta ao src do iframe. Isso funciona bem quando o iframe hospeda conte\u00fado sob seu controle ou quando o dom\u00ednio da iframe-local pode aceitar par\u00e2metros sem exigir autentica\u00e7\u00e3o extra. Uma implementa\u00e7\u00e3o t\u00edpica envolve uma fun\u00e7\u00e3o que, ao carregar a p\u00e1gina, reconstr\u00f3i o src do iframe com a cadeia de UTMs preservada, garantindo que o conte\u00fado interno j\u00e1 inicie com os par\u00e2metros dispon\u00edveis para o GA4\/gtm dentro do iframe.<\/p>\n<h3>Comunica\u00e7\u00e3o entre janela pai e iframe via postMessage<\/h3>\n<p>Quando n\u00e3o \u00e9 vi\u00e1vel modificar o src ou quando o iframe pertence a uma parte externa, voc\u00ea pode usar postMessage para transmitir UTMs para o conte\u00fado do iframe. O pai envia uma mensagem com o conjunto de UTMs para o iframe, que o recebe (em um listener adequado) e injeta esses par\u00e2metros no ambiente de rastreamento interno (por exemplo, adicionando-os aos eventos de GA4 enviados pelo iframe). O requisito cr\u00edtico \u00e9 que o iframe aceite mensagens e que haja um canal seguro (origem verificada, handshake expl\u00edcito). Essa abordagem funciona bem quando voc\u00ea controla ambas as partes (pai e iframe) e favorece uma arquitetura de telemetry mais robusta, especialmente em cen\u00e1rios de consentimento din\u00e2mico e compatibilidade com LGPD.<\/p>\n<h3>Configurar o iframe para a mesma origem (quando poss\u00edvel)<\/h3>\n<p>Se for poss\u00edvel hospedar o conte\u00fado do iframe na mesma origem da landing, ou manter um dom\u00ednio de iframe sob o mesmo registro, voc\u00ea pode abrir caminho para leitura direta de par\u00e2metros sem as restri\u00e7\u00f5es de CORS\/same-origin. Contudo, essa op\u00e7\u00e3o raramente \u00e9 pr\u00e1tica em integra\u00e7\u00f5es com parceiros ou conte\u00fados de terceiros. Quando vi\u00e1vel, ela simplifica a transmiss\u00e3o de UTMs, facilita a unifica\u00e7\u00e3o de IDs de usu\u00e1rio entre contextos e reduz a depend\u00eancia de mecanismos de cross-document messaging. Em qualquer caso, documente bem as pr\u00e1ticas, pois variar entre dom\u00ednios muda a responsabilidade de conformidade e a efici\u00eancia da coleta de dados.<\/p>\n<h2>Implementa\u00e7\u00e3o pr\u00e1tica: roteiro salv\u00e1vel<\/h2>\n<ol start=\"1\">\n<li>Mapear quais UTMs a campanha utiliza e quais s\u00e3o os par\u00e2metros obrigat\u00f3rios para a atribui\u00e7\u00e3o espec\u00edfica de sua arquitetura (p. ex., utm_source, utm_medium, utm_campaign, utm_content, utm_term).<\/li>\n<li>Criar um helper no frontend (JavaScript) que leia os UTMs da URL da landing e os preserve para uso futuro, sem abandonar a URL original do usu\u00e1rio.<\/li>\n<li>Ao construir o iframe, reescrever o atributo src para incluir os UTMs lidos, garantindo consist\u00eancia entre a origem da visita e o conte\u00fado carregado no iframe.<\/li>\n<li>Se o iframe \u00e9 de terceiros, implemente postMessage com um protocolo simples: envio de objeto { utm_source, utm_medium, utm_campaign } do pai para o iframe com valida\u00e7\u00e3o de origem.<\/li>\n<li>Valide a passagem de UTMs com GA4 DebugView ou com uma simula\u00e7\u00e3o de convers\u00e3o no GA4 para confirmar que o par\u00e2metro de campanha est\u00e1 presente nos eventos gravados pelo iframe.<\/li>\n<li>Implemente fallback l\u00f3gico para casos em que UTMs n\u00e3o estejam dispon\u00edveis (p. ex., blank ou default values) para n\u00e3o poluir relat\u00f3rios com dados amb\u00edguos.<\/li>\n<\/ol>\n<blockquote><p>Valida\u00e7\u00e3o \u00e9 tudo: sem checagem com DebugView ou com logs de evento, voc\u00ea opera no escuro. Confirme que o iframe est\u00e1 recebendo os UTMs \u00fateis e que os eventos chegam do lado interno com o contexto correto.<\/p><\/blockquote>\n<h2>Decis\u00f5es cr\u00edticas, armadilhas e casos de uso<\/h2>\n<h3>Quando esta abordagem faz sentido e quando n\u00e3o faz<\/h3>\n<p>&#8211; Faz sentido quando o iframe hospeda conte\u00fado sob seu controle ou quando voc\u00ea consegue estabelecer postMessage com o iframe de terceiros que aceite esse canal. Em cen\u00e1rios com iframe de dom\u00ednio completamente n\u00e3o confi\u00e1vel ou sem suporte a par\u00e2metros, a alternativa \u00e9 reestruturar o fluxo de dados para que o conte\u00fado do iframe n\u00e3o seja dependente de UTMs herdadas para a atribui\u00e7\u00e3o. Se o iframe representa uma venda cr\u00edtica ou um formul\u00e1rio de lead blindado, priorize a possibilidade de comunica\u00e7\u00e3o entre janelas com valida\u00e7\u00e3o de origem ao inv\u00e9s de confiar apenas no src com UTMs.<\/p>\n<h3>Sinais de que o setup est\u00e1 quebrado<\/h3>\n<p>&#8211; UTMs aparecem na URL da landing, mas n\u00e3o no contexto de eventos disparados dentro do iframe.<br \/>\n&#8211; Eventos de convers\u00e3o vinculados ao iframe aparecem como origem \u201cdirect\/none\u201d ou n\u00e3o possuem utm_source no par\u00e2metro de campanha.<br \/>\n&#8211; DebugView n\u00e3o demonstra a passagem de UTMs, mesmo ap\u00f3s a reconstru\u00e7\u00e3o do src ou ap\u00f3s o handshake de postMessage.<\/p>\n<h3>Erros que prejudicam a confiabilidade e como corrigir<\/h3>\n<p>&#8211; Falha ao lidar com caminhos relativos no src do iframe, levando UTMs a ficarem de fora. Corrija com um c\u00f3digo que cuide da concatena\u00e7\u00e3o correta de query strings e avoid duplica\u00e7\u00e3o de par\u00e2metros.<br \/>\n&#8211; N\u00e3o validar a origem na janela que recebe postMessage. Corrija com checagem estrita de event.origin e handshake de confirma\u00e7\u00e3o antes de aceitar UTMs.<br \/>\n&#8211; Subestimar a necessidade de fallback. Adicione l\u00f3gica para cen\u00e1rios sem UTMs, definindo padr\u00f5es de atribui\u00e7\u00e3o que n\u00e3o contaminem o conjunto de dados.<\/p>\n<h3>Como adaptar \u00e0 realidade de projetos ou clientes<\/h3>\n<p>&#8211; Em projetos com v\u00e1rias plataformas de parceiros, crie um padr\u00e3o de passagem de UTMs que todos os iframe\u2019s respeitem, com um pequeno wrapper de JavaScript no dom\u00ednio pai para padronizar a coleta.<br \/>\n&#8211; Para ag\u00eancias, documente os contratos com clientes envolvendo a responsabilidade pelo iframe de terceiros: quem fornece o c\u00f3digo do iframe, quais UTMs s\u00e3o esperados e como ser\u00e1 feito o handshake de dados.<br \/>\n&#8211; Em ambientes com LGPD, garanta que a passagem de UTMs ocorra apenas quando houver consentimento expl\u00edcito para cookies de marketing e rastreamento, alinhando com consent mode v2 e CMP integrado.<\/p>\n<h2>Boas pr\u00e1ticas, limita\u00e7\u00f5es e decis\u00f5es operacionais<\/h2>\n<p>Em temas de rastreamento e atribui\u00e7\u00e3o envolvendo iFrames, a solu\u00e7\u00e3o n\u00e3o \u00e9 universal. O comportamento depende da origem, da capacidade de modificar o conte\u00fado do iframe, do n\u00edvel de controle sobre o conte\u00fado de terceiros e das pol\u00edticas de consentimento aplicadas. Abaixo v\u00e3o recomenda\u00e7\u00f5es diretas para evitar armadilhas comuns:<\/p>\n<p>&#8211; Decis\u00e3o entre client-side e server-side: se o iframe \u00e9 apenas uma pe\u00e7a de conte\u00fado, a passagem de UTMs via src no client-side costuma ser suficiente. Em cen\u00e1rios mais sens\u00edveis ou com m\u00faltiplos dom\u00ednios, a abordagem server-side para reescrita de URLs ou para envio de eventos com par\u00e2metros UTM pode oferecer maior robustez. Garanta que qualquer solu\u00e7\u00e3o server-side mantenha um v\u00ednculo entre click, landing e convers\u00e3o com IDs \u00fanicos compartilhados entre contextos.<br \/>\n&#8211; Privacidade e consentimento: o Consent Mode v2 pode impactar quando e como os UTMs s\u00e3o usados. N\u00e3o presuma que UTMs ser\u00e3o capturadas independentemente de consentimento; implemente controles que respeitem o usu\u00e1rio e que n\u00e3o comprometam a qualidade dos dados.<br \/>\n&#8211; Limites pr\u00e1ticos: nem todo iframe permite modificar o src ou aceitar mensagens; em tais casos, a estrat\u00e9gia passa a exigir coordena\u00e7\u00e3o com o time do parceiro para incluir UTMs no payload de dados enviado para a plataforma de an\u00e1lise, ou repensar o fluxo de convers\u00e3o para n\u00e3o depender de UTMs herdadas dentro do iframe.<\/p>\n<blockquote><p>Em ambientes com v\u00e1rias fontes de tr\u00e1fego e parcerias, alinhar a passagem de UTMs no momento da montagem do iframe \u00e9 menos arriscado do que depender apenas de cookies ou de dados que podem ficar fora do alcance de GA4.<\/p><\/blockquote>\n<p>Para avan\u00e7ar de forma pr\u00e1tica, comece com um piloto em uma landing simples que usa um iframe com conte\u00fado sob seu controle. Implemente a passagem de UTMs no src, valide com GA4 DebugView e documente o fluxo de dados entre o pai e o iframe. Em seguida, escale para cen\u00e1rios com conte\u00fado de terceiros, sempre mantendo o handshake de dados e o controle de origem em cada passagem de dados. Se desejar, posso ajudar a mapear o seu cen\u00e1rio, propor uma implementa\u00e7\u00e3o espec\u00edfica e acompanhar a valida\u00e7\u00e3o em ambiente de teste.<\/p>\n<p>Para refer\u00eancia t\u00e9cnica adicional sobre como os par\u00e2metros de campanha se comportam no GA, consulte a documenta\u00e7\u00e3o oficial do Google sobre UTMs e campanhas: <a href=\"https:\/\/support.google.com\/analytics\/answer\/1033863?hl=pt-BR\">UTM e par\u00e2metros de campanha no GA<\/a>. Al\u00e9m disso, o GA4 oferece guias de coleta de dados que ajudam a alinhar eventos entre contextos diferentes: <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\">GA4 &#8211; Google Developers<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Preservar par\u00e2metros UTM em p\u00e1ginas que utilizam iFrames \u00e9 um problema que aparece em campanhas com grande diversidade de criativos e parcerias de conte\u00fado. Quando a landing carrega um iFrame com conte\u00fado de terceiros ou de uma origem diferente, os par\u00e2metros como utm_source, utm_medium e utm_campaign nem sempre chegam at\u00e9 o c\u00f3digo de rastreamento do&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[20,13,14,113,12],"content_language":[5],"class_list":["post-983","post","type-post","status-publish","format-standard","hentry","category-blogen","tag-bigquery","tag-ga4","tag-gtm-server-side","tag-iframe","tag-parametros-utm","content_language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts\/983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=983"}],"version-history":[{"count":0,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts\/983\/revisions"}],"wp:attachment":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=983"},{"taxonomy":"content_language","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcontent_language&post=983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}