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

Функция сопоставления предоставленных пользователем данных (UPDM) объединяет собственные данные, собранные вами о пользователе — например, информацию с ваших веб-сайтов, приложений или физических магазинов — с данными об активности этого же пользователя в системе Google Ads , включая данные, принадлежащие и управляемые Google. Это включает данные, приобретенные через продукты Google Marketing Platform (GMP), например, данные YouTube, приобретенные с помощью Display & Video 360. Другие продукты GMP, не принадлежащие и не управляемые Google, не поддерживаются.

Для того чтобы сопоставить данные, предоставленные пользователем, с рекламным событием , оно должно быть связано с авторизованным пользователем в базе данных рекламы Google.

В этом документе описывается функция сопоставления данных, предоставляемых пользователем, и приводятся рекомендации по настройке и использованию.

Обзор соответствия частных облачных решений

Получение ценных аналитических данных о рекламе часто требует объединения данных из множества источников. Создание собственного решения для этой задачи обработки данных требует значительных временных и инженерных затрат. Private Cloud Match в Ads Data Hub упрощает этот процесс, предоставляя шаблон запроса Ads Data Hub для создания таблицы соответствия в BigQuery, которую затем можно использовать в запросах Ads Data Hub для сопоставления данных о рекламе с вашими собственными данными. Обогащение запросов собственными данными может обеспечить более качественный пользовательский опыт и более устойчиво к общеотраслевым изменениям в отслеживании рекламы.

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

Краткое описание процесса

  1. Настройка процесса ввода и сопоставления данных.
  2. Сбор и сопоставление данных от первого лица
    • Вы форматируете и загружаете свои собственные данные в набор данных BigQuery.
    • Запрос на сопоставление данных инициируется путем создания аналитического запроса Private Cloud Match и установки расписания.
    • Google объединяет данные вашего проекта с данными, принадлежащими Google и содержащими идентификатор пользователя Google, а также хешированные данные, предоставленные пользователем, для создания и обновления таблиц соответствия.
    • См. раздел «Ввод собственных данных».
  3. Текущие запросы в Центре данных рекламы, основанные на сопоставленных данных.

Узнайте о требованиях к обеспечению конфиденциальности.

Сбор данных о клиентах

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

Вы должны:

  • Убедитесь, что ваша политика конфиденциальности раскрывает информацию о том, что вы передаете данные клиентов третьим сторонам для оказания услуг от вашего имени, и что вы получаете согласие на такую ​​передачу в случаях, когда это требуется по закону.
  • Для загрузки данных клиентов используйте только одобренные Google API или интерфейсы.
  • Соблюдайте все применимые законы и правила , включая любые нормативные акты саморегулирования или отраслевые кодексы, которые могут применяться.

Подтверждение согласия первой стороны

Чтобы обеспечить возможность использования ваших собственных данных в Ads Data Hub, вы должны подтвердить получение надлежащего согласия на передачу данных от конечных пользователей из ЕЭЗ компании Google в соответствии с политикой согласия пользователей ЕС и политикой Ads Data Hub . Это требование распространяется на каждый аккаунт Ads Data Hub и должно обновляться каждый раз при загрузке новых собственных данных. Любой пользователь может подтвердить это от имени всего аккаунта.

Обратите внимание, что те же правила запросов к сервисам Google, которые применяются к аналитическим запросам, также применяются к запросам UPDM. Например, вы не можете выполнять межсервисные запросы к пользователям в ЕЭЗ при создании таблицы соответствия.

Чтобы узнать, как подтвердить согласие в Ads Data Hub, см. раздел «Требования к согласию для Европейской экономической зоны» .

Размер данных

Для защиты конфиденциальности конечных пользователей сопоставление предоставленных пользователем данных устанавливает следующие требования к объему ваших данных:

  • Вам необходимо загрузить не менее 1000 записей в свой список пользователей.

Настройка приема данных

Перед началом убедитесь в следующем:

  • Ваши собственные данные должны храниться в BigQuery. Если у вас периметр VPC-SC, эти собственные данные должны располагаться внутри вашего VPC-SC.
  • У вашей учетной записи сервиса Ads Data Hub должен быть доступ для чтения к данным из первых рук.
  • Ваши собственные данные должны быть правильно отформатированы и хешированы. Подробнее см. в следующем разделе.

Помимо этого, для Private Cloud Match не требуется дополнительная регистрация. Если вы можете выполнить аналитический запрос, вы можете выполнить запрос Private Cloud Match.

Загрузка и сопоставление данных из первых рук.

Форматирование данных для ввода

Для корректного сопоставления ваши данные должны соответствовать следующим требованиям к форматированию:

  • В тех случаях, когда это указано в описаниях полей ввода ниже, загрузка должна осуществляться с использованием хеширования SHA256.
  • Поля ввода должны быть отформатированы как строки. Например, если вы используете хеш-функцию SHA256 в BigQuery с функцией кодирования Base64 ( TO_BASE64 ), используйте следующее преобразование: TO_BASE64(SHA256(user_data)) .
  • UPDM поддерживает кодирование Base64. Необходимо согласовать кодирование ваших собственных данных с декодированием, используемым в запросе Ads Data Hub. Если вы измените кодирование ваших собственных данных, необходимо обновить запрос Ads Data Hub, чтобы декодирование производилось из того же базового кода. В следующих примерах используется кодирование Base64.

ID пользователя

  • Простой текст
  • Хэширование: отсутствует

Электронная почта

  • Удалите пробелы в начале и конце текста.
  • Все символы написаны строчными буквами.
  • Укажите доменное имя для всех адресов электронной почты, например, gmail.com или hotmail.co.jp.
  • Удалите диакритические знаки — например, замените è, é, ê или ë на e.
  • Удалите все точки (.) перед доменным именем в адресах электронной почты gmail.com и googlemail.com
  • Хэширование: SHA256, закодированное в Base64.

Действительный код: TO_BASE64(SHA256("jeffersonloveshiking@gmail.com"))

Неверный код: TO_BASE64(SHA256(" Jéfferson.Lôves.Hiking@gmail.com "))

Телефон

  • Удалите пробелы
  • Формат E.164 — пример для США: +14155552671, пример для Великобритании: +442071838750
  • Удалите все специальные символы, кроме знака «+», перед кодом страны.
  • Хэширование: SHA256, закодированное в Base64.

Действительный код: TO_BASE64(SHA256("+18005550101"))

Недопустимо: TO_BASE64(SHA256("(800) 555-0101"))

Имя

  • Удалите пробелы
  • Все символы написаны строчными буквами.
  • Удалите все префиксы, например, Mrs., Mr., Ms., Dr.
  • Не удаляйте диакритические знаки — например, è, é, ê или ë.
  • Хэширование: SHA256, закодированное в Base64.

Допустимо: TO_BASE64(SHA256("daní"))

Неверно: TO_BASE64(SHA256("Mrs. Daní"))

Фамилия

  • Удалите пробелы
  • Все символы написаны строчными буквами.
  • Удалите все суффиксы, например младший, старший, 2-й, 3-й, II, III, PHD, MD.
  • Не удаляйте диакритические знаки — например, è, é, ê или ë.
  • Хэширование: SHA256, закодированное в Base64.

Действительный код: TO_BASE64(SHA256("délacruz"))

Неверно: TO_BASE64(SHA256("dé la Cruz, Jr."))

Страна

  • Указывайте код страны, даже если все данные о ваших клиентах относятся к одной и той же стране.
  • Не хешируйте данные о странах.
  • Используйте коды стран ISO 3166-1 alpha-2
  • Хэширование: отсутствует

Действительно: US

Неверно: United States of America или USA

Почтовый индекс

  • Не следует хешировать данные почтового индекса.
  • Допускаются как американские, так и международные почтовые индексы.
  • Для США:
    • Допускаются пятизначные коды — например, 94043.
    • Допускаются также 5 цифр, за которыми следует 4-значное расширение — например, 94043-1351 или 940431351.
  • Для всех остальных стран:
    • Форматирование не требуется (нет необходимости переводить в нижний регистр, удалять пробелы и специальные символы).
    • Не указывайте расширения почтовых индексов.
  • Хэширование: отсутствует

Проверка хеш-таблиц и кодирование данных

Для проверки правильности форматирования данных можно использовать следующие скрипты проверки хешей.

