Материал основан на статье Simo Ahava «customTask — The Guide».
Примерно год назад (в 2017) произошло обновление JS библиотеки Universal Analytics. Обновление принесло с собой такую замечательную штуку как customTask. Данная фича, в рамках Google Tag Manager, позволяет выполнять любые «задания» до отправки хита в Google Analytics.
В оригинальной статье Simo Ahava подробно описывает механизм работы customTask и делится полезными примерами. Также можно ознакомиться с официальным мануалом по библиотеке Universal Analytics, где дано описание всех тасков с очередностью их выполнения.
![](https://habrastorage.org/r/w1560/webt/q6/kt/zb/q6ktzb7tdecssudlibkjufuj_8a.png)
Порядок выполнения заданий analytics.js
Ниже представлен краткий обзор примеров использования customTask. Уверен, некоторые решения вам точно пригодятся.
1. Запись Client ID в custom dimension
Самый надежный способ передачи Client ID на текущий момент. Мануалы по настройке:
2. Дублирование хита GA и отправка его в другие места
Мануалы:
3. Удаление персональных данных из GA payload (GDPR*)
Мануал от Simo Ahava.
Пригодиться в первую очередь тем, кто работает со странами Евросоюза и столкнулся с выполнением требований GDPR. Данное решение позволяет убрать все персональные данные из payload'a (где-бы они не находились: URL, Custom Dimension, Event Label, etc.).
Например page path:
после модификации customTask будет таким:
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
Что объединяем:
Сначала определяем Client ID. Затем, через регулярные выражения, указываем какие персональные данные мы хотим искать. В данном примере задан только один параметр — email. Можно добавить больше (см. мануал Simo Ahava).
Следующий шаг — проверяем payload на наличие персональных данных и перезаписываем его. Здесь есть один нюанс — двойное декодирование. Добавлена инструкция try… catch для отлова случаев если попадается знак процента '%' (также в regex добавлено условие %40). Если данную инструкцию убрать, то хиты в которых встречается '%' доходить не будут т.к. возникает JS ошибка. Способов декодирования существует множество, в данном случае, это один из рабочих вариантов. Можете попробовать свои.
Последние шаги — отправка модифицированного payload в оригинальный GA property и дублирование/отправка в другой GA property.
Если у вас есть еще примеры использования customTask — поделитесь опытом. Буду рад дополнить статью.
Примерно год назад (в 2017) произошло обновление JS библиотеки Universal Analytics. Обновление принесло с собой такую замечательную штуку как customTask. Данная фича, в рамках Google Tag Manager, позволяет выполнять любые «задания» до отправки хита в Google Analytics.
В оригинальной статье Simo Ahava подробно описывает механизм работы customTask и делится полезными примерами. Также можно ознакомиться с официальным мануалом по библиотеке Universal Analytics, где дано описание всех тасков с очередностью их выполнения.
![](https://habrastorage.org/webt/q6/kt/zb/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 (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 — поделитесь опытом. Буду рад дополнить статью.