SDK da Web - Guia de implementação do Gerenciador de tags do Google

Documento

Visão geral

INFORMAÇÃO: A atribuição web é uma funcionalidade empresarial. Contacte o seu Gestor de Sucesso do Cliente para ativar esta funcionalidade na sua conta.

Este guia explica como implementar o SDK da Singular Web usando o Google Tag Manager (GTM). Esse método é ideal para equipes sem acesso direto ao código do site ou que desejam gerenciar o rastreamento por meio do GTM.

IMPORTANTE! Não use implementações GTM e JavaScript nativo no mesmo site. Escolha apenas um método para evitar rastreamento duplicado e contagens de eventos inflacionadas. O Singular não desduplica eventos automaticamente.

  • Não implemente os métodos JavaScript nativo e Google Tag Manager. Escolha apenas um para evitar o rastreamento duplicado.
  • O Singular Web SDK foi projetado para ser executado no lado do cliente, no navegador do usuário. Ele requer acesso a recursos do navegador, como localStorage e Document Object Model (DOM), para funcionar corretamente. Não tente executar o SDK no lado do servidor (por exemplo, via Next.js SSR ou node.js) — isso causará falhas no rastreamento, pois os ambientes de servidor não fornecem acesso às APIs do navegador.

Pré-requisitos

Antes de começar, certifique-se de ter:

Etapas de implementação


Etapa 1: adicione os modelos de rastreamento da web Singular ao seu contêiner GTM

  1. Faça login na sua conta do Google Tag Manager e selecione o contêiner do seu site.
  2. Vá para Tags > Novo.
  3. Nomeie a tag: "Singular Init Tag"
  4. Clique na caixa Configuração da tag para iniciar a configuração da tag.
  5. Escolha o tipo de tag: e selecione "Descubra mais tipos de tags na Galeria de modelos da comunidade".
  6. Pesquise por "Singular" e selecione "Rastreamento da Web Singular". Clique no botão "Adicionar ao espaço de trabalho".

Etapa 2: Inicializar o SDK

  1. Preencha os campos do formulário com o seguinte:
    • Defina o Tipo de rastreamento como Inicialização
    • Insira sua chave SDK real no campo Chave API
    • Insira seu segredo SDK real no campo Segredo .
    • Insira seu ID do produto real. Ele deve parecer com: com.website-name e deve corresponder ao valor BundleID na página Apps na plataforma Singular.

      DICA! Use um ID do produto específico para testes com.website-name.dev e atualize-o antes de enviar para produção. Isso mantém todos os seus dados de teste separados do aplicativo de produção nos relatórios do Singular.

    • Opcional:
  2. Selecione Triggering para configurar um gatilho para fazer esta tag funcionar.
  3. Selecione Novo e nomeie o acionador: "Singular Init Trigger".
  4. Clique em Trigger Configuration (Configuração do gatilho) e escolha "Page View - Window Loaded" (Visualização da página - Janela carregada) e clique em "Save" (Salvar).
  5. Clique em "Salvar" novamente para salvar a tag.
  6. Clique em "Visualizar" na página Tag e teste se a Singular Initialization Tag é acionada.

    singular_init_tag_fired.png

SUCESSO! Se você vir a "Singular Init Tag" na seção Tags disparadas do console de visualização, você configurou com sucesso a tag de inicialização.

IMPORTANTE! Para SPAs (aplicativos de página única), você deve acionar o trackType Visita à página sempre que redirecionar para uma página diferente. Não chame Visita à página na primeira página carregada, pois a Inicialização já relata uma visita à página .

Visão geral da solução

  • Use uma variável JavaScript personalizada para detectar se é o primeiro carregamento da página .
  • Configure 2 tags:
    • "Singular Init Tag" (Tipo de rastreamento = Inicialização) para disparar apenas no carregamento inicial da página.
    • "Singular Page Visit Tag" (Tipo de rastreamento = Page Visit) para disparar em cada mudança de rota (excluindo o carregamento inicial ) usando o gatilho History Change.
  • Certifique-se de que seu SPA envie eventos de histórico para a camada de dados para alterações de rota .

image5.png


Etapa 3: Rastreamento de eventos

Após inicializar o SDK, você pode rastrear eventos personalizados quando os usuários realizam ações importantes em seu site.