JavaScript

  /**
   * @fileoverview Provides the hashing algorithm, as well as some valid hashes of
   * sample data for testing.
  */

  async function hash(token) {
    // Removes leading or trailing spaces and converts all characters to lowercase.
    const formattedToken = token.trim().toLowerCase();
    // Hashes the formatted string using the SHA-256 hashing algorithm.
    const hashBuffer = await crypto.subtle.digest(
        'SHA-256', (new TextEncoder()).encode(formattedToken));
    // Converts the hash buffer to a base64-encoded string and returns it.
    const base64Str = btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));
    return base64Str;
  }

  function main() {
    // Expected hash for test@gmail.com:
    // h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    hash('test@gmail.com').then(result => console.log(result));

    // Expected hash for +18005551212:
    // YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    hash('+18005551212').then(result => console.log(result));

    // Expected hash for John: ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    hash('John').then(result => console.log(result));

    // Expected hash for Doe: eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
    hash('Doe').then(result => console.log(result));
  }

  main()

Python

  """Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

  Supports: Python 2, Python 3

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  """

  import base64
  import hashlib

  def hash(token):
  # Generates a base64-encoded SHA-256 hash of a normalized input string.
    return base64.b64encode(
        hashlib.sha256(
            token.strip().lower().encode('utf-8')).digest()).decode('utf-8')

  def print_hash(token, expected=None):
  # Computes and displays the hash of a token, with optional validation.
    hashed = hash(token)

    if expected is not None and hashed != expected:
      print(
          'ERROR: Incorrect hash for token "{}". Expected "{}", got "{}"'.format(
              token, expected, hashed))
      return

    print('Hash: "{}"\t(Token: {})'.format(hashed, token))

  def main():
  # Tests the hash function with sample tokens and expected results.
    print_hash(
        'test@gmail.com', expected='h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=')
    print_hash(
        '+18005551212', expected='YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=')
    print_hash('John', expected='ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=')
    print_hash('Doe', expected='eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=')

  if __name__ == '__main__':
    main()

Идти

  /*
  Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  */
  package main

  import (
    "crypto/sha256"
    "encoding/base64"
    "fmt"
    "strings"
  )

  // Hash hashes an email, phone, first name, or last name into the correct format.
  func Hash(token string) string {
    formatted := strings.TrimSpace(strings.ToLower(token))
    hashed := sha256.Sum256([]byte(formatted))
    encoded := base64.StdEncoding.EncodeToString(hashed[:])
    return encoded
  }

  // PrintHash prints the hash for a token.
  func PrintHash(token string) {
    fmt.Printf("Hash: \"%s\"\t(Token: %s)\n", Hash(token), token)

  }

  func main() {
    PrintHash("test@gmail.com")
    PrintHash("+18005551212")
    PrintHash("John")
    PrintHash("Doe")
  }

Java

  package updm.hashing;

  import static java.nio.charset.StandardCharsets.UTF_8;

  import java.security.MessageDigest;
  import java.security.NoSuchAlgorithmException;
  import java.util.Base64;

  /**
  * Example of the hashing algorithm.
  *
  * <p>Sample hashes:
  *
  * <ul>
  *   <li>Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
  *   <li>Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
  *   <li>First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
  *   <li>Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  * </ul>
  */
  public final class HashExample {

  private HashExample() {}

  public static String hash(String token) {
    // Normalizes and hashes the input token using SHA-256 and Base64 encoding.
    String formattedToken = token.toLowerCase().strip();

    byte[] hash;
    try {
      hash = MessageDigest.getInstance("SHA-256").digest(formattedToken.getBytes(UTF_8));
    } catch (NoSuchAlgorithmException e) {
      throw new IllegalStateException("SHA-256 not supported", e);
    }

    return Base64.getEncoder().encodeToString(hash);
  }

  public static void printHash(String token) {
    // Calculates and prints the hash for the given token.
    System.out.printf("Hash: \"%s\"\t(Token: %s)\n", hash(token), token);
  }

  public static void main(String[] args) {
    // Executes hash calculations and prints results for sample tokens.
    printHash("test@gmail.com");
    printHash("+18005551212");
    printHash("John");
    printHash("Doe");
  }
  }

