Как стать автором
Обновить

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

Время на прочтение5 мин
Количество просмотров5.7K
Материал основан на статье Simo Ahava «customTask — The Guide».

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

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


Порядок выполнения заданий 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 (GDPR*)

Мануал от Simo Ahava.

Пригодиться в первую очередь тем, кто работает со странами Евросоюза и столкнулся с выполнением требований GDPR. Данное решение позволяет убрать все персональные данные из 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 (GDPR*)

Мануал от Simo Ahava.

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

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

Мануал от Simo Ahava.

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

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

Мануал от Simo Ahava.

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

8. Автоматическая подрезка GA Payload Lenght

Мануал от Simo Ahava.

Красивое решение проблемы с превышением payload lenght. Одним за одним удаляет из payload'a ненужные параметры пока тот не станет меньше 8192. Что конкретно выкидывать — можно настроить.

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


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

  • В GTM теге можно определить только один customTask
  • В JS коде customTask'a, параметр model определяется один раз.
    Отправка таска sendHitTask тоже происходит один раз (в рамках одного тега):
    model.set('sendHitTask', function(sendModel) {… });
    Если записать несколько sendHitTask в один customTask — отправиться только один (последний).

Пример объединения нескольких решений в один 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=).+?(?=@|%40)/gi
    }];
  
    // Fetch reference to the original sendHitTask
    var globalSendTaskName = '_' + model.get('trackingId') + '_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
        try {
          val = decodeURIComponent(decodeURIComponent(parts[1]));
        } 
        catch (e) {
          val = 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 на наличие персональных данных и перезаписываем его. Здесь есть один нюанс — двойное декодирование. Добавлена инструкция try… catch для отлова случаев если попадается знак процента '%' (также в regex добавлено условие %40). Если данную инструкцию убрать, то хиты в которых встречается '%' доходить не будут т.к. возникает JS ошибка. Способов декодирования существует множество, в данном случае, это один из рабочих вариантов. Можете попробовать свои.
Последние шаги — отправка модифицированного payload в оригинальный GA property и дублирование/отправка в другой GA property.

Если у вас есть еще примеры использования customTask — поделитесь опытом. Буду рад дополнить статью.
Теги:
Хабы:
+8
Комментарии0

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн