SDK web: guía de implementación de Google Tag Manager

Documento

Descripción general

INFORMACIÓN: La atribución web es una función empresarial. Ponte en contacto con tu gestor de éxito del cliente para habilitar esta función en tu cuenta.

Esta guía explica cómo implementar el SDK web de Singular utilizando Google Tag Manager (GTM). Este método es ideal para equipos que no tienen acceso directo al código del sitio web o que desean gestionar el seguimiento a través de GTM.

¡IMPORTANTE! No utilice las implementaciones de GTM y JavaScript nativo en el mismo sitio. Elija solo un método para evitar el seguimiento duplicado y el recuento inflado de eventos. Singular no deduplica los eventos automáticamente.

  • No implemente los métodos JavaScript nativo y Google Tag Manager. Elija solo uno para evitar el seguimiento duplicado.
  • El SDK web de Singular está diseñado para ejecutarse en el lado del cliente, en el navegador del usuario. Requiere acceso a funciones del navegador como localStorage y el Modelo de Objetos de Documento (DOM) para funcionar correctamente. No intente ejecutar el SDK en el lado del servidor (por ejemplo, a través de Next.js SSR o node.js), ya que esto provocará errores de seguimiento, ya que los entornos de servidor no proporcionan acceso a las API del navegador.

Requisitos previos

Antes de empezar, asegúrese de que dispone de:

Pasos de implementación


Paso 1: Añada las plantillas de seguimiento web de Singular a su contenedor GTM

  1. Inicie sesión en su cuenta de Google Tag Manager y seleccione el contenedor de su sitio web.
  2. Vaya a Etiquetas > Nuevo.
  3. Asigne un nombre a la etiqueta: «Etiqueta de inicio de Singular».
  4. Haga clic en el cuadro Configuración de etiqueta para comenzar la configuración de la etiqueta.
  5. Elija Tipo de etiqueta: y seleccione «Descubra más tipos de etiquetas en la galería de plantillas de la comunidad».
  6. Busque «Singular» y seleccione «Singular Web Tracking». Haga clic en el botón «Añadir al espacio de trabajo».

Paso 2: Inicializar el SDK

  1. Rellene los campos del formulario con lo siguiente:
    • Establezca el tipo de seguimiento en Inicialización
    • Introduzca su clave SDK real en el campo «Clave API»
    • Introduce tu SDK Secret real en el campo Secret .
    • Introduzca su ID de producto real. Debe tener el siguiente aspecto : com.website-name y debe coincidir con el valor BundleID de la página Apps de la plataforma Singular.

      ¡CONSEJO! Utilice un ID de producto específico para las pruebas com.website-name.dev y actualícelo antes de enviarlo a producción. De este modo, todos sus datos de prueba se mantendrán separados de la aplicación de producción en los informes de Singular.

    • Opcional:
  2. Seleccione Activación para configurar un activador que haga que esta etiqueta funcione.
  3. Seleccione Nuevo y asigne un nombre al activador: «Singular Init Trigger».
  4. Haga clic en «Configuración del activador » y seleccione«Vista de página - Ventana cargada» y haga clic en«Guardar».
  5. Haga clic en«Guardar» de nuevo para guardar la etiqueta.
  6. Haga clic en«Vista previa» en la página Etiqueta y compruebe que la etiqueta de inicialización de Singular se activa.

    singular_init_tag_fired.png

¡ÉXITO! Si ve la«Etiqueta de inicialización de Singular» en la sección Etiquetas activadas de la consola de vista previa, ha configurado correctamente la etiqueta de inicialización.

IMPORTANTE: para las SPA (aplicaciones de página única), debe activar el trackType de visita a la página cada vez que redirija a una página diferente. No llame a la visita a la página en la primera página que se carga, ya que la inicialización ya informa de una visita a la página .

Descripción general de la solución

  • Utilice una variable JavaScript personalizada para detectar si se trata de la primera carga de la página .
  • Configure 2 etiquetas:
    • «Etiqueta de inicialización singular» (tipo de seguimiento = inicialización) para que se active solo en la carga inicial de la página.
    • «Etiqueta de visita a una página única» (tipo de seguimiento = visita a una página ) para que se active en cada cambio de ruta (excluyendo la carga inicial ) utilizando el activador de cambio de historial.
  • Asegúrate de que tu SPA envía eventos de historial a la capa de datos para los cambios de ruta .

