Эта статья предназначена для разработчиков, которые поддерживают решение для управления запросами согласия на сайтах, на которых используется Google Менеджер тегов.
Здесь рассказывается о типах согласия в Google Менеджере тегов и показано, как интегрировать их с вашим решением для управления запросами согласия.
Зачем нужно использовать шаблон тега для запроса согласия
Если у вас есть шаблон тега, пользователи смогут интегрировать ваше решение, не меняя код, что помогает сэкономить много времени и сил.
С помощью шаблона пользователи смогут задавать статусы согласия по умолчанию и передавать ответы посетителей сайта в Google Менеджер тегов. Это обеспечивает оптимальную работу тегов Google и сторонних тегов, поддерживающих режим согласия.
Созданный шаблон можно использовать для внутренних целей или опубликовать в галерее. Если поставщик платформы для запросов согласия (CMP) предлагает шаблоны режима согласия, мы можем указать его в нашей документации и добавить его шаблоны в галерею.
Статус и типы согласия
Теги Google и сторонние теги, собирающие данные, меняют свое поведение в зависимости от статуса согласия (granted
(предоставлено) или denied
(отклонено). Они могут содержать встроенный механизм проверки для любого из следующих типов согласия:
Тип согласия | Описание |
---|---|
ad_storage |
Разрешает сохранять данные (например, файлы cookie), связанные с рекламой. |
ad_user_data |
Устанавливает статус согласия на передачу в Google пользовательских данных, связанных с интернет-рекламой. |
ad_personalization |
Устанавливает статус согласия на персонализацию рекламы. |
analytics_storage |
Разрешает сохранять данные (например, файлы cookie), связанные с аналитикой, такие как продолжительность посещения. |
functionality_storage |
Разрешает сохранять данные, связанные с функциями сайта или приложения, например языковые настройки. |
personalization_storage |
Разрешает сохранять данные, связанные с персонализацией, например рекомендации видео. |
security_storage |
Разрешает сохранять данные, связанные с безопасностью, например аутентификацией, предотвращением мошенничества и другими способами защиты. |
Как создать шаблон согласия
Режим согласия отслеживает выбор посетителей, а проверки согласия обеспечивают правильное изменение поведения тегов. При создании шаблона согласия следуйте нашим рекомендациям:
Используйте API Менеджера тегов для режима согласия setDefaultConsentState и updateConsentState, а не
gtag consent
.Задайте статусы согласия по умолчанию сразу после запуска с помощью триггера Инициализация согласия – все страницы.
Затем CMP должна как можно скорее предложить посетителю разрешить или запретить сбор всех применимых типов данных.
Как только он это сделает, CMP должна передать обновленные статусы согласия.
1. Создайте шаблон
В нашей реализации одно из полей шаблона содержит статус согласия по умолчанию. Во время выполнения код реализации будет считывать его значение и задавать статус согласия по умолчанию. Команда обновления будет считывать из файла cookie информацию о выборе посетителя, сохраненную решением для управления согласием. Также вы настроите обратный вызов
updateConsentState
, чтобы учесть случаи, когда посетитель ещё не задал настройки согласия или решил их изменить.
Чтобы создать шаблон согласия, выполните следующие действия:
- Войдите в аккаунт Google Менеджера тегов.
- На панели навигации слева выберите Шаблоны.
- На панели Шаблоны тегов нажмите Создать.
Чтобы задать статусы согласия по умолчанию, выполните следующие действия:
- Откройте вкладку Поля и нажмите Добавить поле > Расширенная таблица.
- Измените название, указав
defaultSettings
. - Разверните поле.
- Измените Отображаемое название, указав
Default settings
. - Нажмите Добавить столбец, выберите Текстовое поле, укажите название
region
и установите флажок Проверять уникальность значений столбца. - Разверните столбец и измените отображаемое название, указав
Region (leave blank to have consent apply to all regions)
. Инструкции в скобках предназначены для пользователей вашего шаблона. Подробнее о том, как настроить согласие по умолчанию для разных регионов… - Нажмите Добавить столбец, выберите Текстовое поле и измените название, указав
granted
. - Разверните столбец и измените отображаемое название, указав
Granted Consent Types (comma separated)
. - Нажмите Добавить столбец, выберите Текстовое поле и измените название, указав
denied
. - Разверните столбец и измените отображаемое название, указав
Denied Consent Types (comma separated)
.
Чтобы добавить поддержку удаления рекламных данных (необязательно), выполните следующие действия:
- Нажмите Добавить поле, выберите Флажок и измените название поля, указав
ads_data_redaction
. - Измените отображаемое название, указав
Redact Ads Data
.
Подробнее о поведении файлов cookie при удалении рекламных данных…
Чтобы добавить поддержку передачи параметров URL (необязательно), выполните следующие действия:
- Нажмите Добавить поле, выберите Флажок и измените название поля, указав
url_passthrough
. - Измените отображаемое название, указав
Pass through URL parameters
.
Подробнее о том, как передавать параметры URL…
Чтобы добавить код реализации, выполните следующие действия:
- Откройте в редакторе шаблонов вкладку Код.
- В примере кода ниже измените поля с плейсхолдерами.
- Скопируйте код и замените им шаблонный код в редакторе тегов.
- Сохраните шаблон.
// The first two lines are optional, use if you want to enable logging
const log = require('logToConsole');
log('data =', data);
const setDefaultConsentState = require('setDefaultConsentState');
const updateConsentState = require('updateConsentState');
const getCookieValues = require('getCookieValues');
const callInWindow = require('callInWindow');
const gtagSet = require('gtagSet');
const COOKIE_NAME = 'Your_cookie_name';
/*
* Splits the input string using comma as a delimiter, returning an array of
* strings
*/
const splitInput = (input) => {
return input.split(',')
.map(entry => entry.trim())
.filter(entry => entry.length !== 0);
};
/*
* Processes a row of input from the default settings table, returning an object
* which can be passed as an argument to setDefaultConsentState
*/
const parseCommandData = (settings) => {
const regions = splitInput(settings['region']);
const granted = splitInput(settings['granted']);
const denied = splitInput(settings['denied']);
const commandData = {};
if (regions.length > 0) {
commandData.region = regions;
}
granted.forEach(entry => {
commandData[entry] = 'granted';
});
denied.forEach(entry => {
commandData[entry] = 'denied';
});
return commandData;
};
/*
* Called when consent changes. Assumes that consent object contains keys which
* directly correspond to Google consent types.
*/
const onUserConsent = (consent) => {
const consentModeStates = {
ad_storage: consent['adConsentGranted'] ? 'granted' : 'denied',
ad_user_data: consent['adUserDataConsentGranted'] ? 'granted' : 'denied',
ad_personalization: consent['adPersonalizationConsentGranted'] ? 'granted' : 'denied',
analytics_storage: consent['analyticsConsentGranted'] ? 'granted' : 'denied',
functionality_storage: consent['functionalityConsentGranted'] ? 'granted' : 'denied',
personalization_storage: consent['personalizationConsentGranted'] ? 'granted' : 'denied',
security_storage: consent['securityConsentGranted'] ? 'granted' : 'denied',
};
updateConsentState(consentModeStates);
};
/*
* Executes the default command, sets the developer ID, and sets up the consent
* update callback
*/
const main = (data) => {
/*
* Optional settings using gtagSet
*/
gtagSet('ads_data_redaction', data.ads_data_redaction);
gtagSet('url_passthrough', data.url_passthrough);
gtagSet('developer_id.your_developer_id', true);
// Set default consent state(s)
data.defaultSettings.forEach(settings => {
const defaultData = parseCommandData(settings);
// wait_for_update (ms) allows for time to receive visitor choices from the CMP
defaultData.wait_for_update = 500;
setDefaultConsentState(defaultData);
});
// Check if cookie is set and has values that correspond to Google consent
// types. If it does, run onUserConsent().
const settings = getCookieValues(COOKIE_NAME);
if (typeof settings !== 'undefined') {
onUserConsent(settings);
}
/**
* Add event listener to trigger update when consent changes
*
* References an external method on the window object which accepts a
* function as an argument. If you do not have such a method, you will need
* to create one before continuing. This method should add the function
* that is passed as an argument as a callback for an event emitted when
* the user updates their consent. The callback should be called with an
* object containing fields that correspond to the five built-in Google
* consent types.
*/
callInWindow('addConsentListenerExample', onUserConsent);
};
main(data);
data.gtmOnSuccess();
После этого настройте разрешения для доступа к статусам согласия и файлам cookie.
Чтобы добавить разрешения для управления статусом согласия, выполните следующие действия:
- Откройте вкладку Разрешения и выберите Доступ к статусу согласия.
- Нажмите Добавить тип согласия.
- Откройте раскрывающееся меню и выберите
ad_storage
. - Установите флажок Запись.
- Нажмите Добавить.
- Повторите шаги со второго по пятый для
ad_user_data
,ad_personalization
иanalytics_storage
. Если вам нужно больше типов согласия, добавьте их тем же способом. - Нажмите Сохранить.
Чтобы добавить разрешения на доступ к файлам cookie, выполните следующие действия:
- Откройте вкладку Разрешения и выберите Чтение значений файлов cookie.
- В разделе По выбору укажите названия всех файлов cookie, которые должны считываться кодом для получения информации о статусе согласия (по одному в строке).
- Нажмите Сохранить.
2. Создайте модульное тестирование
Подробнее том, как протестировать шаблон…
3. Интегрируйте шаблон с решением для управления согласием
В приведенном ниже примере показано, как интегрировать шаблон с кодом решения для управления запросами согласия, добавив прослушиватель:
// Array of callbacks to be executed when consent changes
const consentListeners = [];
/**
* Called from GTM template to set callback to be executed when user consent is provided.
* @param {function} Callback to execute on user consent
*/
window.addConsentListenerExample = (callback) => {
consentListeners.push(callback);
};
/**
* Called when user grants/denies consent.
* @param {Object} Object containing user consent settings.
*/
const onConsentChange = (consent) => {
consentListeners.forEach((callback) => {
callback(consent);
});
};
Как обновить статус согласия
После того как посетитель сайта выберет настройки в баннере с запросом согласия или аналогичном инструменте, код шаблона должен обновить статусы согласия с помощью API updateConsentState.
Ниже приведен пример вызова updateConsentState
для ситуации, когда посетитель дал согласие на хранение всех типов данных. Здесь снова значения granted
заданы в коде, но на практике они должны определяться во время выполнения на основе данных о согласии, полученных с помощью CMP.
const updateConsentState = require('updateConsentState');
updateConsentState({
'ad_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted',
'analytics_storage': 'granted',
'functionality_storage': 'granted',
'personalization_storage': 'granted',
'security_storage': 'granted'
});
Настройки с учетом региона
Чтобы установить статусы согласия по умолчанию для посетителей из определенного региона, необходимо указать его в шаблоне согласно стандарту ISO 3166-2. Это позволяет пользователям шаблона соблюдать местное законодательство, не упуская информацию о пользователях из других регионов. Если в команде setDefaultConsentState
регион не указан, то заданное значение статуса применяется ко всем остальным регионам.
Например, приведенный ниже код присваивает параметру analytics_storage
значение denied
для посетителей из Испании и с Аляски и задает для analytics_storage
значение granted
для других посетителей.
const setDefaultConsentState = require('setDefaultConsentState');
setDefaultConsentState({
'analytics_storage': 'denied',
'region': ['ES', 'US-AK']
});
setDefaultConsentState({
'analytics_storage': 'granted'
});
Команды с более детальным определением региона имеют приоритет
Если на одной странице заданы две команды для режима согласия с различающимися значениями для административно-территориальных единиц разного уровня, то будет применяться команда, которая более точно определяет местоположение пользователя. Например, если в одной команде для ad_storage
для региона US
задано значение 'granted'
, а в другой – для ad_storage
для региона US-CA
задано значение 'denied'
, то для посетителей из Калифорнии будет использоваться команда с более узким регионом (US-CA
).
Регион | ad_storage |
Алгоритм работы |
---|---|---|
US | 'granted' |
Применяется ко всем пользователям США, кроме тех, что находятся в Калифорнии. |
US-CA | 'denied' |
Применяется к пользователям из Калифорнии. |
Не указано | 'granted' |
Используется значение по умолчанию: 'granted' . В этом примере оно применяется к пользователям, которые находятся не в США и не в Калифорнии.
|
Дополнительные метаданные
Вы можете использовать gtagSet API, чтобы задать следующие необязательные параметры:
Эти API доступны только в изолированной среде шаблонов Менеджера тегов.
Передача данных о клике по объявлению, а также идентификаторов клиента и сеанса с помощью URL
Когда посетитель переходит на сайт по объявлению, информация об объявлении может быть добавлена в URL целевой страницы как параметр запроса. Чтобы вы получали максимально точные данные о конверсиях, теги Google обычно сохраняют эту информацию в собственных файлах cookie в домене рекламодателя.
Но если для ad_storage
задано значение denied
, эта информация не будет сохраняться локально. В таких случаях, чтобы повысить качество отслеживания, вы можете передавать сведения о клике на другие страницы через параметры URL, используя механизм сквозной передачи URL.
Аналогично, если для analytics_storage
задано значение denied, с помощью сквозной передачи URL можно собирать на страницах аналитические данные о событиях и сеансах (включая конверсии) без файлов cookie.
Для работы с этой функцией должны соблюдаться следующие условия:
- На странице есть теги Google, работающие с учетом согласия.
- Рекламодатель включил функцию сквозной передачи URL.
- На странице реализован режим согласия.
- Исходящая ссылка ведет на страницу в том же домене, что и текущая страница.
- В URL есть значения gclid/dclid (только для тегов Google Рекламы и Floodlight).
У пользователей вашего шаблона должна быть возможность включать и отключать эту настройку. В приведенном ниже примере для url_passthrough установлено значение true.
gtagSet('url_passthrough', true);
Удаление данных рекламы
Если согласие на хранение данных (ad_storage
) не предоставлено, перестают создаваться рекламные файлы cookie, а также не будут использоваться сторонние файлы cookie, ранее заданные для google.com и doubleclick.net. Данные, отправляемые в Google, будут по-прежнему содержать полный URL страницы, включая информацию о клике по объявлению в параметрах URL.
Чтобы удалить ещё больше данных рекламы, согласие ad_storage
отклонено, задайте для параметра ads_data_redaction
значение "true".
Если для ads_data_redaction
задано значение "true", а для ad_storage
– "denied", то идентификаторы клика по объявлению, переданные в сетевом запросе тегом Google Рекламы или Floodlight, удаляются.
gtagSet('ads_data_redaction', true);
Идентификатор разработчика
Если вы являетесь поставщиком CMP, которому компания Google присвоила идентификатор разработчика, укажите его на максимально раннем этапе с помощью следующего метода:
Идентификатор разработчика необходим, только если ваша реализация будет использоваться на сайтах не связанных друг с другом компаний. Если реализация предназначена только для одного сайта или организации, идентификатор разработчика запрашивать не нужно.
gtagSet('developer_id.<your_developer_id>', true);
Документация для пользователей
Пользователи будут с помощью вашего шаблона настраивать теги, собирающие согласие посетителей сайта. Опубликуйте документацию, в которой рассказывается:
- как задать статусы согласия по умолчанию в таблице настроек;
- как задать статусы согласия по умолчанию для разных регионов, добавив в таблицу строки;
- как активировать тег по триггеру Инициализация согласия – все страницы.
Дальнейшие действия
Если вы хотите, чтобы ваш шаблон был доступен всем пользователям Менеджера тегов, загрузите его в галерею общедоступных шаблонов.