Как создать шаблон режима согласия

Эта статья предназначена для разработчиков, которые поддерживают решение для управления запросами согласия на сайтах, на которых используется 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, чтобы учесть случаи, когда посетитель ещё не задал настройки согласия или решил их изменить.

  1. Войдите в аккаунт Google Менеджера тегов.
  2. На панели навигации слева выберите Шаблоны.
  3. На панели Шаблоны тегов нажмите Создать.
  1. Откройте вкладку Поля и нажмите Добавить поле > Расширенная таблица.
  2. Измените название, указав defaultSettings.
  3. Разверните поле.
  4. Измените Отображаемое название, указав Default settings.
  5. Нажмите Добавить столбец, выберите Текстовое поле, укажите название region и установите флажок Проверять уникальность значений столбца.
  6. Разверните столбец и измените отображаемое название, указав Region (leave blank to have consent apply to all regions). Инструкции в скобках предназначены для пользователей вашего шаблона. Подробнее о том, как настроить согласие по умолчанию для разных регионов
  7. Нажмите Добавить столбец, выберите Текстовое поле и измените название, указав granted.
  8. Разверните столбец и измените отображаемое название, указав Granted Consent Types (comma separated).
  9. Нажмите Добавить столбец, выберите Текстовое поле и измените название, указав denied.
  10. Разверните столбец и измените отображаемое название, указав Denied Consent Types (comma separated).

Чтобы добавить поддержку удаления рекламных данных (необязательно), выполните следующие действия:

  1. Нажмите Добавить поле, выберите Флажок и измените название поля, указав ads_data_redaction.
  2. Измените отображаемое название, указав Redact Ads Data.

Подробнее о поведении файлов cookie при удалении рекламных данных

Чтобы добавить поддержку передачи параметров URL (необязательно), выполните следующие действия:

  1. Нажмите Добавить поле, выберите Флажок и измените название поля, указав url_passthrough.
  2. Измените отображаемое название, указав Pass through URL parameters.

Подробнее о том, как передавать параметры URL

Чтобы добавить код реализации, выполните следующие действия:

  1. Откройте в редакторе шаблонов вкладку Код.
  2. В примере кода ниже измените поля с плейсхолдерами.
  3. Скопируйте код и замените им шаблонный код в редакторе тегов.
  4. Сохраните шаблон.
// 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.

  1. Откройте вкладку Разрешения и выберите Доступ к статусу согласия.
  2. Нажмите Добавить тип согласия.
  3. Откройте раскрывающееся меню и выберите ad_storage.
  4. Установите флажок Запись.
  5. Нажмите Добавить.
  6. Повторите шаги со второго по пятый для ad_user_data, ad_personalization и analytics_storage. Если вам нужно больше типов согласия, добавьте их тем же способом.
  7. Нажмите Сохранить.

Чтобы добавить разрешения на доступ к файлам cookie, выполните следующие действия:

  1. Откройте вкладку Разрешения и выберите Чтение значений файлов cookie.
  2. В разделе По выбору укажите названия всех файлов cookie, которые должны считываться кодом для получения информации о статусе согласия (по одному в строке).
  3. Нажмите Сохранить.

2. Создайте модульное тестирование

Подробнее том, как протестировать шаблон

В приведенном ниже примере показано, как интегрировать шаблон с кодом решения для управления запросами согласия, добавив прослушиватель:

// 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);

Документация для пользователей

Пользователи будут с помощью вашего шаблона настраивать теги, собирающие согласие посетителей сайта. Опубликуйте документацию, в которой рассказывается:

  • как задать статусы согласия по умолчанию в таблице настроек;
  • как задать статусы согласия по умолчанию для разных регионов, добавив в таблицу строки;
  • как активировать тег по триггеру Инициализация согласия – все страницы.

Дальнейшие действия

Если вы хотите, чтобы ваш шаблон был доступен всем пользователям Менеджера тегов, загрузите его в галерею общедоступных шаблонов.