IMPORTANTE! O Singular não bloqueia eventos duplicados! É responsabilidade dos desenvolvedores adicionar proteções contra atualizações de página ou duplicação. Recomenda-se incorporar algum método de deduplicação especificamente para eventos de receita, a fim de evitar dados de receita errôneos. Veja "Etapa 5: Prevenção de eventos duplicados" abaixo para um exemplo.

Basic EventConversion EventRevenue Event

Rastreamento básico de eventos

Rastreie um evento simples ou adicione atributos personalizados usando JSON válido para fornecer mais contexto sobre o evento:

  1. Crie uma nova tag para seu evento personalizado usando o modelo de rastreamento da web da Singular . Dê um nome à tag do evento.

  2. Nomeie a tag do evento.

  3. Escolha Tipo de rastreamento = Evento personalizado

  4. Ajuste o campo "Nome do evento" ou defina a variável apropriada.

  5. Ajuste o campo "ID do usuário personalizado" ou defina a variável apropriada .

  6. Ajuste os "Atributos" se desejar passar pares Chave/Valor no evento.

  7. Configure um gatilho adequado para disparar a tag apenas quando esperado.

  8. Salve o Gatilho e a Tag e teste na Visualização.

custom_event.png

Padrões comuns de implementação de eventos

Page Load EventsButton Click EventsForm Submission Events

Criando gatilhos GTM para eventos de carregamento de página

Para implementar o SDK Singular Web com o Google Tag Manager, você precisará criar um gatilho de carregamento de página que seja acionado quando suas páginas forem carregadas.

Configuração rápida: no GTM, navegue até Gatilhos Novo Configuração do gatilho e selecione "Visualização da página" como seu tipo de gatilho. Para a maioria das implementações, escolha "Todas as visualizações de página" para acionar o gatilho em cada carregamento de página.

Para obter instruções completas de configuração: consulte a documentação oficial do Tag Manager do Google:


Etapa 4: Definir o ID do usuário do cliente

Você pode enviar sua ID de usuário interna para a Singular usando um método SDK da Singular.

NOTA: Se você usar a solução Cross-Device da Singular, deverá coletar a ID do usuário em todas as plataformas.

NOTA: Se vários usuários usarem um único dispositivo, recomendamos implementar um fluxo de logout para definir e desativar a ID do usuário para cada login e logout.

DICA! Use a mesma ID de usuário do cliente que você usa em seus SDKs móveis. Isso permite a atribuição entre dispositivos e fornece uma visão completa do comportamento do usuário em todas as plataformas.

Enquanto o usuário realizar ações em seu site sem estar conectado , os eventos serão enviados para a Singular com um ID de usuário gerado pela Singular. Mas depois que o usuário se registrar ou fizer login, você poderá enviar eventos para a Singular junto com o ID de usuário usado em seu site, por exemplo, um endereço de e-mail com hash.

O Singular usa o ID do usuário em exportações de dados no nível do usuário (consulte Exportando logs de atribuição) , bem como em postbacks internos de BI, se você os tiver configurados (consulte Configurando postbacks internos de BI).

Existem duas maneiras de enviar o ID do usuário para o Singular:

  • Recomendado: se você souber a ID do usuário quando o site abrir, defina a ID do usuário no tipo de rastreamento Inicialização ao inicializar o SDK. Isso torna a ID do usuário disponível para o Singular desde a primeira visita à página.
  • Como alternativa, você pode acionar uma tag com o tipo de rastreamento = Login a qualquer momento, geralmente após a autenticação ocorrer. Recomendamos chamá-la assim que a ID do usuário estiver disponível. Observação: chamar essa tag não aciona um evento. Ela apenas define a ID do usuário a ser adicionada a quaisquer acionadores de evento daqui em diante!

Para definir o ID do usuário com o Singular, adicione uma tag Singular com o tipo de rastreamento "Login":

  1. Na sua conta do Google Tag Manager, clique em Tags > Novo.
  2. Na janela Configuração da tag, clique em Configuração da tag e, no menu Tipo de tag , selecione "Rastreamento da Web Singular".
  3. Em Tipo de rastreamento, selecione "Login".
  4. Em ID de usuário personalizada, insira a variável do Gerenciador de tags do Google que contém a ID do usuário.
  5. Clique em Acionamento e adicione o evento de acionamento: login ou registro do usuário .
  6. Clique em Salvar.