SQL

  /*
  Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

  The following code uses Google Standard SQL and can be run on BigQuery to generate match tables from unhashed data.

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=

  The unhashed input table schema is assumed to be:

  - Column name: UserID, Type: String
  - Column name: Email, Type: String
  - Column name: Phone, Type: String
  - Column name: FirstName, Type: String
  - Column name: LastName, Type: String
  - Column name: PostalCode, Type: String
  - Column name: CountryCode, Type: String
  */

  -- Creates a new table with Base64-encoded SHA-256 hashes of specified columns.
  CREATE TABLE `your_project_name.your_dataset_name.output_hashed_table_name`
  AS
  SELECT
    UserID,
    TO_BASE64(SHA256(LOWER(Email))) AS Email,
    TO_BASE64(SHA256(Phone)) AS Phone,
    TO_BASE64(SHA256(LOWER(FirstName))) AS FirstName,
    TO_BASE64(SHA256(LOWER(LastName))) AS LastName,
    PostalCode,
    CountryCode,
  FROM
    `your_project_name.your_dataset_name.input_unhashed_table_name`;

Соединительные ключи

Некоторые комбинации предоставленных пользователем данных более надежны, чем другие. Ниже приведен список различных комбинаций предоставленных пользователем данных, ранжированных по относительной надежности. Если вы используете адрес, необходимо указать: имя, фамилию, страну и почтовый индекс.

  1. Электронная почта, телефон, адрес (самый надежный способ связи)
  2. Телефон, адрес
  3. Адрес электронной почты
  4. Электронная почта, телефон
  5. Адрес
  6. Телефон
  7. Электронная почта (самый слабый вариант)

Создать таблицу соответствия

  1. Нажмите «Добавить» > «Создать» > «Запрос» .
  2. Скопируйте шаблон запроса для генерации таблицы соответствия в частном облаке и вставьте его в редактор запросов. Дополнительно: Вы можете использовать шаблон генерации таблицы соответствия в частном облаке (с хешированием), если ваши данные еще не хешированы.

    /* Private cloud match table generation
    Create a new match table using your first party data with this template.
    
    Parameters:
    Manually remove all the parameters tagged with @ prefix and replace them
    with column names from your first party table:
    *   @user_id
    *   @email
    *   @phone
    *   @first_name
    *   @last_name
    *   @country_code
    *   @postal_code
    
    And your BigQuery table information:
    *   @my_project: Your BigQuery project where the first party table is.
    *   @my_dataset: Your dataset where the first party table is.
    *   @my_first_party_table: Your first party table.
    */
    
    CREATE OR REPLACE TABLE adh.updm_match_table AS (
    SELECT CAST(@user_id AS BYTES) AS user_id,
          @email AS email,
          @phone AS phone,
          @first_name AS first_name,
          @last_name AS last_name,
          @country_code AS country,
          @postal_code AS zip_code
    FROM `@my_project.@my_dataset.@my_first_party_table`
    );
    
    /* Private cloud match table generation (with hashing)
    Create a new match table using your first party data with this template.
    
    Parameters:
    Manually remove all the parameters tagged with @ prefix and replace them
    with column names from your first party table:
    *   @user_id
    *   @email
    *   @phone
    *   @first_name
    *   @last_name
    *   @country_code
    *   @postal_code
    
    And your BigQuery table information:
    *   @my_project : Your BigQuery project where the first party table is.
    *   @my_dataset : Your dataset where the first party table is.
    *   @my_first_party_table : Your first party table.
    */
    
    CREATE OR REPLACE TABLE adh.updm_match_table AS (
    SELECT CAST(@user_id AS BYTES) AS user_id,
          TO_BASE64(SHA256(LOWER(@email))) AS email,
          TO_BASE64(SHA256(@phone)) AS phone,
          TO_BASE64(SHA256(LOWER(@first_name))) AS first_name,
          TO_BASE64(SHA256(LOWER(@last_name))) AS last_name,
          @country_code AS country,
          @postal_code AS zip_code
    FROM `@my_project.@my_dataset.@my_first_party_table`
    );
    
  3. Замените имена параметров именами ваших столбцов, чтобы обеспечить корректное сопоставление имен.

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

  5. Нажмите «Выполнить» . Вам необходимо вручную выполнить этот запрос для обновления таблицы соответствия. Каждый запуск будет перезаписывать текущую таблицу соответствия.

Запрос совпал с данными

Запрос к таблицам совпадений

