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

Если вы обеспечиваете поддержку решения для запросов согласия на сайтах, где используется Google Менеджер тегов, мы настоятельно рекомендуем вам создать шаблон режима согласия. Благодаря этому ваши пользователи смогут реализовать режим согласия и интегрировать его с решением для запросов согласия, не изменяя код. Это сэкономит много времени и усилий.

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

Созданный шаблон можно использовать для внутренних целей или опубликовать в галерее. Если поставщик платформы для запросов согласия (CMP) предлагает шаблоны режима согласия, мы можем указать его в нашей документации и добавить его шаблоны в галерею.

В этой статье рассказывается о статусе и типах согласия, а также о том, как их использовать с Consent Mode API. В последнем разделе вы найдете пример создания шаблона в Менеджере тегов с помощью API. Если вы раньше не работали с режимом согласия или шаблонами Менеджера тегов, прочитайте следующие статьи:

Теги Google и сторонние теги, собирающие данные, меняют свое поведение в зависимости от статуса согласия (granted или denied). Они могут содержать встроенный механизм проверки для любого из следующих типов согласия:

Тип согласия Описание
ad_storage Разрешить сохранять данные (например, в файлах cookie), связанные с рекламой.
analytics_storage Разрешить сохранять данные (например, в файлах cookie), связанные с аналитикой, такие как продолжительность посещения.
functionality_storage Разрешить сохранять данные, связанные с функциями сайта или приложения, например языковые настройки.
personalization_storage Разрешить сохранять данные, связанные с персонализацией, например рекомендации видео.
security_storage Разрешить сохранять данные, связанные с обеспечением безопасности, например аутентификацией, предотвращением мошенничества и другими способами защиты.

Шаблон должен давать вашим пользователям возможность установить статус по умолчанию для каждого типа согласия, настроенного на сайте. Также у них может возникнуть необходимость задать разные статусы по умолчанию для различных регионов.

Пользователи Менеджера тегов должны активировать теги, созданные на основе вашего шаблона, на всех страницах с помощью триггера инициализации согласия. Это обеспечит их активацию раньше остальных тегов. Сразу после активации код шаблона должен установить настроенные статусы согласия по умолчанию. Затем CMP должна как можно скорее предложить посетителю разрешить или запретить сбор всех применимых типов данных. Как только он это сделает, CMP должна передать обновленные статусы согласия с помощью подходящего API шаблона. Режим согласия отслеживает выбор посетителей, а проверки согласия обеспечивают правильное изменение поведения тегов.

При реализации режима согласия на сайтах, использующих Менеджер тегов, управление статусами согласия должно осуществляться с помощью подходящих API: setDefaultConsentState и updateConsentState. Также может использоваться API gtagSet, позволяющий задавать параметры ads_data_redaction и url_passthrough. Эти API доступны только в изолированной среде шаблонов Менеджера тегов.

Статус согласия по умолчанию должен задаваться как можно раньше после загрузки страницы. При этом тег активируется событием инициализации согласия. Новые данные о согласии должны быть переданы в Менеджер тегов как можно скорее после того, как пользователь сделает выбор или загрузятся данные из файла cookie. Активировать updateConsentState можно разными способами. В приведенном ниже примере вы найдете два из них.

С помощью API setDefaultConsentState можно задать настройки согласия, которые будут использоваться по умолчанию. В приведенном ниже примере показан вызов setDefaultConsentState, по умолчанию запрещающий ad_storage и разрешающий остальные типы хранения данных. Также в нем используется параметр wait_for_update, который позволяет выделить время на получение от CMP выбранных посетителем настроек.

const setDefaultConsentState = require('setDefaultConsentState');

setDefaultConsentState({
  'ad_storage': 'denied',
  'analytics_storage': 'granted',
  'functionality_storage': 'granted',
  'personalization_storage': 'granted',
  'security_storage': 'granted',
  'wait_for_update': 500
});

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

Ниже приведен пример вызова updateConsentState для ситуации, когда посетитель дал согласие на хранение всех типов данных. Здесь снова значения granted заданы в коде, но на практике они должны определяться во время выполнения на основе данных о согласии, полученных с помощью CMP.

const updateConsentState = require('updateConsentState');