image4.png

Para desativar a ID do usuário, adicione uma tag com o tipo de rastreamento "Logout":

  1. Na sua conta do Google Tag Manager, clique em Tags > Novo.
  2. Na janela Tag Configuration (Configuração da tag ), clique em Tag Configuration(Configuração da tag) e, no menu Tag Type(Tipo de tag) , selecione "Singular Web Tracking" (Rastreamento único da Web).
  3. Em Tipo de rastreamento, selecione "Logout".
  4. Clique em Acionamento e adicione o evento de acionamento: logout do usuário.
  5. Clique em Salvar.

image1.png

Observações: 

  • A ID do usuário permanece até que você a desative usando o tipo de rastreamento de logout ou até que o usuário exclua seu armazenamento local.
  • Fechar/atualizar o site não desativa a ID do usuário.
  • Navegar no modo privado, como o modo de navegação anônima, impedirá que o Singular persista a ID do usuário, pois o armazenamento local é excluído automaticamente ao fechar o navegador.

Etapa 5: Desduplicação de eventos (opcional)

Deduplicação de eventos no Google Tag Manager

IMPORTANTE! Se os seus gatilhos GTM podem disparar o mesmo evento Singular várias vezes em um curto intervalo (por exemplo, cliques rápidos e repetidos ou vários gatilhos para a mesma ação), habilite a deduplicação opcional de eventos do Singular para suprimir automaticamente as exportações duplicadas.

Por que ocorrem duplicatas no GTM

O GTM pode avaliar e disparar tags várias vezes para a mesma ação do usuário (por exemplo, condições de disparo repetidas ou vários ouvintes de eventos), o que pode levar à duplicação das exportações de eventos do Singular.


Método de deduplicação do GTM (recomendado)

Desduplicação de eventos do SDK do Singular: habilite a desduplicação no modelo GTM do SDK da Web do Singular para descartar eventos duplicados que correspondam aos mesmos parâmetros de desduplicação dentro de uma janela de tempo configurável.


Etapas de implementação

Habilite a deduplicação de eventos: Na sua tag/modelo de inicialização do SDK da Web Singular , habilite a opção Deduplicação de eventos.

eventDeduplication.png

Definir a janela de tempo (opcional): Configure a janela de tempo máxima (em milissegundos) usada para considerar dois eventos duplicados (padrão: 1000 ms / 1 segundo).


Como funciona a deduplicação

Quando ativado, o SDK suprime eventos (excluindo visitas à página) quando o mesmo evento ocorre novamente dentro da janela de tempo usando um hash desses parâmetros: EventName , EventProductName, IsRevenueEvent , CustomUserId, GlobalProperties , MatchId e WebUrl (além da carga útil "extra" do evento, como receita e argumentos personalizados).


Etapa 6: Testando sua implementação do GTM

  1. Abra o modo de visualização do GTM e carregue seu site.
  2. Verifique se:
  • O SDK carregue (solicitação de rede para singular-sdk.js)
  • Os eventos são acionados conforme o esperado e apenas uma vez por ação
  • Não há erros no console do navegador relacionados a singular
  • As solicitações de rede são enviadas para sdk-api-v1.singular.net
  1. Use a guia Rede nas ferramentas de desenvolvedor do navegador para verificar se a carga útil correta é enviada

SUCESSO! Se você vir eventos Singular corretos nas solicitações de rede e nenhuma duplicata, você está pronto para entrar em operação!


Etapa 7: Implemente o encaminhamento da Web para o aplicativo

Encaminhamento de atribuição Web-to-App

