{"id":1571,"date":"2026-04-23T18:11:57","date_gmt":"2026-04-23T18:11:57","guid":{"rendered":"https:\/\/cms.funnelsheet.com\/?p=1571"},"modified":"2026-04-23T18:11:57","modified_gmt":"2026-04-23T18:11:57","slug":"por-que-seus-eventos-de-pageview-estao-disparando-duas-vezes-em-spa","status":"publish","type":"post","link":"https:\/\/cms.funnelsheet.com\/?p=1571","title":{"rendered":"Por que seus eventos de pageview est\u00e3o disparando duas vezes em SPA"},"content":{"rendered":"<p>Se seus eventos de pageview aparecem duas vezes em uma SPA (aplica\u00e7\u00e3o de p\u00e1gina \u00fanica), voc\u00ea n\u00e3o est\u00e1 vendo apenas ru\u00eddo: est\u00e1 diante de um problema estrutural de mensura\u00e7\u00e3o. Em ambientes que utilizam GA4, GTM Web e integra\u00e7\u00f5es com server-side, o page_view pode ser enviado tanto na carga inicial da p\u00e1gina quanto a cada transi\u00e7\u00e3o de rota, mesmo que a tela tenha apenas trocas de conte\u00fado. O resultado \u00e9 duplica\u00e7\u00e3o de dados, distor\u00e7\u00e3o de atribui\u00e7\u00e3o entre campanhas, e uma leitura inconsistente de qual canal realmente gerou a convers\u00e3o. Em SPAs, o desafio n\u00e3o \u00e9 apenas \u201ccoletar mais dados\u201d \u2014 \u00e9 assegurar que cada epis\u00f3dio de pageview seja contado uma \u00fanica vez, com o contexto correto de rota, tela e fonte.<\/p>\n<p>Este artigo nomeia o problema com precis\u00e3o, oferece diagn\u00f3stico direto ao ponto e apresenta um caminho operacional para diagnosticar, corrigir e ajustar a emiss\u00e3o de pageview sem perder visibilidade de dados importantes. Ao t\u00e9rmino, voc\u00ea dever\u00e1 entender como estruturar a emiss\u00e3o de eventos para evitar duplicidade, quando manter envio autom\u00e1tico e quando migrar para um \u00fanico disparo por navega\u00e7\u00e3o, al\u00e9m de um roteiro pr\u00e1tico de auditoria que contempla GA4, GTM Web e, se couber, server-side. O objetivo \u00e9 voc\u00ea sair com decis\u00f5es t\u00e9cnicas claras, um plano de a\u00e7\u00e3o e um modelo de valida\u00e7\u00e3o que funciona no mundo real, n\u00e3o num slide bonito.<\/p>\n<h2>Por que o pageview duplicado acontece em SPAs<\/h2>\n<blockquote>\n<p>Duplica\u00e7\u00e3o de pageview em SPA costuma ser sintoma de duas fontes distintas de emiss\u00e3o: a p\u00e1gina \u00e9 \u201ccarregada\u201d pelo GA4 automaticamente e, ao navegar, voc\u00ea dispara outro page_view sem consolidar com o anterior.<\/p>\n<\/blockquote>\n<h3>Carga inicial da p\u00e1gina vs mudan\u00e7a de rota<\/h3>\n<p>Em SPAs, a primeira carga da p\u00e1gina dispara um page_view porque o GA4 (ou o GTM) interpreta o carregamento como uma visita completa. Quando o usu\u00e1rio navega para outra tela sem recarregar a p\u00e1gina, muitos setups emitem um segundo page_view para atualizar o estado da tela. Se o mesmo fluxo tamb\u00e9m est\u00e1 gerando page_view por meio de uma configura\u00e7\u00e3o de roteamento dentro da SPA (por exemplo, React Router, Next.js, Vue Router), voc\u00ea acaba dobrando o volume de page_views para o mesmo conjunto de usu\u00e1rios e sess\u00f5es. A consequ\u00eancia \u00e9 uma contagem inflada de visualiza\u00e7\u00f5es de p\u00e1gina, que contamina m\u00e9tricas de fluxo, funis de convers\u00e3o e a valida\u00e7\u00e3o de m\u00eddia paga com o CRM ou o BI. Em termos pr\u00e1ticos, voc\u00ea pode perceber discrep\u00e2ncias entre GA4 e plataformas de atribui\u00e7\u00e3o, ou entre GA4 e o servidor de dados que voc\u00ea utiliza para BigQuery ou Looker Studio.<\/p>\n<h3>Configura\u00e7\u00f5es concorrentes de GA4 no GTM Web<\/h3>\n<p>Um erro comum \u00e9 manter o envio autom\u00e1tico de page_view no GA4 Configuration tag do GTM Web, enquanto h\u00e1 um disparo separado de page_view para mudan\u00e7as de rota. Em SPA, isso resulta em dois eventos de page_view quase simult\u00e2neos para a mesma a\u00e7\u00e3o do usu\u00e1rio. A configura\u00e7\u00e3o t\u00edpica que provoca duplicidade \u00e9 \u201cSend Page View\u201d ligado no GA4 Configuration tag e tamb\u00e9m um trigger de page_view personalizado para cada altera\u00e7\u00e3o de rota. A soma da dupla emiss\u00e3o n\u00e3o apenas inflaciona n\u00fameros, como tamb\u00e9m dificulta a deduplica\u00e7\u00e3o nos dashboards e confirma\u00e7\u00f5es com ferramentas de medi\u00e7\u00e3o externas.<\/p>\n<h3>Envio duplicado entre client-side e server-side<\/h3>\n<p>Se voc\u00ea utiliza GTM Server-Side (GTM-SS) junto com o GTM Web, existe a tenta\u00e7\u00e3o de centralizar a l\u00f3gica de page_view no servidor para reduzir perdas de dados com bloqueadores, consentimento ou redirecionamentos. Por\u00e9m, sem uma deduplica\u00e7\u00e3o cuidadosa, a mesma visualiza\u00e7\u00e3o pode chegar ao GA4 duas vezes: uma pelo cliente e outra pelo servidor, ambas com o mesmo page_path e session_id. A consequ\u00eancia \u00e9 um \u201cduplo toque\u201d que n\u00e3o representa uma segunda a\u00e7\u00e3o do usu\u00e1rio, mas sim a mesma a\u00e7\u00e3o sendo reportada por dois canais de emiss\u00e3o. Nessa situa\u00e7\u00e3o, \u00e9 essencial estabelecer uma regra de disparo \u00fanico por evento de rota no conjunto de pipelines (cliente ou servidor) ou consolidar o envio em uma \u00fanica camada de medi\u00e7\u00e3o.<\/p>\n<h2>Sinais de que voc\u00ea est\u00e1 com duplica\u00e7\u00e3o<\/h2>\n<h3>Duas ocorr\u00eancias de page_view por navega\u00e7\u00e3o<\/h3>\n<p>Se voc\u00ea notar que, para a mesma navega\u00e7\u00e3o de rota, as ferramentas reportam duas ocorr\u00eancias de page_view quase no mesmo instante, \u00e9 um sinal claro de duplica\u00e7\u00e3o. Compare logs de GA4 com dados no BigQuery ou no Looker Studio para confirmar: a mesma sess\u00e3o gerando dois eventos com o mesmo page_path pode indicar que h\u00e1 dois emissores ativos para o mesmo usu\u00e1rio.<\/p>\n<h3>Desvios entre GA4 e outras fontes de verdade<\/h3>\n<p>Quando o n\u00famero de page_views ou de sess\u00f5es n\u00e3o bate com o que aparece em modelos de dados offline (CRM, planilhas de convers\u00e3o ou integra\u00e7\u00f5es com WhatsApp\/Telefone), a hip\u00f3tese de duplica\u00e7\u00e3o fica forte. Em SPAs com rastreamento h\u00edbrido (client-side e server-side), perdas de deduplica\u00e7\u00e3o aparecem como varia\u00e7\u00f5es de lookback entre fontes, dificultando a escritura\u00e7\u00e3o de qual clique de aquisi\u00e7\u00e3o realmente gerou a convers\u00e3o.<\/p>\n<h2>Arquiteturas de solu\u00e7\u00e3o: onde colocar o page_view \u00fanico<\/h2>\n<h3>Desativar page_view autom\u00e1tico no GA4 Configuration tag<\/h3>\n<p>A primeira decis\u00e3o pr\u00e1tica \u00e9 eliminar o envio duplo do page_view autom\u00e1tico. Se a sua SPA faz navega\u00e7\u00e3o via history API, atendimento prim\u00e1rio do GA4 deve ocorrer apenas por meio de um evento espec\u00edfico de rota. Em GTM Web, desative o \u201cSend Page View\u201d no GA4 Configuration tag e substitua por uma emiss\u00e3o controlada de page_view apenas quando houver mudan\u00e7a de rota relevante, com o par\u00e2metro page_path alinhado ao caminho real da tela.<\/p>\n<h3>Disparar page_view apenas em mudan\u00e7a de rota com page_path correto<\/h3>\n<p>Ao inv\u00e9s de confiar no carregamento da p\u00e1gina para disparar page_view, centralize o envio em um evento de rota (route_change) que atualiza o page_path e other par\u00e2metros relevantes. Esse approach reduz duplicatas desde que voc\u00ea padronize o valor de page_path (ex: \/produtos\/checkout) e respeite o contexto da tela. Em SPAs com v\u00e1rias rotas, a consist\u00eancia de page_path evita que o mesmo conte\u00fado seja contado duas vezes por causa de mudan\u00e7as de estado.<\/p>\n<h2>Roteiro de auditoria e configura\u00e7\u00e3o<\/h2>\n<ol>\n<li>Mapear o fluxo de navega\u00e7\u00e3o da sua SPA (framework, router, pontos de mudan\u00e7a de tela) para entender onde o page_view \u00e9 emitido hoje.<\/li>\n<li>Verificar a configura\u00e7\u00e3o do GA4 no GTM Web: confirme se \u201cSend Page View\u201d est\u00e1 ativo na GA4 Configuration tag e se h\u00e1 triggers adicionais disparando page_view em mudan\u00e7as de rota.<\/li>\n<li>Desativar o envio autom\u00e1tico de page_view na configura\u00e7\u00e3o base e padronizar a emiss\u00e3o apenas em uma camada central de SPA navigation events.<\/li>\n<li>Impor uma emiss\u00e3o de page_view \u00fanica por rota, com page_path refletindo a rota atual e, se poss\u00edvel, incluir page_location e screen_resolution para contexto adicional.<\/li>\n<li>Habilitar debug\/preview: utilize GA4 DebugView e o modo de pr\u00e9-visualiza\u00e7\u00e3o do GTM para confirmar que apenas um page_view \u00e9 emitido por mudan\u00e7a de rota.<\/li>\n<li>Verificar cen\u00e1rios de Server-Side: se estiver usando GTM Server-Side, assegure que o servidor n\u00e3o esteja duplicando eventos j\u00e1 enviados pelo cliente.<\/li>\n<li>Validar consist\u00eancia nos dados: compare os n\u00fameros de page_views com fontes internas (CRM, eventos offline, convers\u00f5es via WhatsApp) para confirmar que a deduplica\u00e7\u00e3o est\u00e1 funcionando como esperado.<\/li>\n<\/ol>\n<h2>Erros comuns e como adaptar \u00e0 realidade do projeto<\/h2>\n<h3>Esquecer de desativar o envio autom\u00e1tico de page_view<\/h3>\n<p>Manter o envio autom\u00e1tico paralelo a uma emiss\u00e3o manual para cada rota gera duplica\u00e7\u00e3o. A corre\u00e7\u00e3o pr\u00e1tica \u00e9 desabilitar o auto page_view no GA4 Configuration tag e centralizar a emiss\u00e3o apenas no fluxo de navega\u00e7\u00e3o da SPA. Al\u00e9m disso, garanta que o event_name utilizado para a rota seja padronizado entre ambientes (dev, staging, produ\u00e7\u00e3o).<\/p>\n<h3>Misturar dados de GA4 e GTM sem deduplica\u00e7\u00e3o<\/h3>\n<p>Se voc\u00ea usa GA4 direto na p\u00e1gina e, ao mesmo tempo, um GTM com eventos de page_view, h\u00e1 grande chance de duplicidade. A regra \u00e9 simples: escolha uma \u00fanica origem para o page_view de cada rota \u2014 geralmente o GTM Web \u2014 e use o GA4 apenas para receber o conjunto j\u00e1 consolidado de events, evitando triggers paralelos que reemitam o mesmo evento.<\/p>\n<h3>Configura\u00e7\u00f5es de janela de lookback inconsistentes<\/h3>\n<p>Diferentes janelas de lookback entre fontes (GA4, BigQuery, Looker Studio) podem fazer parecer que h\u00e1 duplica\u00e7\u00e3o quando, na verdade, h\u00e1 apenas varia\u00e7\u00e3o no momento de envio. Defina pol\u00edticas consistentes de lookback e de reten\u00e7\u00e3o de dados entre o pipeline de coleta e a camada de apresenta\u00e7\u00e3o (BI\/Relat\u00f3rios) para que voc\u00ea interprete corretamente os n\u00fameros.<\/p>\n<h2>Adapta\u00e7\u00e3o pr\u00e1tica ao seu projeto e governan\u00e7a de dados<\/h2>\n<blockquote>\n<p>N\u00e3o adianta apagar dados. A pr\u00e1tica correta \u00e9 alinhar o ciclo de vida da aplica\u00e7\u00e3o com o fluxo de eventos de mensura\u00e7\u00e3o, assegurando que cada a\u00e7\u00e3o do usu\u00e1rio seja refletida de forma \u00fanica, com o contexto de rota correto.<\/p>\n<\/blockquote>\n<blockquote>\n<p>Em SPAs com WhatsApp\/CRM integrados, mantenha uma trilha clara de quando o lead fecha a venda e qual clique o gerou. O objetivo \u00e9 ter dados que resistam a escrut\u00ednio, n\u00e3o apenas n\u00fameros que parecem grandes.<\/p>\n<\/blockquote>\n<p>Para empresas que operam com v\u00e1rias camadas de rastreamento, de GA4 a CAPI, a decis\u00e3o entre client-side e server-side n\u00e3o \u00e9 apenas tecnol\u00f3gica \u2014 \u00e9 sobre confiabilidade de dados, SLA de delivering e custo de manuten\u00e7\u00e3o. Se a solu\u00e7\u00e3o ideal exige estrutura de dados mais profunda, considere um modelo de auditoria de eventos que mise a valida\u00e7\u00e3o cont\u00ednua: verifique, a cada sprint, se o pipeline de page_view continua \u00fanico por rota e se o conjunto de m\u00e9tricas permanece est\u00e1vel ap\u00f3s altera\u00e7\u00f5es de rota ou de implementa\u00e7\u00e3o de consentimento.<\/p>\n<p>Se quiser avan\u00e7ar com um diagn\u00f3stico t\u00e9cnico espec\u00edfico para o seu stack (SPA em React\/Next.js, GTM Web + GTM Server-Side, integra\u00e7\u00e3o com WhatsApp Business API e BigQuery), a Funnelsheet pode revisar seu setup atual, identificar pontos de duplica\u00e7\u00e3o e entregar um plano de a\u00e7\u00e3o com altera\u00e7\u00f5es acion\u00e1veis j\u00e1 alinhadas ao seu ambiente de produ\u00e7\u00e3o.<\/p>\n<p>Para acelerar o diagn\u00f3stico, comece hoje alimentando o time com um olhar cr\u00edtico sobre sua emiss\u00e3o de page_view: verifique se h\u00e1 duplicidade na mudan\u00e7a de rota, se a configura\u00e7\u00e3o autom\u00e1tica de GA4 est\u00e1 desativada e se o pipeline est\u00e1 deduplicando efetivamente na origem. O pr\u00f3ximo passo concreto \u00e9 implementar o envio de page_view apenas na transi\u00e7\u00e3o de rota com um caminho consistente, validar com DebugView e documentar a auditoria para manter o controle em sprints futuras.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se seus eventos de pageview aparecem duas vezes em uma SPA (aplica\u00e7\u00e3o de p\u00e1gina \u00fanica), voc\u00ea n\u00e3o est\u00e1 vendo apenas ru\u00eddo: est\u00e1 diante de um problema estrutural de mensura\u00e7\u00e3o. Em ambientes que utilizam GA4, GTM Web e integra\u00e7\u00f5es com server-side, o page_view pode ser enviado tanto na carga inicial da p\u00e1gina quanto a cada transi\u00e7\u00e3o&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":[3],"tags":[805,13,17,803,804],"content_language":[6],"class_list":["post-1571","post","type-post","status-publish","format-standard","hentry","category-blogbr","tag-duplicacao-de-dados","tag-ga4","tag-gtm-web","tag-pageview","tag-spa","content_language-br"],"acf":[],"_links":{"self":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts\/1571","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=1571"}],"version-history":[{"count":0,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts\/1571\/revisions"}],"wp:attachment":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1571"},{"taxonomy":"content_language","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcontent_language&post=1571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}