Measurement Protocol を使用してユーザー提供データと User-ID を送信する

gtag を使用する場合と同様に、Google アナリティクス 4 向けの Google アナリティクス Measurement Protocol を使用してユーザー提供データと User-ID を送信し、行動とコンバージョンの測定を強化することができます。

Measurement Protocol リクエストと併せてユーザー提供データを送信するには、JSON ペイロードに user_data パラメータを追加します。user_data を指定する場合は、user_id パラメータも指定する必要があります。

Measurement Protocol では、Google Ads API の拡張計測機能と同じ正規化とハッシュ化のアルゴリズムが使用されています。個人情報保護の観点から、メールアドレス、電話番号、姓、名、番地は、アップロードする前に SHA-256 アルゴリズムでハッシュ化する必要があります。ハッシュ値は 88d7ecb5c5b21d7b1 のような16 進文字列形式(16 進数のみを含む文字列オブジェクト)でエンコードする必要があります。

ハッシュ結果を標準化するには、こうした値をハッシュ化する前に次の作業が必要です。

  • 先頭と末尾の空白文字を削除する。
  • テキストを小文字に変換する。
  • 電話番号を E164 規格の形式にする。
  • gmail.comgooglemail.com のメールアドレスのドメイン名の前にあるすべてのピリオド(.)を削除する。

JSON POST 本文

キー 説明
user_id 文字列 ユーザーの一意の識別子。この識別子について詳しくは、User-ID によるクロスプラットフォーム分析をご覧ください。
user_data オブジェクト ユーザーを識別する、拡張されたユーザーデータ フィールド。
user_data.sha256_email_address[] 文字列配列 ハッシュ化およびエンコードされたユーザーのメールアドレス。次のように正規化されます。
user_data.sha256_phone_number[] 文字列配列 ハッシュ化およびエンコードされたユーザーの電話番号。次のように正規化されます。
  • 数字以外のすべての文字を削除
  • + 接頭辞を追加
  • SHA256 アルゴリズムを使用してハッシュ化
  • 16 進文字列形式でエンコード
user_data.address[] 配列 物理的な現在地に基づいてユーザーを識別します。
user_data.address[].sha256_first_name 文字列 ハッシュ化およびエンコードされたユーザーの名。 次のように正規化されます。
  • 数字と記号を削除
  • 小文字
  • 先頭と末尾のスペースを削除
  • SHA256 アルゴリズムを使用してハッシュ化
  • 16 進文字列形式でエンコード
user_data.address[].sha256_last_name 文字列 ハッシュ化およびエンコードされたユーザーの姓。 次のように正規化されます。
  • 数字と記号を削除
  • 小文字
  • 先頭と末尾のスペースを削除
  • SHA256 アルゴリズムを使用してハッシュ化
  • 16 進文字列形式でエンコード
user_data.address[].sha256_street 文字列 ハッシュ化およびエンコードされたユーザーの住所の番地。 次のように正規化されます。
  • 記号を削除
  • 小文字
  • 先頭と末尾のスペースを削除
  • SHA256 アルゴリズムを使用してハッシュ化
  • 16 進文字列形式でエンコード
user_data.address[].city 文字列 ユーザーの住所の市区町村。 次のように正規化されます。
  • 数字と記号を削除
  • 小文字
  • 先頭と末尾のスペースを削除
user_data.address[].region 文字列 ユーザーの住所の都道府県。 次のように正規化されます。
  • 数字と記号を削除
  • 小文字
  • 先頭と末尾のスペースを削除
user_data.address[].postal_code 文字列 ユーザーの住所の郵便番号。 次のように正規化されます。
  • .~ を削除
  • 先頭と末尾のスペースを削除
user_data.address[].country 文字列 ユーザーの住所の国コード。ISO 3166-1 alpha-2 標準の形式を使用します。

トランスポートとペイロードの形式設定について詳しくは、Measurement Protocol のリファレンス ドキュメントをご覧ください。

ユーザー提供データを送信する

センシティブなユーザー提供データを自動的にハッシュ化する gtag とは異なり、Measurement Protocol では、デベロッパーは API を呼び出す前に SHA256 と呼ばれる安全な一方向のハッシュ化アルゴリズムを使用してセンシティブなユーザー提供データをハッシュ化し、16 進文字列形式でエンコードする必要があります。

名前が sha256 接頭辞で始まるすべてのユーザーデータ フィールドには、ハッシュ化された値と 16 進数でエンコードされた値のみ入力する必要があります。

次のコード例は、必要な暗号化とエンコードの手順を示しています。

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 オブジェクト内のすべての繰り返しフィールド(addresssha256_email_addresssha256_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
      }
    }
  })
});

複数の値

デベロッパーは、必要に応じて文字列ではなく配列値を使用して、複数の値を指定することができます(電話番号とメールは最大 3 個、住所は最大 2 個)。複数の値をキャプチャすると、一致の可能性が高くなります。

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
      }]
    }
  })
});