Seguimiento multidominio

En esta guía se describe cómo realizar el seguimiento de los usuarios en diferentes dominios con analytics.js.

Descripción general

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

De forma predeterminada, el ID de cliente se almacena en las cookies del navegador, lo que significa que únicamente las páginas del mismo dominio pueden acceder a él. Si tienes varios dominios y te gustaría tratarlos como una única propiedad, deberías encontrar una manera de compartir un ID de cliente entre todos los dominios de los que quieres realizar un seguimiento.

Compartir un ID de cliente entre varios dominios

Para compartir un ID de cliente entre varios dominios, puedes agregarlo como un parámetro de consulta a las URL que apuntan del dominio actual (dominio de origen) al dominio de destino del que quieres realizar un seguimiento. Cuando un usuario hace clic en un enlace o envía un formulario en el dominio de origen y accede al dominio de destino, el código en la página de destino puede leer el ID de cliente en la URL.

Obtener el ID de cliente en el dominio de origen

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

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

Cuando tengas el ID de cliente en el dominio de origen, puedes agregarlo a los enlaces que apuntan al dominio de destino.

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

Configurar del ID de cliente en el dominio de destino

Para indicar a un objeto de seguimiento en el dominio de destino qué ID de cliente debe utilizar, puedes especificar el campo de ID de cliente en el comando create:

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

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

Detectar el intercambio de URL

Un posible problema al pasar el ID de cliente en una URL es que los usuarios comparten las URL y puede que un usuario comparta una con un ID de cliente que pertenezca 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 ha pasado mucho tiempo, puedes considerar que el ID de cliente no es válido. También puedes agregar la cadena de agente de usuario o metadatos específicos de otro dispositivo o de navegador. Si los metadatos no coinciden en el dominio de destino, sabrás que el ID de cliente se creó para otra persona.

Omitir las autorreferencias

Cuando la referencia de documento de una página provenga de un nombre de host que no coincida con ninguna de las entradas de la lista de exclusiones de referencias de tu propiedad, se creará una campaña de referencias.

De forma predeterminada, la lista de exclusión de referencias solo incluye el dominio que proporcionaste cuando se creó la propiedad por primera vez. Para evitar que se generen campañas de referencias cuando los usuarios se desplacen de un dominio a otro, debes agregar una entrada por cada dominio del que quieras realizar el seguimiento en la lista de exclusión de referencias.

Iframes

La técnica descrita previamente requiere que se ejecute el código JavaScript tras cargarse analytics.js. Como en la página suele haber elementos <iframe> antes de que se cargue analytics.js, no es posible agregar el ID de cliente a la URL en el parámetro de origen del iframe.

Para resolver este problema, puedes configurar la página dentro del iframe para retrasar la creación del objeto de seguimiento hasta después de recibir los datos de ID de cliente de la página principal y configurar la página principal para que envíe el ID de cliente a la página iframe con postMessage.

Este es un ejemplo de 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 código permite 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, en cuyo caso la página del iframe nunca recibiría el ID de cliente. El modo de abordar este caso depende de si es muy importante que el ID de cliente coincida.

Si solo quieres capturar datos cuando los ID de cliente coincidan, el código anterior es suficiente. Ahora bien, si quieres capturar los datos de la página del iframe aunque no recibas el ID de cliente de la página principal, tendrás que agregar un respaldo.

Este código utiliza un tiempo de espera en la página del iframe por si la página principal fuera lenta o no enviara 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);