Use o Singular Web SDK para rastrear as jornadas dos usuários do seu site para o seu aplicativo móvel , permitindo a atribuição precisa da campanha da web às instalações e reengajamentos do aplicativo móvel. Siga estas etapas para configurar o encaminhamento da web para o aplicativo, incluindo suporte a código QR para usuários de desktop.

  1. Siga nosso Guia de encaminhamento de atribuição do site para o aplicativo móvel para configurar o SDK da Singular Web para atribuição da web móvel.
  2. Para rastreamento de Web para aplicativo móvel:
    • Adicione a tag Abrir aplicativo e defina o gatilho de disparo no clique do botão para abrir ou instalar seu aplicativo.
      1. Ao configurar a tag Abrir aplicativo, especifique seu link base da Web móvel para aplicativo na página Gerenciar links do Singular.

        openApp.png

  3. Para rastreamento de Web para aplicativo em desktop:
    • Crie uma tag de limpeza do gerador de código QR
      1. Navegue até Tags > Novo no GTM e selecione HTML personalizado.
      2. Adicione o código a:
        • Injetar a biblioteca QRCode que você escolher
        • Recupere o link Web-to-App de window.singularSdk.buildWebToAppLink(baselink);
        • Gere o QRCode a partir do link retornado.
        • Atualize a imagem do QRCode na página.
      3. Nomeie a tag: "Singular - Gerador de QR Code (Limpeza)"
      4. Não é necessário nenhum gatilho: as tags de limpeza herdam os gatilhos da tag principal
      5. Configure sua tag Singular Init:
        • Clique em Configuração da tag
        • Vá para Configurações avançadas > Sequência de tags
        • Marque "Disparar uma tag de limpeza após o disparo da [Tag Singular Init]"
        • Selecione sua tag QR Code Generator no menu suspenso
        • Salve a tag e teste no modo Visualizar.

DICA! As visualizações da web no navegador móvel do aplicativo (como as usadas pelo Facebook, Instagram e TikTok) podem fazer com que o ID do dispositivo Singular mude se o usuário mudar para o navegador nativo do dispositivo, interrompendo a atribuição.

Para evitar isso, use sempre o formato de link de rastreamento Singular adequado para cada rede de anúncios:


Tópicos avançados

Banners Singular

Ativar banners singulares
#

INFORMAÇÃO: Os banners singulares são um recurso empresarial. Para saber mais sobre esse recurso, entre em contato com seu gerente de sucesso do cliente.

Os banners singulares podem ser exibidos no seu site móvel para direcionar os usuários da web de forma integrada ao seu aplicativo e exibir o conteúdo mais relevante do aplicativo. Depois de ativar os banners singulares no seu site, sua organização poderá facilmente criar, implantar e manter banners por meio da interface do usuário dos banners singulares.

Artigos relacionados

Guia de implementação passo a passo

  1. Adicione a tag de inicialização do Singular WebSDK GTM ao seu site.

    Siga o guia de integração acima para adicionar o Singular GTM WebSDK ao seu site antes de prosseguir com a implementação dos banners.

  2. Na configuração da tag de inicialização, habilite os banners inteligentes e o suporte Web-to-App. É recomendável definir a prioridade de disparo da tag de configurações avançadas para 99. Isso priorizará a inicialização antes de outras tags com o mesmo gatilho de disparo.

    gtm-banners.png

  3. Adicione a tag Mostrar banner

    Para mostrar o Smart Banner após o carregamento da página, adicione uma tag Mostrar Banner acionada em Todas as visualizações de página. É recomendável definir a prioridade de acionamento da tag Configurações avançadas como 1, o que atrasa o acionamento desta tag para o final.

    showBanner.png

    Para ocultar um banner de uma página, adicione a tag Ocultar Banner e defina um gatilho com base nas suas necessidades.

  4. [Opção avançada] Personalizar configurações de link

    O Singular oferece uma maneira de personalizar os links no banner por meio de código.

    Para personalizar links:

    • Na configuração da tag Mostrar banner, expanda a seção "Parâmetros do link (opcional)". Você pode adicionar valores de substituição específicos para a lógica de redirecionamento da ação de clique no banner.

      bannerRedirects.png

    Lista de opções:

    Método Descrição
    Android Redirect URL Passe um link de redirecionamento para a página de download do seu aplicativo Android , geralmente uma página da Play Store.
    Android Deep Link Passe um link direto para uma página dentro do seu aplicativo Android.
    Android Deferred Deep Link Passe um link direto diferido, ou seja, um link para uma página no seu aplicativo Android que o usuário ainda não instalou .
    iOS Redirect URL Passe um link de redirecionamento para a página de download do seu aplicativo iOS , geralmente uma página da App Store.
    iOS Deep Link Passe um link direto para uma página dentro do seu aplicativo iOS.
    iOS Deferred Deep Link Passe um link direto diferido, ou seja, um link para uma página no seu aplicativo iOS que o usuário ainda não instalou .

Adicionando propriedades globais

Propriedades globais
#

O SDK Singular permite definir propriedades personalizadas a serem enviadas aos servidores Singular junto com cada sessão e evento. Essas propriedades podem representar informações sobre o usuário, modo/status do aplicativo ou qualquer outra coisa que você escolher.

  • Você pode definir até 5 propriedades globais como um objeto JSON válido. As propriedades globais são mantidas no localStorage do navegador até que sejam apagadas.

  • Cada nome e valor de propriedade pode ter até 200 caracteres. Se você passar um nome ou valor de propriedade mais longo, ele será truncado para 200 caracteres.

  • As propriedades globais são refletidas nos registros de eventos no nível do usuário do Singular e nos postbacks.

As propriedades globais agora são suportadas no modelo de rastreamento do Google Tag Manager durante a inicialização. No tipo de tag de inicialização do Singular GTM , defina um objeto JSON de propriedades e escolha se deseja substituir as propriedades existentes.

Tipos de tag de propriedades globais no GTM

Use o tipo de tag Inicialização para definir Propriedades Globais na inicialização. Para atualizações em tempo de execução após a inicialização, use os tipos de tag Propriedades Globais dedicados (Definir, Obter, Desmarcar, Limpar).

Set on InitializationSet Global PropertiesGet Global PropertiesUnset Global PropertyClear Global Properties

Configuração da tag Inicialização

No tipo de tag Singular GTM Initialization , defina o objeto Global Properties atribuindo variáveis, valores de camada de dados ou texto nos campos Key e Value. Ajuste o campo Override (true/false) com base nas suas necessidades. Quando Override é false , a propriedade existente não é alterada; quando true, a propriedade existente é substituída.

gpgtm.png


Rastreamento de pesquisa orgânica

Exemplo de rastreamento de pesquisa orgânica
#

Criando a tag de configuração de rastreamento de pesquisa orgânica

CRÍTICO! - Esta tag deve ser acionada antes da inicialização do Singular SDK!

Esta tag HTML personalizada modifica a URL do documento para adicionar parâmetros de rastreamento de pesquisa orgânica (wpsrc e wpcn) que o Singular Web SDK precisa ler durante a inicialização. A sequência da tag é essencial para garantir a ordem de execução correta.

Este exemplo é fornecido como uma solução alternativa para habilitar o rastreamento de pesquisa orgânica. O código deve ser usado apenas como exemplo e atualizado e mantido pelo desenvolvedor web com base nas necessidades do seu departamento de marketing. O rastreamento de pesquisa orgânica pode ter significados diferentes para cada anunciante. Por favor, revisar a amostra e ajustar de acordo com suas necessidades.

Por que usar isso?

  • Garante que as visitas de pesquisa orgânica sejam rastreadas corretamente, mesmo que não haja parâmetros de campanha.

  • Anexa o parâmetro singular "Fonte" wpsrc com o valor do (referenciador) e o parâmetro "Nome da campanha" wpcn como "OrganicSearch" à URL para uma atribuição clara .

  • Armazena a URL atual e o referenciador em localStorage para uso posterior.

  • JavaScript puro, sem dependências e fácil de integrar.

Como funciona

  1. Verifica a URL da página em busca de parâmetros de campanha conhecidos do (Google, Facebook, TikTok, UTMs, etc.).

  2. Se não houver parâmetros de campanha e o referenciador for um mecanismo de pesquisa, acrescenta:

    • wpsrc (com o referenciador como seu valor)
    • wpcn (com OrganicSearch como seu valor)
  3. Atualiza o URL no navegador sem recarregar a página.

  4. Armazena o URL atual e o referenciador em localStorage como sng_url e sng_ref.