image5.png


Paso 3: Seguimiento de eventos

Después de inicializar el SDK, puede rastrear eventos personalizados cuando los usuarios realizan acciones importantes en su sitio web.

¡IMPORTANTE! ¡Singular no bloquea los eventos duplicados! Es responsabilidad de los desarrolladores añadir protecciones contra las actualizaciones de página o la duplicación. Se recomienda incorporar algún método de deduplicación específicamente para los eventos de ingresos, a fin de evitar datos de ingresos erróneos. Consulte el «Paso 5: Prevención de eventos duplicados» a continuación para ver un ejemplo.

Basic EventConversion EventRevenue Event

Seguimiento básico de eventos

Realice un seguimiento de un evento simple o añada atributos personalizados utilizando JSON válido para proporcionar más contexto sobre el evento:

  1. Cree una nueva etiqueta para su evento personalizado utilizando la plantilla de seguimiento web de Singular. .

  2. Asigne un nombre a la etiqueta del evento.

  3. Elija Tipo de seguimiento = Evento personalizado

  4. Ajuste el campo «Nombre del evento» o establezca la variable adecuada.

  5. Ajuste el campo «ID de usuario personalizado» o establezca la variable adecuada .

  6. Ajuste los «Atributos» si lo desea para pasar pares clave/valor en el evento.

  7. Configure un activador adecuado para disparar la etiqueta solo cuando sea necesario.

  8. Guarde el activador y la etiqueta, y pruébelos en la vista previa.

custom_event.png

Patrones comunes de implementación de eventos

Page Load EventsButton Click EventsForm Submission Events

Creación de desencadenantes GTM para eventos de carga de página

Para implementar el SDK web de Singular con Google Tag Manager, deberá crear un activador de carga de página que se active cuando se carguen sus páginas.

Configuración rápida: en GTM, vaya a Desencadenantes Nuevo Configuración de desencadenante y seleccione «Vista de página» como tipo de desencadenante. Para la mayoría de las implementaciones, elija «Todas las vistas de página» para activar el desencadenante en cada carga de página.

Para obtener instrucciones completas de configuración: Consulte la documentación oficial de Google Tag Manager:


Paso 4: Configuración del ID de usuario del cliente

Puede enviar su ID de usuario interno a Singular utilizando un método SDK de Singular.

NOTA: Si utiliza la solución multidispositivo de Singular, debe recopilar el ID de usuario en todas las plataformas.

NOTA: Si varios usuarios utilizan un único dispositivo, recomendamos implementar un flujo de cierre de sesión para establecer y desactivar el ID de usuario en cada inicio y cierre de sesión.

¡CONSEJO! Utilice el mismo ID de usuario del cliente que utiliza en sus SDK móviles. Esto permite la atribución entre dispositivos y proporciona una visión completa del comportamiento de los usuarios en todas las plataformas.

Siempre que el usuario realice acciones en su sitio web sin haber iniciado sesión , los eventos se envían a Singular con un ID de usuario generado por Singular. Pero después de que el usuario se registre o inicie sesión, puede enviar eventos a Singular junto con el ID de usuario que se utiliza en su sitio web, por ejemplo, una dirección de correo electrónico con hash.

Singular utiliza el ID de usuario en las exportaciones de datos a nivel de usuario (consulte Exportación de registros de atribución) , así como en los postbacks de BI internos, si los tiene configurados (consulte Configuración de postbacks de BI internos).

Hay dos formas de enviar el ID de usuario a Singular:

  • Recomendado: si conoce el ID de usuario cuando se abre el sitio web , establezca el ID de usuario en el tipo de seguimiento Inicialización al inicializar el SDK. Esto hace que el ID de usuario esté disponible para Singular desde la primera visita a la página.
  • Alternativamente, puede activar una etiqueta con el tipo de seguimiento = Inicio de sesión en cualquier momento, normalmente después de que se produzca una autenticación . Recomendamos llamarla tan pronto como el ID de usuario esté disponible. Nota: llamar a esta etiqueta no activa un evento. ¡Solo establece el ID de usuario para que se añada a cualquier activador de eventos en el futuro!