Когда ваши таблицы соответствия содержат достаточно данных для прохождения проверок конфиденциальности, вы готовы выполнять запросы к этим таблицам.

Исходная таблица для данных от первого лица (1PD) представлена ​​таблицей my_data . Она включает как персональные данные (PII), так и данные, не являющиеся персональными. Использование исходной таблицы может улучшить ваши отчеты, предоставив больше аналитической информации, поскольку она отражает все данные 1PD в рамках данной таблицы по сравнению с таблицей соответствия.

Каждая таблица в схеме Ads Data Hub, содержащая поле user_id сопровождается таблицей соответствия. Например, для таблицы adh.google_ads_impressions Ads Data Hub также генерирует таблицу соответствия adh.google_ads_impressions_updm , содержащую ваши идентификаторы пользователей. Отдельные таблицы соответствия создаются для таблиц сетевой политики. Например, для таблицы adh.google_ads_impressions_policy_isolated_network Ads Data Hub также генерирует таблицу соответствия adh.google_ads_impressions_policy_isolated_network_updm , содержащую ваши идентификаторы пользователей.

Эти таблицы содержат подмножество пользователей, доступных в исходных таблицах, для которых найдено совпадение по user_id . Например, если исходная таблица содержит данные для пользователя A и пользователя B, но найдено совпадение только для пользователя A, то пользователь B не будет присутствовать в таблице совпадений.

В таблицах соответствия содержится дополнительный столбец под названием customer_data_user_id , в котором хранится идентификатор пользователя в байтах.

При написании запросов важно учитывать тип поля. Операторы сравнения SQL ожидают, что сравниваемые литералы будут одного типа. В зависимости от того, как user_id хранится в вашей таблице с данными из первых рук, вам может потребоваться закодировать значения в таблице перед сопоставлением данных. Для успешного сопоставления необходимо преобразовать ключ объединения в байты:

JOIN ON
  adh.google_ads_impressions_updm.customer_data_user_id = CAST(my_data.user_id AS BYTES)

Кроме того, сравнение строк в SQL чувствительно к регистру символов, поэтому вам может потребоваться закодировать строки с обеих сторон сравнения, чтобы обеспечить их точное сравнение.

Примеры запросов

Подсчет соответствующих пользователей

Этот запрос подсчитывает количество пользователей, соответствующих условиям поиска, в таблице показов вашей рекламы Google Ads.

/* Count matched users in Google Ads impressions table */

SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm

Рассчитайте процент совпадений

Не все пользователи подходят для сопоставления. Например, пользователи, вышедшие из системы, дети и пользователи, не давшие согласия, не сопоставляются через UPDM. Вы можете использовать поле is_updm_eligible для более точного расчета коэффициентов сопоставления UPDM. Обратите внимание, что поле is_updm_eligible стало доступно с 1 октября 2024 года. Вы не можете использовать это поле для расчета коэффициентов сопоставления до этой даты.

/* Calculate the UPDM match rate */

CREATE TEMP TABLE total_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  customer_id,
  COUNT(*) AS n
FROM adh.google_ads_impressions
WHERE is_updm_eligible
GROUP BY 1;

CREATE TEMP TABLE matched_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  customer_id,
  COUNT(*) AS n
FROM adh.google_ads_impressions_updm
GROUP BY 1;

SELECT
  customer_id,
  SAFE_DIVIDE(matched_events.n, total_events.n) AS match_rate
FROM total_events
LEFT JOIN matched_events
  USING (customer_id)

Объедините собственные данные и данные Google Ads.

Этот запрос показывает, как объединить собственные данные с данными Google Ads:

/* Join first-party data with Google Ads data. The customer_data_user_id field
contains your ID as BYTES. You need to cast your join key into BYTES for
successful matches. */

SELECT
  inventory_type,
  COUNT(*) AS impressions
FROM
  adh.yt_reserve_impressions_updm AS google_data_imp
LEFT JOIN
  `my_data`
ON
  google_data_imp.customer_data_user_id = CAST(my_data.user_id AS BYTES)
GROUP BY
  inventory_type

Часто задаваемые вопросы по UPDM

Список часто задаваемых вопросов, касающихся UPDM, можно найти в разделе «Часто задаваемые вопросы по UPDM» .