Ограничение развертывания тегов в Google Tag Manager
Знали ли вы, что при использовании Google Tag Manager на своем сайте вы можете контролировать какие теги, триггеры и переменные будут активироваться при совершении того или иного действия, даже если они созданы в рабочей области диспетчера тегов Google и опубликованы? Нет? Я тоже не знал, пока не прочитал официальную справку Google по ограничениям развертывания тегов, хотя работаю с GTM каждый день с 2018 год. Откровение о секретном функционале Google Tag Manager, о котором должны знать все читатели моего блога!
В официальной документации Google есть отдельный материал на тему ограничений развертывания тегов (Restrict tag deployment). В нем описываются возможности диспетчера тегов Google, которые позволяют ограничивать работу переменных, триггеров и тегов, используя определенные ключи блокировки и разрешения. Логичный вопрос - как это работает и зачем это нужно?
Конечно, это предназначено для тотального контроля и администрирования вашего контейнера Google Tag Manager, к которому есть доступ у других пользователей. Например, вы наняли организацию или специалиста по настройке GTM, но до конца не уверены в подрядчике. В ваш контейнер GTM может просочиться какой-то нежелательный код отслеживания, которые повлияет на работу других кодов и стабильность сбора данных. Или у вас уже случилась проблема, и вам необходимо найти скрипт, который влияет на работу всего сайта. Функционал развертывания тегов позволит вам ужесточить контроль над развертыванием тегов в Tag Manager.
Для этого в GTM существует два ключа в вашем уровне данных (dataLayer) - gtm.allowlist и gtm.blocklist. Они переопределяют любую конфигурацию в контейнере. При правильном блокировании теги, триггеры и переменные не будут срабатывать, даже если они были настроены для срабатывания в Google Tag Manager.
Общий код для двух списков
Ниже приведен код, демонстрирующий инициализацию уровня данных как с разрешенным списком (gtm.allowlist), так и с черным списком (gtm.blocklist). Оба списка являются необязательными, вы можете использовать как по отдельности, так и вместе. Оба списка должны иметь тип данных Array (массив), а значения в списке должны иметь тип String (строка). Эти значения должны быть переданы на уровень данных до срабатывания любых тегов:
1 2 3 4 5 6 7 |
<script> window.dataLayer = window.dataLayer || []; dataLayer.push({ 'gtm.allowlist': ['<id>', '<id>', ...], 'gtm.blocklist': ['<id>', '<id>', '<id>', ...] }); </script> |
, где:
- gtm.allowlist - список разрешений. Соответствующие теги, триггеры и переменные будут выполняться только в том случае, если они указаны в списке разрешений, либо явно (по идентификатору ID), либо неявно (по наличию всех их классов Classes в списке);
- gtm.blocklist - список блокировки. Соответствующие теги, триггеры и переменные не будут выполняться только в том случае, если они включены в список блокировки, явно (по идентификатору ID) или неявно (по наличию любого из их классов Classes в списке);
- <id> - идентификатор (ID), соответствующий определенному тегу, триггеру или типу переменной, или классу типов (Classes).
Классы представляют группы тегов, триггеров и переменных, которые имеют одинаковые возможности. Например, все теги, которые могут отправлять данные на домены, не относящиеся к Google, будут иметь класс nonGooglePixels. Классы полезны для блокировки возможностей в текущих и будущих тегах, триггерах и переменных.
Некоторые классы имеют отношения с другими классами. Например, теги, которые запускают не-Google скрипты, могут (по определению) отправлять данные в не-Google сервисы. По этой причине блокировка nonGooglePixels также автоматически заблокирует nonGoogleScripts. Все теги, триггеры и переменные, принадлежащие к любой из групп, будут заблокированы.
Если установлены оба списка, списки блокировки имеют приоритет. Вы можете использовать список блокировки для класса тегов и список блокировки для определенного тега в этом классе, но обратное неверно. Вы не можете использовать список блокировки для класса тегов и список блокировки для определенного тега в этом классе.
В официальной справке Google представлен список доступных тегов, триггеров и переменных, их типов (ID) и классов (Classes), к которым они принадлежат:
Вы можете воспользоваться поиском над таблицей, чтобы быстро отфильтровать теги:
Таблица с триггерами:
Таблица с переменными:
В следующей таблице представлен список доступных классов и их связи с другими классами. Столбец Allowlisted Automatically представляет собой список классов, которые будут неявно включены в разрешенный список, если класс из этой строки также включен в разрешенный список. Аналогично, столбец Blocklisted Automatically представляет собой список классов, которые будут неявно включены в заблокированный список, если класс из этой строки включен в заблокированный список.
Как видите, класс sandboxedScripts не применяет условия списка разрешений к любым другим классам тегов или переменных (значение None). Изолированный JavaScript, используемый как часть пользовательских шаблонов, неявно блокируется на любой странице, которая блокирует любой класс тега или переменной. Чтобы включить пользовательские шаблоны на этих страницах, вы должны явно добавить их с классом sandboxedScripts в свой список разрешений, а затем реализовать проверки политик, если вы хотите контролировать действия пользовательских шаблонов.
Пример со списком блокировки (gtm.blocklist)
В качестве примера в список блокировки добавим все теги, связанные с Google Analytics 4. Для этого воспользуемся поиском по таблице:
Как видите, у всех тегов класс google, но разные идентификаторы. Поэтому для уточнения и конкретизации мы будем использовать именно их - gaawc, gaawe и ga. Для создания списка блокировки gtm.blocklist вы можете поступить двумя способами:
- разместить его в исходном коде сайта, желательно до загрузки контейнера Google Tag Manager;
- создать тег типа Пользовательский HTML, добавить в него dataLayer с gtm.blocklist и соответствующими идентификаторами, а в качестве триггера активации указать Инициализация (Initialization) или Инициализация согласия (Consent Initialization), чтобы он активировался до загрузки других тегов.
В первом варианте это может выглядеть так:
Добавляя код через Пользовательский HTML, это будет выглядеть точно так же:
Активировав режим предварительного просмотра, вы должны увидеть на шкале событий Сообщение (Message).
Оно будет свидетельствовать о том, что список блокировки загружается и выполняется.
Примечание: вариант добавления списков разрешения и блокировки в исходный код страницы до загрузки самого контейнера Google Tag Manager является предпочтительным, поскольку он точно будет загружен раньше всех. А вот добавление кода через Пользовательский HTML внутри самого GTM можно привести к тому, что скрипт загрузки не сразу, а через некоторое время. Таким образом, какие-то теги, триггеры и переменные на мгновенье все равно могут быть активны, до момента применения gtm.allowlist / gtm.blocklist.
Переключившись далее на триггер активации тега Google (у меня он срабатывает на событие Модель DOM готова (DOM Ready)), я вижу, что он не активировался, поскольку был добавлен в список блокировки:
Аналогичным образом не будут актироваться любые другие теги GA4, добавленные в список блокировки gtm.blocklist, даже если данный тег и триггер были настроены верно в вашем контейнере GTM. Например, у меня настроен тег события GA4 на отслеживание глубины прокрутки. Несмотря на то, что триггер отображается на шкале событий, сам тег из-за блокировки не активируются, следовательно, и данные в аналитику не передаются.
В список блокировки можно добавить не только значения тегов, но и даже триггеров и переменных. Например, мы хотим, чтобы на шкале событий не отображались даже сами названия событий Глубина прокрутки. Для этого нужно воспользоваться таблицей триггеров из официальной документации, найти там триггер Scroll Depth Listener/Trigger и его идентификатор:
И добавить это значение дополнительно в gtm.blocklist:
Запустив повторно режим отладки и выполнив это событие, мы увидим, что теперь даже сами события на шкале отсутствуют:
Хотя триггер и тег в самом контейнере Google Tag Manager есть, и они даже активны (опубликованы).
В качестве последнего примера давайте добавим еще и блокировку переменной типа Константа. В моем GTM есть одна переменная, в которой я сохраняю значение идентификатора потока данных счетчика Google Analytics 4:
Ее значение отображается на вкладке Variables (Переменные) в режиме предварительного просмотра:
Чтобы добавить переменную в список блокировки, воспользуемся официальной документацией Google:
Добавляем это значение в gtm.blocklist:
Сохраняем изменений и активируем режим отладки. Перейдя на вкладку Переменные, видим, что данная переменная вместо значения идентификатора потока данных G- принимает значение undefined. То есть она заблокирована.
Таким образом, используя значения из официальной справки Google, вы сможете создать свою уникальную конфигурацию списка блокировки и получите полный контроль над нужными переменными, триггерами и тегами.
Пример со списком разрешения (gtm.allowlist)
Аналогично работает список разрешений gtm.allowlist. Но здесь все наоборот. Будут запущены только теги, триггеры и переменные, перечисленные в в массиве (array) как строковые значение (string). Поэтому вместо списка блокировки можно создать только список разрешений - все остальное работать не будет.
Напоминаю, что если вы используете оба списка (и gtm.allowlist, и gtm.blocklist), список блокировки имеют приоритет. Вы можете установить список разрешения для категории тегов и список блокировки для определенного тега в этой категории, но вы не можете поменять их местами. Другими словами, вы не можете иметь список блокировки для категории тегов и список блокировки для определенного тега в этой категории.
Например, в GTM есть большая категория тегов с классом google (теги Google). Вы можете использовать это значение в списке разрешения gtm.allowlist. Но вы также хотите, чтобы некоторые теги из этой категории были заблокированы. Например, тег Google gaawc должен срабатывать, а теги события gaawe нет. Тогда вы можете использовать оба списка, задав такое условие:
1 2 3 4 5 6 7 |
<script> window.dataLayer = window.dataLayer || []; dataLayer.push({ 'gtm.allowlist': ['google'], 'gtm.blocklist': ['gaawe'] }); </script> |
В Google Tag Manager это будет выглядеть так:
Это означает, что теги Google будут разрешены к активации, но все теги события GA4 (Google Analytics 4 Event) будут блокироваться, даже если они присутствуют в контейнере GTM, активны и опубликованы.
Заключение
В этом руководстве мы с вами разобрали очень редкий функционал Google Tag Manager, который использует менее 1% интернет-маркетологов и веб-аналитиков. В этом конкретном случае и я отношусь к этому меньшинству.
Это связано с тем, что существует не так много вариантов, при которых вы перестанете контролировать свою рабочую область Google Tag Manager, потеряете к нему или же будете переживать за нанятого сотрудника/компанию, предоставляющую услуги по настройке диспетчера тегов Google. Да, теоретически кто-то может внедрить вредоносный код через Google Tag Manager, или сделать так, чтобы точность сбора данных в ваших счетчиках аналитики резко снизилась.
Не забывайте, что с помощью JavaScript можно извлекать информацию о пользователе из заполненных полей формы, а затем передавать куда-то на сторону. Например, имеющий доступ к вашему GTM- настроит отправку заявок с сайта в Google Таблицы или Telegram, и не уведомит вас об этом. Тогда ограничение развертывания тегов вполне обоснованно.
Если вы все-таки планируете использовать данный функционал диспетчера тегов Google, то добавляйте списки разрешения и блокировки в исходный код страницы до загрузки самого контейнера Google Tag Manager, а не через Пользовательский HTML тег, поскольку так он точно будет загружен раньше всех.