Para establecer el ID de usuario con Singular, añada una etiqueta Singular con el tipo de seguimiento «Inicio de sesión»:

  1. En su cuenta de Google Tag Manager, haga clic en Etiquetas > Nuevo.
  2. En la ventana Configuración de etiquetas, haga clic en Configuración de etiquetas y, en el menú Tipo de etiqueta , seleccione «Seguimiento web de Singular».
  3. En Tipo de seguimiento, seleccione «Inicio de sesión».
  4. En ID de usuario personalizado, introduzca la variable de Google Tag Manager que contiene el ID de usuario.
  5. Haga clic en Activación y añada el evento de activación: inicio de sesión o registro del usuario.
  6. Haga clic en Guardar.

image4.png

Para desactivar el ID de usuario, añada una etiqueta con el tipo de seguimiento «Cierre de sesión »:

  1. En su cuenta de Google Tag Manager, haga clic en Etiquetas > Nuevo.
  2. En la ventana Configuración de etiquetas, haga clic en Configuración de etiquetas y, en el menú Tipo de etiqueta , seleccione «Seguimiento web singular».
  3. En Tipo de seguimiento, seleccione «Cierre de sesión».
  4. Haga clic en Activación y añada el evento de activación: cierre de sesión del usuario.
  5. Haga clic en Guardar.

image1.png

Notas: 

  • El ID de usuario persiste hasta que lo desactive utilizando el tipo de seguimiento de cierre de sesión o hasta que el usuario elimine su almacenamiento local.
  • Cerrar o actualizar el sitio web no desactiva el ID de usuario.
  • Navegar en modo privado, como el modo incógnito, impedirá que Singular conserve el ID de usuario, ya que el almacenamiento local se elimina automáticamente al cerrar el navegador.

Paso 5: Desduplicación de eventos (opcional)

Deduplicación de eventos en Google Tag Manager

¡IMPORTANTE! Si los activadores de GTM pueden disparar el mismo evento de Singular varias veces en un intervalo de tiempo corto (por ejemplo, clics rápidos y repetidos o múltiples activadores para la misma acción), habilite la deduplicación de eventos opcional de Singular para suprimir automáticamente las exportaciones duplicadas.

Por qué se producen duplicados en GTM

GTM puede evaluar y activar etiquetas varias veces para la misma acción del usuario (por ejemplo, condiciones de activación repetidas o múltiples detectores de eventos), lo que puede dar lugar a duplicados en las exportaciones de eventos de Singular.


Método de deduplicación de GTM (recomendado)

Deduplicación de eventos del SDK de Singular: habilite la deduplicación en la plantilla GTM del SDK web de Singular para eliminar los eventos duplicados que coincidan con los mismos parámetros de deduplicación dentro de un intervalo de tiempo configurable.


Pasos de implementación

Habilitar la deduplicación de eventos: en la etiqueta/plantilla de inicialización del SDK web de Singular , habilite la opción de deduplicación de eventos.

eventDeduplication.png

Establecer el intervalo de tiempo (opcional): Configure el intervalo de tiempo máximo (en milisegundos) que se utiliza para considerar que dos eventos son duplicados (por defecto: 1000 ms / 1 segundo).


Cómo funciona la deduplicación

Cuando está habilitada, el SDK suprime los eventos (excepto las visitas a la página) cuando el mismo evento se repite dentro del intervalo de tiempo utilizando un hash de estos parámetros: EventName , EventProductName, IsRevenueEvent , CustomUserId, GlobalProperties , MatchId y WebUrl (además de la carga útil «extra» del evento, como los ingresos y los argumentos personalizados).


Paso 6: Prueba de la implementación de GTM

  1. Abra el modo de vista previa de GTM y cargue su sitio web.
  2. Compruebe que:
  • El SDK se carga (solicitud de red a singular-sdk.js)
  • Los eventos se activan según lo esperado y solo una vez por acción
  • No hay errores en la consola del navegador relacionados con singular
  • Las solicitudes de red se envían a sdk-api-v1.singular.net
  1. Utilice la pestaña Red en las herramientas de desarrollo del navegador para verificar que se envía la carga útil correcta

¡ÉXITO! Si ve eventos Singular correctos en las solicitudes de red y no hay duplicados, ¡ya está listo para ponerse en marcha!


Paso 7: Implementar el reenvío de Web a aplicación

Reenvío de atribución de web a aplicación

