Mon. Jan 20th, 2025

Evite transacciones duplicadas en Google Analytics con customTask


Uno de los grandes problemas en ‘Google Analytics’ El modelo de datos es la inmutabilidad de los datos históricos. Una vez que se escribe una fila de datos en la tabla de datos, permanece allí prácticamente para siempre. Esto es especialmente molesto en dos casos: correo basura y visitas falsas al comercio electrónico. El primero es un problema reconocido con un Protocolo de recogida de datos públicos y abiertosesto último es una molestia que puede explotar en un sabotaje whole (puede usar el Protocolo de Medición para enviar cientos de transacciones enormes a la propiedad GA de su competidor, por ejemplo).

En este artículo, abordaré un síntoma diferente. Ya he hablado de esto antesy David Vallejo ha escrito un Excelente articulo sobre este tema también.

El problema es que transacciones duplicadasEs muy común que su sitio tenga una página de recibos a la que se pueda volver a acceder a través del historial o la memoria caché del navegador. Al volver a acceder a la página de recibos, suele suceder que los detalles de la transacción se escriban en dataLayer (o enviado con el ga() método) nuevamente, lo que resulta en la inflación de sus datos de comercio electrónico.

Una forma más sencilla de confirmar si esto es un problema es crear informe personalizado donde se comparan los identificadores de transacciones con la métrica Transacciones. Lo óptimo sería tener una transacción por identificador, a menos que haya decidido habilitar actualizaciones o mejoras de transacciones en su recopilación de datos.

He decidido actualizar mi solución para utilizarla Tarea personalizadaya que te permite prescindir de activadores adicionales o lógica variable. Configuraremos las cosas con Administrador de etiquetas de Googlepero nada le impide hacer lo mismo también con analytics.js en la página.


incógnita


El boletín informativo de Simmer

Suscríbete a la Boletín informativo de Simmer ¡Para recibir las últimas noticias y contenidos de Simo Ahava en tu bandeja de entrada de correo electrónico!

Cómo funciona

Cuando agregas el customTask variable a sus etiquetas, se activa cada vez que la etiqueta intenta enviar un hit a Google Analytics.

Durante esta activación, el método busca la clave &ti en el modelo de hit. Esta clave corresponde a la Identificación de transacción valor.

A continuación, busca en el almacenamiento de su navegador cualquier ID de transacción ya enviada desde el navegador precise.

Si el ID de transacción en el hit se encuentra en el almacenamiento del navegador, esto customTask bloquea el impacto para que nunca se energetic, lo que impide que la información duplicada llegue a Google Analytics.

Si el ID de transacción en el hit es no encontrado en el almacenamiento del navegador, el customTask Envía el hit a GA normalmente, pero también almacena el ID de transacción en la lista de transacciones que ya se han registrado. Por lo tanto, bloquea cualquier futuro los hits con este ID no serán enviados.

¡NOTA! Esta función de bloqueo automático solo funciona con Comercio electrónico mejoradoCon el comercio electrónico estándar, el customTask Solo actualizará el almacenamiento del navegador, pero no bloqueará nada. En su lugar, deberá utilizar activadores (siga leyendo para obtener instrucciones sobre cómo hacerlo).

La variable customTask

Puedes utilizar el Herramienta de creación de tareas personalizadas para generar la variable necesaria, o simplemente puede copiar y pegar el código a continuación en un Variable de JavaScript personalizadasi lo desea. La ventaja de utilizar la herramienta de creación es que puede combinar esto customTask con todas las demás configuraciones que he agregado a la herramienta.

De todos modos, así es como debería verse la variable JavaScript personalizada:

operate() {
  // customTask Builder by Simo Ahava
  //
  // Extra details about customTask: https://www.simoahava.com/analytics/customtask-the-guide/
  //
  // Change the default values for the settings under.

  // transactionDeduper: Configuration object for stopping duplicate transactions from being recorded.
  // https://bit.ly/2AvSZ2Y
  var transactionDeduper = {
    keyName: '_transaction_ids',
    cookieExpiresDays: 365
  };

  // DO NOT EDIT ANYTHING BELOW THIS LINE
  var readFromStorage = operate(key) {
    if (!window.Storage) {
      // From: https://stackoverflow.com/a/15724300/2367037
      var worth = '; ' + doc.cookie;
      var components = worth.cut up('; ' + key + '=');
      if (components.size === 2) return components.pop().cut up(';').shift();
    } else {
      return window.localStorage.getItem(key);
    }
  };

  var writeToStorage = operate(key, worth, expireDays) {
    if (!window.Storage) {
      var expiresDate = new Date();
      expiresDate.setDate(expiresDate.getDate() + expireDays);
      doc.cookie = key + '=' + worth + ';expires=' + expiresDate.toUTCString();
    } else {
      window.localStorage.setItem(key, worth);
    }
  };

  var globalSendHitTaskName   = '_ga_originalSendHitTask';

  return operate(customTaskModel) {

    window(globalSendHitTaskName) = window(globalSendHitTaskName) || customTaskModel.get('sendHitTask');
    var tempFieldObject, dimensionIndex, depend, ga, tracker, decorateTimer, decorateIframe, iframe;

    customTaskModel.set('sendHitTask', operate(sendHitTaskModel) {

      var originalSendHitTaskModel = sendHitTaskModel,
          originalSendHitTask      = window(globalSendHitTaskName),
          canSendHit               = true;

      var hitPayload, hitPayloadParts, param, val, regexI, trackingId, snowplowVendor, snowplowVersion, snowplowPath, request, originalTrackingId, hitType, nonInteraction, d, transactionId, storedIds;

      strive {

        // transactionDeduper
        if (typeof transactionDeduper === 'object' && transactionDeduper.hasOwnProperty('keyName') && transactionDeduper.hasOwnProperty('cookieExpiresDays') && typeof sendHitTaskModel.get('&ti') !== 'undefined') {
          transactionId = sendHitTaskModel.get('&ti');
          storedIds = JSON.parse(readFromStorage(transactionDeduper.keyName) || '()');
          if (storedIds.indexOf(transactionId) > -1 && ('transaction', 'merchandise').indexOf(sendHitTaskModel.get('hitType')) === -1) {
            canSendHit = false;
          } else if (storedIds.indexOf(transactionId) === -1) {
            storedIds.push(transactionId);
            writeToStorage(transactionDeduper.keyName, JSON.stringify(storedIds), transactionDeduper.cookieExpiresDays);
          }
        }
        // /transactionDeduper

        if (canSendHit) {
          originalSendHitTask(sendHitTaskModel);
        }

      } catch(e) {
        originalSendHitTask(originalSendHitTaskModel);
      }

    });

  };
}

