Междоменное отслеживание

Из этого руководства вы узнаете, как с помощью analytics.js отслеживать события в нескольких доменах.

Обзор

В библиотеке analytics.js используется уникальный идентификатор клиента, с помощью которого можно определять новых и вернувшихся посетителей. Пользователь считается вернувшимся, если обращение с соответствующим идентификатором клиента уже зарегистрировано для этого ресурса.

По умолчанию идентификатор клиента хранится в файле cookie браузера, поэтому доступ к нему есть только у страниц одного домена. Отслеживать идентификатор клиента в разных доменах можно с помощью междоменного отслеживания.

Чтобы настроить передачу идентификатора клиента между доменами, необходимо добавить его в качестве параметра запроса в URL-адреса, перенаправляющие с текущего (исходного) домена в целевой домен, который вы хотите отслеживать. Если пользователь нажмет на ссылку или отправит форму в исходном домене и перейдет в целевой домен, код целевой страницы получит информацию об идентификаторе клиента из URL.

Как получить идентификатор клиента в исходном домене

Чтобы получить идентификатор клиента в исходном домене, воспользуйтесь методом get:

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

После этого вы можете добавить его в ссылки, ведущие в целевой домен:

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

Как задать идентификатор клиента в целевом домене

Вы можете дать указание счетчику в целевом домене, какой идентификатор клиента следует использовать, задав соответствующее поле в команде create:

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

Если в целевом домене уже задан идентификатор клиента, этот метод заменит прежнее значение новым.

Выявление URL с идентификатором другого пользователя

При передаче идентификатора клиента через URL может возникнуть проблема, связанная с тем, что пользователи делятся URL-адресами друг с другом.

Одно из решений – добавить в идентификатор клиента временную метку. Если URL создан давно, идентификатор можно считать недействительным. Второй способ – добавить метаданные браузера или устройства, например агент пользователя. Если этот параметр не совпадет, вы будете знать, что идентификатор принадлежит кому-то другому.

Игнорирование внутридоменных переходов

Каждый раз, когда значение document.referrer страницы поступает с хоста, которого нет в списке исключаемых источников перехода для ресурса, создается новая кампания – источник перехода.

По умолчанию список исключаемых источников перехода содержит только домен, который вы указали при создании ресурса. Чтобы при переходе пользователей между доменами не создавались новые кампании – источники перехода, необходимо добавить в список исключений каждый домен, который вы хотите отслеживать.

Окна iframe

Для описанного выше метода требуется код JavaScript, выполняемый после загрузки analytics.js. Поскольку элементы <iframe> обычно присутствуют на странице до загрузки analytics.js, добавление идентификатора клиента к URL в параметр источника iframe часто не имеет смысла.

Чтобы решить эту проблему, настройте задержку создания счетчика на странице в окне iframe, пока не будет получен идентификатор клиента с основной страницы. При этом на основной странице необходимо настроить передачу идентификатора клиента странице в окне iframe с помощью метода postMessage.

Ниже приведен пример кода основной страницы на 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>

А так выглядит код, получающий сообщение в окне iframe, размещенном на 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
  });
});

Если analytics.js не удается загрузить на основной странице, страница в окне iframe не получает идентификатор клиента. Решение этой проблемы зависит от того, насколько важно совпадение идентификаторов.

Если вы хотите получать данные только при совпадении идентификаторов клиента, приведенного выше кода будет достаточно. Если же требуется собирать сведения на странице в окне iframe, даже когда идентификатор клиента не передан с основной страницы, следует настроить резервный способ.

В приведенном ниже коде используется время ожидания страницы в окне iframe, когда основная страница загружается медленно или не передает идентификатор клиента:

// 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);