Utilice el SDK web de Singular para realizar un seguimiento de los recorridos de los usuarios desde su sitio web hasta su aplicación móvil , lo que permite una atribución precisa de las campañas web a las instalaciones de aplicaciones móviles y las reactivaciones. Siga estos pasos para configurar el reenvío de web a aplicación, incluida la compatibilidad con códigos QR para usuarios de escritorio.

  1. Siga nuestra Guía de reenvío de atribución de sitio web a aplicación móvil para configurar el SDK web de Singular para la atribución web móvil.
  2. Para el seguimiento de la web móvil a la aplicación:
    • Añada la etiqueta «Abrir aplicación » y configure el disparador en el botón para abrir o instalar su aplicación.
      1. Al configurar la etiqueta Abrir aplicación, especifique su enlace base de la web móvil a la aplicación desde la página Administrar enlaces de Singular.

        openApp.png

  3. Para el seguimiento de Web a aplicación en ordenadores de sobremesa:
    • Cree una etiqueta de limpieza del generador de códigos QR
      1. Vaya a Etiquetas > Nuevo en GTM y seleccione HTML personalizado.
      2. Añada el código a:
        • Inyecte la biblioteca QRCode que elija
        • Recuperar el enlace web a aplicación desde window.singularSdk.buildWebToAppLink(baselink);
        • Genere el código QR a partir del enlace devuelto.
        • Actualice la imagen del código QR en la página.
      3. Asigne un nombre a la etiqueta: «Singular - Generador de códigos QR (Limpieza)».
      4. No se necesita ningún activador: las etiquetas de limpieza heredan los activadores de la etiqueta principal
      5. Configure su etiqueta Singular Init:
        • Haga clic en Configuración de etiquetas
        • Vaya a Configuración avanzada > Secuenciación de etiquetas
        • Marque «Activar una etiqueta de limpieza después de que se active [Etiqueta Singular Init]»
        • Seleccione su etiqueta Generador de códigos QR en el menú desplegable
        • Guarde la etiqueta y pruébela en modo Vista previa.

¡CONSEJO! Las vistas web del navegador móvil integrado en la aplicación (como las que utilizan Facebook , Instagram y TikTok) pueden provocar que el ID de dispositivo único cambie si el usuario pasa al navegador nativo del dispositivo, lo que interrumpe la atribución.

Para evitarlo, utilice siempre el formato de enlace de seguimiento de Singular adecuado para cada red publicitaria:


Temas avanzados

Banners de Singular

Habilitar banners singulares
#

INFORMACIÓN: Los banners singulares son una función empresarial. Para obtener más información sobre esta función, ponte en contacto con tu gestor de éxito del cliente.

Los banners singulares se pueden mostrar en su sitio web móvil para dirigir a los usuarios web de forma fluida a su aplicación y mostrar el contenido más relevante de la aplicación. Una vez que habilite los banners singulares en su sitio web, su organización podrá diseñar, implementar y mantener fácilmente los banners a través de la interfaz de usuario de banners singulares.

Artículos relacionados

Guía de implementación paso a paso

  1. Añada la etiqueta de inicialización GTM de Singular WebSDK a su sitio web.

    Siga la guía de integración anterior para añadir el Singular GTM WebSDK a su sitio web antes de continuar con la implementación de los banners.

  2. En la configuración de la etiqueta de inicialización, habilite los banners inteligentes y la compatibilidad con Web-to-App. Se recomienda establecer la prioridad de activación de la etiqueta de configuración avanzada en 99. Esto dará prioridad a la inicialización frente a otras etiquetas con el mismo desencadenante de activación.

    gtm-banners.png

  3. Añada la etiqueta Mostrar banner

    Para mostrar el banner inteligente después de que se cargue la página, añada una etiqueta Mostrar banner activada en Todas las visitas a la página. Se recomienda establecer la prioridad de activación de la etiqueta Configuración avanzada en 1, lo que retrasa la activación de esta etiqueta hasta el final.

    showBanner.png

    Para ocultar un banner en una página, añada la etiqueta Ocultar banner y establezca un disparador según sus necesidades.

  4. [Opción avanzada] Personalizar la configuración de los enlaces

    Singular ofrece la posibilidad de personalizar los enlaces del banner mediante código.

    Para personalizar los enlaces:

    • En la configuración de la etiqueta Mostrar banner, expanda la sección «Parámetros de enlace (opcional)». Puede añadir valores de anulación específicos para la lógica de redirección de la acción de clic en el banner.

      bannerRedirects.png

    Lista de opciones:

    Método Descripción
    Android Redirect URL Pase un enlace de redireccionamiento a la página de descarga de su aplicación Android , normalmente una página de Play Store.
    Android Deep Link Pase un enlace profundo a una página dentro de su aplicación Android.
    Android Deferred Deep Link Pase un enlace profundo diferido, es decir, un enlace a una página de su aplicación Android que el usuario aún no ha instalado .
    iOS Redirect URL Pasa un enlace de redireccionamiento a la página de descarga de tu aplicación iOS , normalmente una página de App Store.
    iOS Deep Link Pasa un enlace profundo a una página dentro de tu aplicación iOS.
    iOS Deferred Deep Link Pasa un enlace profundo diferido, es decir, un enlace a una página de tu aplicación iOS que el usuario aún no ha instalado .