Hay un objeto de configuración en la variable transactionDeduper que puedes modificar si lo deseas. El objeto de configuración debe tener ambos keyName y cookieExpiresDays.

Colocar keyName a que nombre quieres que sea la cookie o la localStorage clave a ser. El valor predeterminado es _transaction_ids.

Colocar cookieExpiresDays al número de días que debe existir la cookie. Una cookie solo se utiliza si el navegador del usuario no admite localStorage. Si localStorage se utiliza, no se establece caducidad.

La lógica principal ocurre cerca del last del bloque de código, donde he enmarcado la solución con // transactionDeduper y // /transactionDeduper .

Realmente es muy sencillo y sigue el proceso que describí en el capítulo anterior.

Si estas usando Comercio electrónico mejoradoentonces esto customTask se encargará de todo por usted. En caso de que el ID de transacción se encuentre en la lista de ID almacenados, simplemente bloqueará el acceso para que no se envíe a Google Analytics.

Si estas usando Comercio electrónico estándarel customTask solo escribirá la ID en el almacenamiento y usted deberá manejar la lógica de bloqueo usted mismo.

En cualquier caso, es necesario añadir esto customTask variable para todas las etiquetas de comercio electrónico mejorado y/o transacciones que tienen la capacidad de enviar información de compra a Google Analytics. Para obtener instrucciones sobre cómo agregar la variable customTask A tus etiquetas, ver Esta guía o siga las instrucciones en el Herramienta de creación de tareas personalizadas.

Desencadenantes y variables para el comercio electrónico estándar

Debido a cómo se divide el comercio electrónico estándar en transaction y merchandise golpes, la lógica de bloqueo sería extremadamente difícil de automatizar en customTaskPor eso necesitarás crear un excepción disparador para su etiqueta de Transacción, que impide que la etiqueta se energetic si el ID de transacción se encuentra en la lista de ID almacenadas.

Variable de capa de datos para el ID de transacción

Crear un Variable de capa de datos para transactionIdcomo esto:

Cree una variable de cookie de origen para la lista de ID de transacción, utilizando el keyName Usted configuró en el customTaskAsí es como se vería una configuración predeterminada:

Variable de JavaScript personalizada para comprobar si el ID está dentro de la lista

Por último, cree una variable JavaScript personalizada que devuelva true Si el ID de transacción se encuentra en la lista.

operate() {
  // Change this to match the keyName you added to customTask:
  var keyName = '_transaction_ids';
  
  var ids = JSON.parse((!!window.Storage ? window.localStorage.getItem(keyName) : {{Cookie - _transaction_ids}}) || '()');
  return ids.indexOf({{DLV - transactionId}}) > -1;
}

Nombra la variable algo como {{JS – transactionId enviado}}.

El disparador de excepción

El último paso es crear un disparador que impida que se energetic la etiqueta de transacción. Debe utilizar el mismo evento como la etiqueta de transacción. Por lo tanto, si la etiqueta de transacción se activa en un disparador de vista de página, el disparador de excepción también debe ser un disparador de vista de página (obtenga más información sobre excepciones) aquí).

En las condiciones de activación, verifique si {{JS – transactionId despatched}} es igual a true. De esta forma, la excepción bloqueará la etiqueta a la que está asociada si el ID de transacción se encuentra en la lista de ID ya registrados.

A continuación se muestra un ejemplo de cómo se ve la excepción con un disparador de evento personalizado y cómo se agrega la excepción a la etiqueta.

Reflexiones finales

Mi búsqueda para mejorar la calidad de los datos de Google Analytics utilizando customTask continúa.

Es agradable y elegante ejecutar la estrategia de evitar que se envíen visitas si surgen ciertas condiciones. customTaskya que no tienes que lidiar con desencadenadores complicados que abarrotan tu interfaz GTM.

Sin embargo, cada customTask El uso aumenta la opacidad de su configuración, por lo que la desventaja es que no sabrá qué hacen las etiquetas individuales a easy vista sin profundizar en sus campos establecidos (y comprender qué customTask lo hace en primer lugar).

Como siempre, ¡cuéntame qué piensas sobre esta solución en los comentarios y también dime si tienes sugerencias para mejorarla! Gracias.

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *