Отправить данные, предоставленные пользователями, с User-ID с помощью Measurement Protocol

Подобно тому, как это делалось с использованием глобального тега, предоставленные пользователями данные вместе с User-ID можно отправлять с помощью Measurement Protocol для Google Аналитики 4, что позволяет усовершенствовать ваш сайт и отслеживание конверсий.

Чтобы отправлять предоставленные пользователями данные вместе с запросом Measurement Protocol, добавьте в полезную нагрузку JSON параметр user_data. И учтите, что, задавая параметр user_data, необходимо также указать параметр user_id.

В Measurement Protocol используется тот же алгоритм нормализации и хеширования, что и в функции улучшенной статистики Google Ads API. Чтобы сохранить конфиденциальность данных, адреса электронной почты, имена, фамилии и адреса перед загрузкой необходимо хешировать, используя алгоритм SHA-256. Хешированное значение следует преобразовать в шестнадцатеричный строковый формат (то есть, в строковый объект, содержащий только шестнадцатеричные цифры), например: 88d7ecb5c5b21d7b1.

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

  • удалить начальные и конечные пробелы;
  • преобразовать текст в нижний регистр;
  • отформатировать номера телефонов по стандарту E164;
  • удалить все точки (.), предшествующие доменному имени, в адресах электронной почты, оканчивающихся на gmail.com и googlemail.com.

Тело запроса POST в формате JSON

Ключ Тип Описание
user_id Строка Уникальный идентификатор пользователя. Подробности см. в статье Как отслеживать действия на разных платформах с помощью функции User-ID.
user_data Объект Усовершенствованные поля пользовательских данных, идентифицирующих пользователя.
user_data.sha256_email_address[] Массив строк Хешированный и закодированный адрес электронной почты пользователя. Нормализован следующим образом:
user_data.sha256_phone_number[] Массив строк Хешированный и закодированный номер телефона пользователя. Нормализован следующим образом:
  • удалены все цифровые символы;
  • добавлен префикс +;
  • хеширован по алгоритму SHA256;
  • преобразован в шестнадцатеричный строковый формат.
user_data.address[] Массив Идентифицирует пользователя на основе физического местоположения.
user_data.address[].sha256_first_name Строка Хешированное и закодированное имя пользователя. Нормализовано следующим образом:
  • удалены цифры и символы, не являющиеся буквенно-цифровыми;
  • переведено в нижний регистр;
  • удалены начальные и конечные пробелы;
  • хешировано по алгоритму SHA256;
  • преобразовано в шестнадцатеричный строковый формат.
user_data.address[].sha256_last_name Строка Хешированная и закодированная фамилия пользователя. Нормализована следующим образом:
  • удалены цифры и символы, не являющиеся буквенно-цифровыми;
  • переведена в нижний регистр;
  • удалены начальные и конечные пробелы;
  • хеширована по алгоритму SHA256;
  • преобразована в шестнадцатеричный строковый формат.
user_data.address[].sha256_street Строка Хешированный и закодированный адрес (улица, дом, квартира) пользователя. Нормализован следующим образом:
  • удалены символы, не являющиеся буквенно-цифровыми;
  • переведен в нижний регистр;
  • удалены начальные и конечные пробелы;
  • хеширован по алгоритму SHA256;
  • преобразован в шестнадцатеричный строковый формат.
user_data.address[].city Строка Название города, в котором живет пользователь. Нормализовано следующим образом:
  • удалены цифры и символы, не являющиеся буквенно-цифровыми;
  • переведено в нижний регистр;
  • удалены начальные и конечные пробелы.
user_data.address[].region Строка Название региона, в котором живет пользователь. Нормализовано следующим образом:
  • удалены цифры и символы, не являющиеся буквенно-цифровыми;
  • переведено в нижний регистр;
  • удалены начальные и конечные пробелы.
user_data.address[].postal_code Строка Почтовый индекс пользователя. Нормализован следующим образом:
  • удалены символы "." и "~";
  • удалены начальные и конечные пробелы.
user_data.address[].country Строка Код страны пользователя. Отформатирован по стандарту ISO 3166-1 alpha-2.

Подробные сведения о том, как форматируются транспортные данные и полезная нагрузка, приведены в справочной документации по Measurement Protocol.

Как отправить данные, предоставленные пользователями

Если при использовании глобального тега предоставленные пользователями конфиденциальные данные хешируются автоматически, то при работе с Measurement Protocol необходимо, чтобы перед вызовом API разработчик обеспечил хеширование таких данных с использованием защищенного однонаправленного алгоритма SHA256 и их последующее преобразование в шестнадцатеричный строковый формат.

