Mediciones multidominio

En esta guía, se describe cómo medir eventos en varios dominios con analytics.js.

Descripción general

La biblioteca analytics.js utiliza un ID de cliente único para determinar si un usuario es nuevo o recurrente. Se considera que un usuario regresa si ya se envió un hit con un ID de cliente coincidente a la misma propiedad.

De forma predeterminada, el ID de cliente se almacena en las cookies del navegador, lo que significa que solo se puede acceder a él desde páginas del mismo dominio. Si deseas realizar un seguimiento del mismo ID de cliente para un usuario determinado en diferentes dominios, usa el seguimiento multidominio.

Para compartir un ID de cliente en varios dominios, puedes agregarlo como un parámetro de consulta a las URLs que dirigen desde el dominio actual (el dominio de origen) al dominio de destino que deseas medir. Cuando un usuario hace clic en un vínculo o envía un formulario en el dominio de origen y navega al dominio de destino, el código de la página de destino puede acceder al ID de cliente leyendo la URL.

Obtén el ID de cliente en el dominio de origen

Para recuperar un ID de cliente en el dominio de origen, usa el método get:

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});

Una vez que tengas el ID de cliente en el dominio de origen, puedes agregarlo a vínculos que apunten al dominio de destino.

<a href="https://destination.com/?clientId=XXXXXX">destination.com</a>

Configura el ID de cliente en el dominio de destino

Para indicarle a un objeto de seguimiento del dominio de destino qué ID de cliente debe usar, especifica el campo de ID de cliente en el comando create:

ga('create', 'UA-XXXXX-Y', 'auto', {
  'clientId': getClientIdFromUrl()
});

Si ya existe un ID de cliente en el dominio de destino, este método lo reemplazará.

Detecta el uso compartido de URL

Un posible problema al pasar el ID de cliente en una URL es que los usuarios comparten las URLs y también es posible que un usuario comparta una URL que contenga un ID de cliente que pertenece a otra persona.

Una forma de evitar este problema es agregar una marca de tiempo al ID de cliente. Esto te permite detectar cuándo se creó originalmente la URL y, si pasó demasiado tiempo, considera que el ID de cliente no es válido. Además de una marca de tiempo, puede agregar la cadena del usuario-agente, o bien otros metadatos específicos del navegador o del dispositivo. Así, en el dominio de destino, si los metadatos no coinciden, sabrás que el ID de cliente se originó de otro usuario.

Ignora las autorreferencias

Se creará una nueva campaña de referencias cada vez que la URL de referencia del documento de una página provenga de un nombre de host que no coincida con ninguna de las entradas de la lista de Exclusión de referencias de tu propiedad.

De forma predeterminada, la lista de exclusiones de referencias incluye solo el dominio que proporcionaste cuando se creó la propiedad por primera vez. Para evitar que se generen nuevas campañas de referencias cuando los usuarios navegan por los dominios, debes agregar una entrada para cada dominio que deseas medir en la lista de exclusiones de referencias.

Iframes

La técnica descrita anteriormente requiere código JavaScript que se ejecuta después de que se carga el archivo analytics.js. Dado que, por lo general, los elementos <iframe> existen en la página antes de que se cargue el archivo analytics.js, agregar el ID de cliente a la URL en el parámetro fuente del iframe no suele ser una opción.

Para solucionar este problema, puedes configurar la página dentro del iframe para que retrase la creación de su rastreador hasta que reciba los datos de ID de cliente desde la página principal. Y en la página superior, lo configuras para enviar el ID de cliente a la página de iframe con postMessage.

Este es un ejemplo del código de la página principal en source.com:

<iframe id="destination-frame" src="https://destination.com"></iframe>

<script>
ga('create', 'UA-XXXXX-Y', 'auto');
ga(function(tracker) {
  // Gets the client ID of the default tracker.
  var clientId = tracker.get('clientId');

  // Gets a reference to the window object of the destionation iframe.
  var frameWindow = document.getElementById('destination-frame').contentWindow;

  // Sends the client ID to the window inside the destination frame.
  frameWindow.postMessage(clientId, 'https://destination.com');
});
</script>

Este es el código que recibirá el mensaje en el iframe alojado en destination.com:

window.addEventListener('message', function(event) {
  // Ignores messages from untrusted domains.
  if (event.origin != 'https://destination.com') return;

  ga('create', 'UA-XXXXX-Y', 'auto', {
    clientId: event.data
  });
});

Es posible que analytics.js no se cargue en la página principal y que, luego, la página del iframe nunca reciba el ID de cliente. La forma en que manejas este caso depende de la importancia de que los IDs de cliente coincidan.

Si solo deseas captar datos cuando sabes que los IDs de cliente son los mismos, el código anterior es suficiente. Si deseas capturar datos en la página en el marco independientemente de si recibe el ID de cliente desde la página principal, deberás agregar un resguardo.

El siguiente código utiliza un tiempo de espera en la página del iframe para abordar el caso en el que la página principal es lenta o no envía el ID de cliente:

// Stores whether or not the tracker has been created.
var trackerCreated = false;

function createTracker(opt_clientId) {
  if (!trackerCreated) {
    var fields = {};
    if (opt_clientId) {
      fields.clientId = opt_clientId;
    }

    ga('create', 'UA-XXXXX-Y', 'auto', fields);
    trackerCreated = true;
  }
}


window.addEventListener('message', function(event) {
  // Ignores messages from untrusted domains.
  if (event.origin != 'https://destination.com') return;

  // Creates the tracker with the data from the parent page.
  createTracker(event.data);
});


// Waits for three seconds to receive the client ID from the parent page.
// If that doesn't happen, it creates the tracker as normal.
setTimeout(createTracker, 3000);