Uso

  1. Navegue até Tags > Novo no GTM e clique em Configuração da tag, depois selecione HTML personalizado.
  2. Cole o código JavaScript completo, conforme mostrado abaixo.
  3. Ignore a criação do acionador para esta tag. Como esta tag deve ser executada antes da tag Singular Init, vamos configurá-la para ser acionada antes da Init usando o Tag Sequencing.

    1. Use um nome descritivo como "Singular - Configuração de pesquisa orgânica ".
    2. Abra sua Tag Init do Singular Web SDK.
    3. Clique em Configuração da tag
    4. Vá para Configurações avançadas > Tag Sequencing.
    5. Marque "Disparar uma tag de configuração antes que a [Singular Init Tag] seja disparada".
    6. Selecione sua tag "Singular - Configuração de pesquisa orgânica" no menu suspenso.
    7. Recomendado: marque "Não acionar [Singular Init Tag] se [setup tag] falhar" para evitar a inicialização com modificação incompleta da URL.
    8. organic_search.png
    9. Salve a tag.
  4. Use o modo de visualização do GTM para verificar:

    • A tag de configuração é disparada primeiro e modifica a URL.
    • A tag Singular Init é acionada em segundo lugar e lê os parâmetros URL modificados.
    • Não ocorrem conflitos de tempo entre as tags.

Para sequenciamento avançado de tags: Consulte a documentação oficial do Google:


Organic Search Tracking Code
<script>
(function() {
    // singular-web-organic-search-tracking: setupOrganicSearchTracking.js
    // Tracks organic search referrals by appending wpsrc and wpcn to the URL if no campaign parameters exist and the referrer is a search engine.

    // Configuration for debugging (set to true to enable logs)
    var debug = true;

    // List of campaign parameters to check for exclusion
    var campaignParams = [
        'gclid', 'fbclid', 'ttclid', 'msclkid', 'twclid', 'li_fat_id',
        'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'wpsrc'
    ];

    // Whitelist of legitimate search engine domains (prevents false positives)
    var legitimateSearchEngines = new Set([
        // Google domains
        'google.com', 'google.co.uk', 'google.ca', 'google.com.au', 'google.de', 
        'google.fr', 'google.it', 'google.es', 'google.co.jp', 'google.co.kr',
        'google.com.br', 'google.com.mx', 'google.co.in', 'google.ru', 'google.com.sg',
        
        // Bing domains  
        'bing.com', 'bing.co.uk', 'bing.ca', 'bing.com.au', 'bing.de',
        
        // Yahoo domains
        'yahoo.com', 'yahoo.co.uk', 'yahoo.ca', 'yahoo.com.au', 'yahoo.de',
        'yahoo.fr', 'yahoo.it', 'yahoo.es', 'yahoo.co.jp',
        
        // Other search engines
        'baidu.com', 'duckduckgo.com', 'yandex.com', 'yandex.ru',
        'ask.com', 'aol.com', 'ecosia.org', 'startpage.com', 
        'qwant.com', 'seznam.cz', 'naver.com', 'daum.net'
    ]);

    // Extract main domain from hostname (removes subdomains)
    function getMainDomain(hostname) {
        if (!hostname) return '';
        
        var lowerHost = hostname.toLowerCase();
        
        // Handle special cases for known search engines with country codes
        var searchEnginePatterns = {
            'google': function(host) {
                // Match google.TLD patterns more precisely
                if (host.indexOf('google.co.') !== -1 || host.indexOf('google.com') !== -1) {
                    var parts = host.split('.');
                    for (var i = 0; i < parts.length - 1; i++) {
                        if (parts[i] === 'google') {
                            return parts.slice(i).join('.');
                        }
                    }
                }
                return null;
            },
            'bing': function(host) {
                if (host.indexOf('bing.co') !== -1 || host.indexOf('bing.com') !== -1) {
                    var parts = host.split('.');
                    for (var i = 0; i < parts.length - 1; i++) {
                        if (parts[i] === 'bing') {
                            return parts.slice(i).join('.');
                        }
                    }
                }
                return null;
            },
            'yahoo': function(host) {
                if (host.indexOf('yahoo.co') !== -1 || host.indexOf('yahoo.com') !== -1) {
                    var parts = host.split('.');
                    for (var i = 0; i < parts.length - 1; i++) {
                        if (parts[i] === 'yahoo') {
                            return parts.slice(i).join('.');
                        }
                    }
                }
                return null;
            }
        };
        
        // Try specific patterns for major search engines
        for (var engine in searchEnginePatterns) {
            if (lowerHost.indexOf(engine) !== -1) {
                var result = searchEnginePatterns[engine](lowerHost);
                if (result) return result;
            }
        }
        
        // Handle other known engines with simple mapping
        var otherEngines = {
            'baidu.com': 'baidu.com',
            'duckduckgo.com': 'duckduckgo.com', 
            'yandex.ru': 'yandex.ru',
            'yandex.com': 'yandex.com',
            'ask.com': 'ask.com',
            'aol.com': 'aol.com',
            'ecosia.org': 'ecosia.org',
            'startpage.com': 'startpage.com',
            'qwant.com': 'qwant.com',
            'seznam.cz': 'seznam.cz',
            'naver.com': 'naver.com',
            'daum.net': 'daum.net'
        };
        
        for (var domain in otherEngines) {
            if (lowerHost.indexOf(domain) !== -1) {
                return otherEngines[domain];
            }
        }
        
        // Fallback: Extract main domain by taking last 2 parts (for unknown domains)
        var parts = hostname.split('.');
        if (parts.length >= 2) {
            return parts[parts.length - 2] + '.' + parts[parts.length - 1];
        }
        
        return hostname;
    }

    // Get query parameter by name, using URL.searchParams with regex fallback for IE11
    function getParameterByName(name, url) {
        if (!url) url = window.location.href;
        try {
            return new URL(url).searchParams.get(name) || null;
        } catch (e) {
            if (debug) console.warn('URL API not supported, falling back to regex:', e);
            name = name.replace(/[\[\]]/g, '\\$&');
            var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');
            var results = regex.exec(url);
            if (!results) return null;
            if (!results[2]) return '';
            return decodeURIComponent(results[2].replace(/\+/g, ' '));
        }
    }

    // Check if any campaign parameters exist in the URL
    function hasAnyParameter(url, params) {
        for (var i = 0; i < params.length; i++) {
            if (getParameterByName(params[i], url) !== null) {
                return true;
            }
        }
        return false;
    }

    // Improved search engine detection - only checks hostname, uses whitelist
    function isSearchEngineReferrer(referrer) {
        if (!referrer) return false;
        
        var hostname = '';
        try {
            hostname = new URL(referrer).hostname.toLowerCase();
        } catch (e) {
            // Fallback regex for hostname extraction (IE11 compatibility)
            var match = referrer.match(/^(?:https?:\/\/)?([^\/\?#]+)/i);
            hostname = match ? match[1].toLowerCase() : '';
        }
        
        if (!hostname) return false;
        
        // First check: exact match against whitelist
        if (legitimateSearchEngines.has(hostname)) {
            if (debug) console.log('Exact match found for:', hostname);
            return true;
        }
        
        // Second check: subdomain of legitimate search engine
        var hostParts = hostname.split('.');
        if (hostParts.length >= 3) {
            // Try domain.tld combination (e.g., google.com from www.google.com)
            var mainDomain = hostParts[hostParts.length - 2] + '.' + hostParts[hostParts.length - 1];
            if (legitimateSearchEngines.has(mainDomain)) {
                if (debug) console.log('Subdomain match found for:', hostname, '-> main domain:', mainDomain);
                return true;
            }
            
            // Try last 3 parts for country codes (e.g., google.co.uk from www.google.co.uk)
            if (hostParts.length >= 3) {
                var ccDomain = hostParts[hostParts.length - 3] + '.' + hostParts[hostParts.length - 2] + '.' + hostParts[hostParts.length - 1];
                if (legitimateSearchEngines.has(ccDomain)) {
                    if (debug) console.log('Country code domain match found for:', hostname, '-> cc domain:', ccDomain);
                    return true;
                }
            }
        }
        
        if (debug) {
            console.log('Hostname not recognized as legitimate search engine:', hostname);
        }
        
        return false;
    }

    // Main function to update URL with organic search tracking parameters
    function setupOrganicSearchTracking() {
        var url = window.location.href;
        var referrer = document.referrer || '';

        // Store URL and referrer in localStorage
        try {
            localStorage.setItem('sng_url', url);
            localStorage.setItem('sng_ref', referrer);
        } catch (e) {
            if (debug) console.warn('localStorage not available:', e);
        }

        if (debug) {
            console.log('Current URL:', url);
            console.log('Referrer:', referrer);
        }

        // Skip if campaign parameters exist or referrer is not a search engine
        var hasCampaignParams = hasAnyParameter(url, campaignParams);
        if (hasCampaignParams || !isSearchEngineReferrer(referrer)) {
            if (debug) console.log('Skipping URL update: Campaign params exist or referrer is not a legitimate search engine');
            return;
        }

        // Extract and validate referrer hostname
        var referrerHostname = '';
        try {
            referrerHostname = new URL(referrer).hostname;
        } catch (e) {
            if (debug) console.warn('Invalid referrer URL, falling back to regex:', e);
            var match = referrer.match(/^(?:https?:\/\/)?([^\/]+)/i);
            referrerHostname = match ? match[1] : '';
        }

        // Extract main domain from hostname
        var mainDomain = getMainDomain(referrerHostname);
        
        if (debug) {
            console.log('Full hostname:', referrerHostname);
            console.log('Main domain:', mainDomain);
        }

        // Only proceed if main domain is valid and contains safe characters
        if (!mainDomain || !/^[a-zA-Z0-9.-]+$/.test(mainDomain)) {
            if (debug) console.log('Skipping URL update: Invalid or unsafe main domain');
            return;
        }

        // Update URL with wpsrc and wpcn parameters
        var urlObj;
        try {
            urlObj = new URL(url);
        } catch (e) {
            if (debug) console.warn('URL API not supported, cannot modify URL:', e);
            return;
        }
        
        // Set wpsrc to the main domain (e.g., google.com instead of tagassistant.google.com)
        urlObj.searchParams.set('wpsrc', mainDomain);
        
        // Set wpcn to 'Organic Search' to identify the campaign type
        urlObj.searchParams.set('wpcn', 'Organic Search');

        // Update the URL without reloading (check if history API is available)
        if (window.history && window.history.replaceState) {
            try {
                window.history.replaceState({}, '', urlObj.toString());
                if (debug) console.log('Updated URL with organic search tracking:', urlObj.toString());
            } catch (e) {
                if (debug) console.warn('Failed to update URL:', e);
            }
        } else {
            if (debug) console.warn('History API not supported, cannot update URL');
        }
    }

    // Execute the function
    setupOrganicSearchTracking();
})();
</script>

Rastreamento entre subdomínios

Por padrão, o SDK do site Singular gera um ID de dispositivo Singular e o mantém usando o armazenamento do navegador. Como esse armazenamento não pode ser compartilhado entre subdomínios, o SDK acaba gerando um novo ID para cada subdomínio.

Se você deseja manter o ID de dispositivo Singular entre subdomínios, pode usar uma das seguintes opções:

Método B (avançado): definir o ID do dispositivo Singular manualmente
#

Método B (avançado): definir o ID do dispositivo Singular manualmente

Se você não quiser que o SDK Singular persista o ID do dispositivo automaticamente, você pode persistir o ID manualmente entre domínios - por exemplo, usando um cookie de domínio de nível superior ou um cookie do lado do servidor. O valor deve ser um ID previamente gerado pelo Singular no formato uuid4 válido.

Observação: você pode ler o ID do dispositivo Singular definindo uma variável JavaScript personalizada e chamando singularSdk.getSingularDeviceId() após chamar a tag do tipo de rastreamento Init.

mceclip2.png


Problemas comuns de implementação do GTM

Identificadores de dispositivo necessários
O evento é disparado várias vezes Refine ou limite seus gatilhos, use "Uma vez por página" ou adicione condições
Formato incorreto do ID do produto O ID do produto deve usar notação DNS reversa (com.company.site)
Eventos não rastreados Verifique a ortografia e as maiúsculas e minúsculas dos nomes dos eventos; certifique-se de que singular O SDK está carregado antes do disparo da tag do evento
Script SDK bloqueado Bloqueadores de anúncios ou Política de Segurança de Conteúdo restritiva; considere mudar para a implementação JS nativa se os problemas persistirem

Melhores práticas

  • Mantenha o GTM organizado: nomeie as tags e os gatilhos de forma clara e documente sua finalidade.
  • Audite regularmente as tags não utilizadas ou legadas.
  • Minimize o número de gatilhos para reduzir o risco de eventos duplicados.
  • Após as alterações, sempre teste exaustivamente no Modo de Visualização do GTM antes de publicar ao vivo.
  • Se você usar rastreamento baseado em cookies (Rastreamento entre subdomínios), atualize sua política de privacidade de acordo.

Artigos relacionados