updateConsentState({
  'ad_storage': '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'. В этом примере оно применяется к пользователям, которые находятся не в США и не в Калифорнии.

Передача данных о клике по объявлению, а также идентификаторов клиента и сеанса с помощью URL

Когда посетитель переходит на сайт по объявлению, информация об объявлении может быть добавлена в URL целевой страницы как параметр запроса. Чтобы вы получали максимально точные данные о конверсиях, теги Google обычно сохраняют эту информацию в собственных файлах cookie в домене рекламодателя.

Однако если для ad_storage задано значение denied, теги Google не сохранят информацию о клике по объявлению локально. В таких случаях, чтобы повысить качество отслеживания, вы можете передавать сведения о клике на другие страницы через параметры URL, используя механизм сквозной передачи URL.

Аналогично, если для analytics_storage задано значение denied, с помощью сквозной передачи URL можно собирать на страницах аналитические данные о событиях и сеансах (включая конверсии) без файлов cookie.

Для работы с этой функцией должны соблюдаться следующие условия:

  • На странице есть теги Google, работающие с учетом согласия.
  • Рекламодатель включил функцию сквозной передачи URL.
  • На странице реализован режим согласия.
  • Исходящая ссылка ведет на страницу в том же домене, что и текущая страница.
  • В URL есть значения gclid/dclid (только для тегов Google Рекламы и Floodlight).

У пользователей вашего шаблона должна быть возможность включать и отключать эту настройку. В приведенном ниже примере для url_passthrough установлено значение true.

gtagSet('url_passthrough', true);

Удаление данных рекламы

Если для ad_storage задано значение denied, то при показе рекламы файлы cookie создаваться не будут, а также не будут использоваться сторонние файлы cookie, ранее установленные для google.com и doubleclick.net. Данные, отправляемые в Google, будут по-прежнему содержать полный URL страницы, включая информацию о клике по объявлению в параметрах URL.

Вы можете настроить удаление данных рекламы в случаях, когда для ad_storage задано значение denied, присвоив параметру ads_data_redaction значение true.

gtagSet('ads_data_redaction', true);

Если параметру ads_data_redaction присвоено значение true, а параметру ad_storage – denied, то идентификаторы клика по объявлению, переданные в сетевом запросе тегом Google Рекламы или Floodlight, удаляются.

Идентификатор разработчика

Если вы являетесь поставщиком CMP, которому компания Google присвоила идентификатор разработчика, укажите его на максимально раннем этапе с помощью следующего метода:

gtagSet('developer_id.<your_developer_id>', true);

Пример реализации

В приведенном ниже примере показано, как создать шаблон, позволяющий считывать файлы cookie платформы для запросов согласия и получать информацию о выборе посетителя. Такой механизм обеспечивает передачу статусов согласия в Менеджер тегов на максимально раннем этапе загрузки страницы, открытой после той, на которой посетитель сделал выбор.

Следуя этому примеру, вы создадите в шаблоне одно поле для хранения статуса согласия по умолчанию. Во время выполнения код реализации будет считывать его значение и задавать статус согласия по умолчанию. Команда обновления будет считывать из файла cookie информацию о выборе посетителя, сохраненную платформой для запросов согласия. Также вы настроите обратный вызов для updateConsentState, чтобы учесть случаи, когда посетитель ещё не выбрал настройки согласия или решил их изменить.

Основные этапы:

Создание шаблона с помощью редактора

  1. Войдите в аккаунт Google Менеджера тегов.
  2. На панели навигации слева выберите Шаблоны.
  3. На панели Шаблоны тегов нажмите Создать.

Добавление полей

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

Добавление кода

Скопируйте приведенный ниже код и замените параметры в скобках (для названия файла cookie и проверки обновленного статуса согласия) подходящими для вашей реализации. Затем добавьте этот код на вкладку Код в Менеджере тегов вместо шаблонного кода. Сохраните шаблон.

// 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 = '<replace_with_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',
    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
 * 
 * Note: Developer IDs are only required when you're building an implementation
 * that will be used across multiple websites by unrelated companies or
 * entities. If the implementation will be used by one site or entity,
 * please do not apply for a developer ID.
 */
const main = (data) => {
  // Set developer ID
  gtagSet('developer_id.<replace_with_your_developer_id>', true);
  // Set default consent state(s)
  data.defaultSettings.forEach(settings => {
    const defaultData = parseCommandData(settings);
    defaultData.wait_for_update = 500;
    setDefaultConsentState(defaultData);
  });
  gtagSet('ads_data_redaction', data.ads_data_redaction);
  // Check if cookie is set and has values that corresopnd 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. Нажмите Добавить.

Повторите шаги со второго по пятый, указав analytics_storage вместо ad_storage.

Нажмите Сохранить.

Для файлов cookie

  1. Откройте вкладку Разрешения и выберите Чтение значений файлов cookie.
  2. В разделе По выбору укажите названия всех файлов cookie, которые должны считываться кодом для получения информации о статусе согласия (по одному в строке).
  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);
  });
};

Настройка шаблона пользователями

Предоставьте пользователям шаблона всю необходимую документацию. В теге, созданном на его основе, будет использоваться триггер Инициализация согласия – Все страницы. В таблице Настройки пользователи должны будут перечислить типы согласия и указать для каждого из них статус по умолчанию. Если эта настройка зависит от региона, в котором находится пользователь, нужно будет также создать строку для каждого набора регионов с одинаковым статусом согласия по умолчанию.