Значения всех полей пользовательских данных, названия которых начинаются с префикса sha256, должны быть хешированы и преобразованы в шестнадцатеричный строковый формат.

Программный код, приведенный в следующем примере, выполняет необходимое шифрование и кодирование:

Node.js

const { subtle } = require('crypto').webcrypto;

async function populateSensitiveUserData(value) {
  const encoder = new TextEncoder();
  // Convert a string value to UTF-8 encoded text.
  const value_utf8 = encoder.encode(value);
  // Compute the hash (digest) using the SHA-256 algorithm.
  const hash_sha256 = await subtle.digest('SHA-256', value_utf8);
  // Convert buffer to byte array.
  const hash_array = Array.from(new Uint8Array(hash_sha256));
  // Return a hex-encoded string.
  return hash_array.map(b => b.toString(16).padStart(2, "0")).join('');
};

// Test the encryption function by calling it.
async function main() {
  return await populateSensitiveUserData('<value>');
}

main()
  .then(v => console.log(v))
  .catch(err => console.error(err));

Чтобы упростить вызов, во все повторяющиеся поля объекта user_data (такие как address, sha256_email_address, sha256_phone_number) вместо массива можно передать единственное значение.

В следующем примере кода вызывается Measurement Protocol и передаются пользовательские данные вместе с User-ID.

Node.js

const measurement_id = 'G-XXXXXXXXXX';
const api_secret = '<secret_value>';

// Populate mock User Data using the `populateSensitiveUserData` function defined
// above.
const yourEmailSha256Variable = await populateSensitiveUserData('test@yourdomain.com');
const yourPhoneSha256Variable  = await populateSensitiveUserData('+15555555555');
const yourFirstNameSha256Variable  = await populateSensitiveUserData('john');
const yourLastNameSha256Variable  = await populateSensitiveUserData('doe');
const yourStreetAddressSha256Variable  = await populateSensitiveUserData('123 main street');

// Populate mock unencrypted user data.
const yourCityVariable = 'san francisco';
const yourRegionVariable = 'california';
const yourPostalCodeVariable = '94000';
const yourCountryVariable = 'US';

fetch(`https://www.google-analytics.com/mp/collect?measurement_id=${measurement_id}&api_secret=${api_secret}`, {
  method: "POST",
  body: JSON.stringify({
    client_id: 'XXXXXXXXXX.YYYYYYYYYY',
    user_id: "XXX",
    events: [{
      name: 'purchase'
    }],
    user_data: {
      sha256_email_address: yourEmailSha256Variable,
      sha256_phone_number: yourPhoneSha256Variable,
      address: {
        sha256_first_name: yourFirstNameSha256Variable,
        sha256_last_name: yourLastNameSha256Variable,
        sha256_street: yourStreetAddressSha256Variable,
        city: yourCityVariable,
        region: yourRegionVariable,
        postal_code: yourPostalCodeVariable,
        country: yourCountryVariable
      }
    }
  })
});

Несколько значений

При необходимости разработчики могут передавать несколько значений (до трех номеров телефона и адресов электронной почты и до двух адресов), используя массив вместо строки. Если вы получаете более одного значения, передавайте их все, чтобы повысить вероятность успешного сопоставления.

Node.js

const measurement_id = 'G-XXXXXXXXXX';
const api_secret = '<secret_value>';

fetch(`https://www.google-analytics.com/mp/collect?measurement_id=${measurement_id}&api_secret=${api_secret}`, {
  method: "POST",
  body: JSON.stringify({
    client_id: 'XXXXXXXXXX.YYYYYYYYYY',
    user_id: "XXX",
    events: [{
      name: 'purchase'
    }],
    user_data: {
      sha256_email_address: [yourEmailSha256Variable1, yourEmailSha256Variable2],
      sha256_phone_number: [yourPhoneSha256Variable1, yourPhoneSha256Variable2],
      address: [{
        sha256_first_name: yourFirstNameSha256Variable1,
        sha256_last_name: yourLastNameSha256Variable1,
        sha256_street: yourStreetAddressSha256Variable1,
        city: yourCityVariable1,
        region: yourRegionVariable1,
        postal_code: yourPostalCodeVariable1,
        country: yourCountryVariable1
      },{
        sha256_first_name: yourFirstNameSha256Variable2,
        sha256_last_name: yourLastNameSha256Variable2,
        sha256_street: yourStreetAddressSha256Variable2,
        city: yourCityVariable2,
        region: yourRegionVariable2,
        postal_code: yourPostalCodeVariable2,
        country: yourCountryVariable2
      }]
    }
  })
});