Примеры использования customTask в Google Tag Manager

Материал основан на статье Simo Ahava «customTask — The Guide».

Примерно год назад (в 2017) произошло обновление JS библиотеки Universal Analytics. Обновление принесло с собой такую замечательную штуку как customTask. Данная фича, в рамках Google Tag Manager, позволяет выполнять любые «задания» до отправки хита в Google Analytics.

В оригинальной статье Simo Ahava подробно/с картинками описывает механизм работы customTask и делится полезными примерами. Также можно ознакомиться с официальным мануалом по библиотеке Universal Analytics, где дано описание всех тасков с очередностью их выполнения.

q6ktzb7tdecssudlibkjufuj_8a.png
Порядок выполнения заданий analytics.js

Ниже представлен краткий обзор примеров использования customTask. Уверен, некоторые решения вам точно пригодятся.

Примеры использования customTask (краткий обзор)


1. Запись Client ID в custom dimension

Самый надежный способ передачи Client ID на текущий момент. Мануалы по настройке:


2. Дублирование хита GA и отправка его в другие места

Мануалы:

  • Отправка в несколько GA property, автор Simo Ahava.
    Хорошая идея для оптимизации тегов в GTM (не нужно создавать дополнительных тегов для отправки данных в несколько аккаунтов). Единственный минус — если в теге настроено междоменное отслеживание (cross-domains tracking), то дублируемый хит уйдет без этих настроек (только оригинальный хит сохранит настройки тега).
  • Отправка в Google Sheet, автор dkomarovskiy.
    Выгрузка всех данных хита (payload) в Google Sheet. Полезно при дебаге и анализе данных (если проект небольшой).
  • Отправка в Google Bigquery (note! здесь используется таск sendHitTask т.е. одновременно использовать customTask и sendHitTask нельзя; можно переписать код из sendHitTask в customTask — тогда все ок), автор Dmitri Ilin.
    Крутой мануал если необходимо полностью избавиться от семплирования и ограничений GA.
  • Отправка в Snowplow, автор Simo Ahava.
    Snowplow — сервис позволяющий создать/организовать свой собственный пайплайн для работы с данным в т.ч. веб аналитики. В сервис включены все процессы: начиная со сбора/обработки данных до их хранения и анализа т.е. можете сами сделать свой GA с блэкджеком и сводными таблицами.


3. Удаление персональных данных из GA payload (GDRP*)

Мануал от Simo Ahava.

Пригодиться в первую очередь тем, кто работает со странами Евросоюза и столкнулся с выполнением требований GDRP. Данное решение позволяет убрать все персональные данные из payload’a (где-бы они не находились: URL, Custom Dimension, Event Label, etc.).

Например page path:

/test?tel=+44012345678&email=brian@me.com&other=bclifton@DOMAIN.com&firstName=brian&password=hello


после модификации customTask будет таким:

/test?tel=[REDACTED TELEPHONE]&email=b[REDACTED EMAIL]om&other=bcli[REDACTED SELF-EMAIL]OMAIN.com&firstName=[REDACTED NAME]&password=[REDACTED PASSWORD]


4. Трекинг офлайн пользователей

Мануал от Simo Ahava.

Решает проблему разорванного соединения т.е. например, когда конект обрывается, то отправка хита не заканчивается ошибкой (т.к. нет конекта), а закрепляется в очереди в localStorage. Когда конект возобновляется — хит отправляется. Полезно проектам с высокой долей аудитории с мобильного трафика с нестабильным конектом (часто ездят в метро например).

5. Учет пользовательского согласия на отправку данных в GA (GDRP*)

Мануал от Simo Ahava.

Пригодиться при выполнении требований GDRP. Например у вас на сайте есть поп-ап, в котором пользователь соглашается/не соглашается на обработку своих персональных данных 3-ми лицами. При отказе, данный customTask не отправит данные в GA и DoubleClick.

6. Отправка ID эксперимента Google Optimize в GA

Мануал от Simo Ahava.

Помогает с проблемой отображения данных Google Optimize в GA. Во время эксперимента пользователю присваиваются переменные Experiment Name и Experiment ID. Привязать эти данные к конкретным сессиям/сегментам — проблема, с которой помогает справиться данный customTask. Таск проверяет Page View тег, если он содержит данные об эксперименте — записывает их в custom dimensions и отправляет хит.

7. Auto Link Domains в виде регулярного выражения

Мануал от Simo Ahava.

Решает проблему невозможности использовать регулярные выражения в поле Auto Link Domains при настройке междоменного трекинга.

Объединение нескольких решений в один customTask


Если вы захотели объединить несколько решений в одном customTask, то необходимо помнить следующие правила работы с customTask:

  • В GTM теге можно определить только один customTask
  • В JS коде customTask’a, параметр model определяется один раз и, соответственно, атрибут sendHitTask также отправляется один раз. Если отправить несколько (в рамках одного тега) — дойдет только один (последний).


Пример объединения нескольких решений в один customTask

Что объединяем:

  • определение Client ID в custom dimension
  • удаление персональных данных (PII) из payload
  • отправка хита в несколько GA property
function() {
  var newTrackingId = 'UA-12345678-1';
  return function(model) {
    //Define client ID
    model.set('dimension1', model.get('clientId'));
    // Add the PII patterns into this array as objects
    var piiRegex = [{
      name: 'EMAIL',
      regex: /(?<=emailAddress=|email=).+(?=@)/gi
    }];
    var globalSendTaskName = '_' + model.get('trackingId') + '_sendHitTask';
  
    // Fetch reference to the original sendHitTask
    var originalSendTask = window[globalSendTaskName] = window[globalSendTaskName] || model.get('sendHitTask'); 
    var i, hitPayload, parts, val, oldTrackingId;
    
    model.set('sendHitTask', function(sendModel) {
      // Overwrite sendHitTask with PII purger
      hitPayload = sendModel.get('hitPayload').split('&');
      for (i = 0; i < hitPayload.length; i++) {
        parts = hitPayload[i].split('=');
        // Double-decode, to account for web server encode + analytics.js encode
        val = decodeURIComponent(decodeURIComponent(parts[1]));
        piiRegex.forEach(function(pii) {
          val = val.replace(pii.regex, '[REDACTED ' + pii.name + ']');
        });
        parts[1] = encodeURIComponent(val);
        hitPayload[i] = parts.join('=');
      }
      sendModel.set('hitPayload', hitPayload.join('&'), true);
      originalSendTask(sendModel);

      // Rewrite the tracking ID
      hitPayload = sendModel.get('hitPayload');
      oldTrackingId = new RegExp(sendModel.get('trackingId'), 'gi');
      sendModel.set('hitPayload', hitPayload.replace(oldTrackingId, newTrackingId), true);
      originalSendTask(sendModel);
    });
  };
}


Сначала определяем Client ID. Затем, через регулярные выражения, указываем какие персональные данные мы хотим искать. В данном примере задан только один параметр — email. Можно добавить больше (см. мануал Simo Ahava).
Следующий шаг — проверяем payload на наличие персональных данных и перезаписываем его. Последние шаги — отправка модифицированного payload в оригинальный GA property и дублирование/отправка в другой GA property.

Если у вас есть еще примеры использования customTask — поделитесь опытом. Буду рад дополнить статью.

© Habrahabr.ru