Envoyer des données fournies par l'utilisateur à l'aide du protocole de mesure

Comme avec gtag, vous pouvez utiliser le protocole de mesure Google Analytics pour envoyer des données fournies par l'utilisateur avec l'ID utilisateur, ce qui peut vous aider à améliorer la mesure du comportement et des conversions.

Pour envoyer des données fournies par l'utilisateur avec une requête du protocole de mesure, ajoutez le paramètre user_data dans la charge utile JSON. Nous vous recommandons d'inclure également le paramètre user_id chaque fois que user_data est fourni. Cela permet de garantir une mesure et une fonctionnalité plus précises.

Le protocole de mesure utilise le même algorithme de normalisation et de hachage que la fonctionnalité de mesure améliorée de l'API Google Ads. Pour des raisons de confidentialité, les adresses e-mail, les numéros de téléphone, les prénoms, les noms, et les adresses postales doivent être hachés à l'aide de l'SHA-256 avant d'être importés. La valeur hachée doit être encodée au format de chaîne hexadécimale (objet de chaîne ne contenant que des chiffres hexadécimaux), par exemple 88d7ecb5c5b21d7b1.

Afin de standardiser les résultats du hachage, avant de hacher l'une de ces valeurs, vous devez :

  • Supprimer les espaces blancs de début et de fin.
  • Convertir le texte en minuscules.
  • Mettre en forme les numéros de téléphone conformément à la norme E164.
  • Supprimer tous les points (.) qui précèdent le nom de domaine des adresses e-mail gmail.com et googlemail.com.

Corps de la requête POST JSON

Clé Type Description
user_id (facultatif, mais recommandé) chaîne identifiant unique d'un utilisateur. Pour en savoir plus sur cet identifiant, consultez User ID pour l'analyse multiplate-forme.
user_data objet Champs de données utilisateur améliorés identifiant un utilisateur.
user_data.sha256_email_address[] tableau de chaînes Adresse e-mail hachée et encodée de l'utilisateur. Normalisée comme suit :
user_data.sha256_phone_number[] tableau de chaînes Numéro de téléphone haché et encodé de l'utilisateur. Normalisé comme suit :
  • supprimer tous les caractères qui ne sont pas des chiffres
  • ajouter le préfixe +
  • hacher à l'aide de l'algorithme SHA256
  • encoder au format de chaîne hexadécimale.
user_data.address[] tableau Identifie un utilisateur en fonction de son emplacement physique.
user_data.address[].sha256_first_name chaîne Prénom haché et encodé de l'utilisateur. Normalisé comme suit :
  • supprimer les chiffres et les symboles
  • lowercase
  • supprimer les espaces de début et de fin
  • hacher à l'aide de l'algorithme SHA256
  • encoder au format de chaîne hexadécimale.
user_data.address[].sha256_last_name chaîne Nom haché et encodé de l'utilisateur. Normalisé comme suit :
  • supprimer les chiffres et les symboles
  • lowercase
  • supprimer les espaces de début et de fin
  • hacher à l'aide de l'algorithme SHA256
  • encoder au format de chaîne hexadécimale.
user_data.address[].sha256_street chaîne Rue et numéro hachés et encodés de l'utilisateur. Normalisés comme suit :
  • supprimer les symboles
  • lowercase
  • supprimer les espaces de début et de fin
  • hacher à l'aide de l'algorithme SHA256
  • encoder au format de chaîne hexadécimale.
user_data.address[].city chaîne Ville de l'adresse de l'utilisateur. Normalisée comme suit :
  • supprimer les chiffres et les symboles
  • lowercase
  • supprimer les espaces de début et de fin.
user_data.address[].region chaîne État ou territoire de l'adresse de l'utilisateur. Normalisé comme suit :
  • supprimer les chiffres et les symboles
  • lowercase
  • supprimer les espaces de début et de fin.
user_data.address[].postal_code chaîne Code postal de l'adresse de l'utilisateur. Normalisé comme suit :
  • supprimer les caractères . et ~
  • supprimer les espaces de début et de fin.
user_data.address[].country chaîne Code pays de l'adresse de l'utilisateur. Mis en forme conformément à la norme ISO 3166-1 alpha-2.

Pour en savoir plus sur la mise en forme du transport et de la charge utile, consultez la documentation de référence du protocole de mesure.

Envoyer des données fournies par l'utilisateur

Contrairement à gtag, qui hache automatiquement les données sensibles fournies par l'utilisateur, le protocole de mesure exige qu'un développeur hache les données sensibles fournies par l'utilisateur à l'aide d'un algorithme de hachage sécurisé à sens unique appelé SHA256 et qu'il les encode au format de chaîne hexadécimale avant d'appeler l'API.

Tous les champs de données utilisateur dont le nom commence par le préfixe sha256 ne doivent être renseignés qu'avec des valeurs hachées et encodées en hexadécimal.

L'exemple de code suivant effectue les étapes de chiffrement et d'encodage nécessaires :

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 valueUtf8 = encoder.encode(value);
  // Compute the hash (digest) using the SHA-256 algorithm.
  const hashSha256 = await subtle.digest('SHA-256', valueUtf8);
  // Convert buffer to byte array.
  const hashArray = Array.from(new Uint8Array(hashSha256));
  // Return a hex-encoded string.
  return hashArray.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));

Pour plus de commodité, tous les champs répétés de l'objet user_data (tels que address, sha256_email_address, sha256_phone_number) peuvent recevoir une valeur unique au lieu d'un tableau.

L'exemple de code suivant appelle le protocole de mesure et transmet les données utilisateur avec l'ID utilisateur.

Node.js

const measurementId = "MEASUREMENT_ID";
const apiSecret = "API_SECRET";

// 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=${measurementId}&api_secret=${apiSecret}`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    client_id: "CLIENT_ID",
    user_id: "USER_ID",
    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
      }
    }
  })
});

Plusieurs valeurs

Les développeurs peuvent éventuellement fournir plusieurs valeurs (jusqu'à trois pour les numéros de téléphone et les adresses e-mail, et deux pour l'adresse) en utilisant une valeur de tableau plutôt qu'une chaîne. Si vous capturez plusieurs valeurs, vous augmenterez la probabilité d'une correspondance en les fournissant toutes.

Node.js

const measurementId = "MEASUREMENT_ID";
const apiSecret = "API_SECRET";

fetch(`https://www.google-analytics.com/mp/collect?measurement_id=${measurementId}&api_secret=${apiSecret}`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    client_id: "CLIENT_ID",
    user_id: "USER_ID",
    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
      }]
    }
  })
});