Añadir propiedades globales

Propiedades globales
#

El SDK de Singular te permite definir propiedades personalizadas que se enviarán a los servidores de Singular junto con cada sesión y evento. Estas propiedades pueden representar información sobre el usuario, el modo/estado de la aplicación o cualquier otra cosa que elijas.

  • Puede definir hasta 5 propiedades globales como un objeto JSON válido. Las propiedades globales se conservan en el localStorage del navegador hasta que se borran.

  • Cada nombre y valor de propiedad puede tener hasta 200 caracteres de longitud. Si pasa un nombre o valor de propiedad más largo, se truncará a 200 caracteres.

  • Las propiedades globales se reflejan en los registros de eventos a nivel de usuario de Singular y en los postbacks.

Las propiedades globales ahora son compatibles con la plantilla de seguimiento de Google Tag Manager durante la inicialización. En el tipo de etiqueta de inicialización de Singular GTM , establezca un objeto JSON de propiedades y elija si desea anular las propiedades existentes.

Tipos de etiquetas de propiedades globales en GTM

Utilice el tipo de etiqueta Inicialización para establecer propiedades globales en la inicialización. Para las actualizaciones en tiempo de ejecución después de la inicialización, utilice los tipos de etiquetas de propiedades globales específicos (Establecer, Obtener, Desestablecer, Borrar).

Set on InitializationSet Global PropertiesGet Global PropertiesUnset Global PropertyClear Global Properties

Configuración de la etiqueta de inicialización

En el tipo de etiqueta Singular GTM Initialization , establezca el objeto Global Properties (objeto) asignando variables, valores de capa de datos o texto en los campos Key y Value. Ajuste el campo Override (verdadero/falso) según sus necesidades. Cuando Override es false , la propiedad existente no se modifica; cuando true, la propiedad existente se sustituye.

gpgtm.png


Seguimiento de búsquedas orgánicas

Ejemplo de seguimiento de búsquedas orgánicas
#

Creación de la etiqueta de configuración del seguimiento de búsquedas orgánicas

¡CRÍTICO! - ¡Esta etiqueta debe activarse antes de la inicialización del SDK de Singular!

Esta etiqueta HTML personalizada modifica la URL del documento para añadir parámetros de seguimiento de búsquedas orgánicas (wpsrc y wpcn) que Singular Web SDK necesita leer durante la inicialización. La secuencia de etiquetas es esencial para garantizar un orden de ejecución adecuado.

Este ejemplo se proporciona como una solución alternativa para habilitar el seguimiento de búsquedas orgánicas. El código debe utilizarse únicamente como ejemplo y ser actualizado y mantenido por el desarrollador web en función de las necesidades de su departamento de marketing. El seguimiento de búsquedas orgánicas puede tener diferentes significados según el anunciante. Revise la muestra y ajústela a sus necesidades.

¿Por qué utilizarlo?

  • Garantiza que las visitas de búsqueda orgánica se rastreen correctamente, incluso si no hay parámetros de campaña.

  • Añade el parámetro singular «Fuente» wpsrc con el valor de la referencia (referrer) y el parámetro «Nombre de la campaña» wpcn como «OrganicSearch» a la URL para una atribución clara .

  • Almacena la URL actual y el referenciador en localStorage para su uso posterior.

  • Puro JavaScript, sin dependencias y fácil de integrar.

Cómo funciona

  1. Comprueba la URL de la página en busca de parámetros de campaña conocidos de (Google, Facebook, TikTok, UTM, etc.).

  2. Si no hay parámetros de campaña y el referente es un motor de búsqueda, añade:

    • wpsrc (con el referente como su valor)
    • wpcn (con OrganicSearch como su valor)
  3. Actualiza la URL en el navegador sin recargar la página.

  4. Almacena la URL actual y el referente en localStorage como sng_url y sng_ref.

Uso

  1. Navegue a Etiquetas > Nuevo en GTM y haga clic en Configuración de etiquetas, luego seleccione HTML personalizado.
  2. Pegue el código JavaScript completo como se muestra a continuación.
  3. Omita la creación del activador para esta etiqueta. Dado que esta etiqueta debe ejecutarse antes de la etiqueta Singular Init, la configuraremos para que se active antes de Init utilizando la secuencia de etiquetas.

    1. Utilice un nombre descriptivo como «Singular - Configuración de búsqueda orgánica ».
    2. Abra su etiqueta de inicio de Singular Web SDK.
    3. Haga clic en Configuración de etiquetas
    4. Vaya a Configuración avanzada > Secuenciación de etiquetas.
    5. Marque «Activar una etiqueta de configuración antes de que se active [etiqueta de inicio de Singular]».
    6. Seleccione su etiqueta «Configuración de búsqueda orgánica de Singular» en el menú desplegable.
    7. Recomendado: marque «No activar [etiqueta de inicio de Singular ] si falla la [etiqueta de configuración]» para evitar la inicialización con una modificación de URL incompleta.
    8. organic_search.png
    9. Guarde la etiqueta.
  4. Utilice el modo de vista previa de GTM para verificar:

    • La etiqueta de configuración se activa primero y modifica la URL.
    • La etiqueta Singular Init se activa en segundo lugar y lee los parámetros de la URL modificada .
    • No se producen conflictos de sincronización entre las etiquetas.

Para la secuenciación avanzada de etiquetas: Consulte la documentación oficial de 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>

Seguimiento entre subdominios

De forma predeterminada, el SDK del sitio web de Singular genera un ID de dispositivo Singular y lo mantiene utilizando el almacenamiento del navegador. Dado que este almacenamiento no se puede compartir entre subdominios, el SDK termina generando un nuevo ID para cada subdominio.

Si desea conservar el ID de dispositivo Singular en todos los subdominios, puede utilizar una de las siguientes opciones:

Método B (avanzado): establecer el ID de dispositivo Singular manualmente
#

Método B (avanzado): establecer el ID de dispositivo Singular manualmente

Si no desea que el SDK de Singular conserve el ID del dispositivo automáticamente, puede conservar el ID manualmente en todos los dominios, por ejemplo, utilizando una cookie de dominio de nivel superior o una cookie del lado del servidor. El valor debe ser un ID previamente generado por Singular en formato uuid4 válido.

Nota: Puede leer el ID de dispositivo Singular definiendo una variable JavaScript personalizada y llamando a singularSdk.getSingularDeviceId() después de llamar a la etiqueta de tipo de seguimiento Init.

mceclip2.png


Problemas comunes de implementación de GTM

Identificadores de dispositivo necesarios
El evento se activa varias veces Refine o limite sus desencadenantes, utilice «Una vez por página» o añada condiciones
Formato de ID de producto incorrecto El ID del producto debe utilizar la notación DNS inversa (com.company.site)
Eventos que no se rastrean Compruebe la ortografía y las mayúsculas y minúsculas de los nombres de los eventos; asegúrese de que singular El SDK se carga antes de que se active la etiqueta del evento
Script SDK bloqueado Bloqueadores de anuncios o política de seguridad de contenido restrictiva; considere pasar a la implementación JS nativa si los problemas persisten

Prácticas recomendadas

  • Mantenga GTM organizado: nombre las etiquetas y los activadores de forma clara y documente su finalidad.
  • Audite regularmente las etiquetas no utilizadas o heredadas.
  • Minimice el número de activadores para reducir el riesgo de eventos duplicados.
  • Después de los cambios, siempre prueba a fondo en el modo de vista previa de GTM antes de ponerlo en vivo.
  • Si utiliza el seguimiento basado en cookies (seguimiento entre subdominios), actualice su política de privacidad en consecuencia.

Artículos relacionados