Сопоставление данных, предоставляемых пользователями (UPDM), объединяет данные, собранные вами о пользователе, например, информацию с ваших веб-сайтов, приложений или физических магазинов, с данными о действиях этого пользователя, вошедшего в систему, во всех данных Google по рекламе , включая данные, принадлежащие и управляемые 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 . Поскольку эти данные более устойчивы к изменениям в отрасли, чем сторонние данные, они могут предоставить более содержательную аналитику, что может привести к более активному участию клиентов.
Краткое описание процесса
- Настройка приема и сопоставления данных
- Убедитесь, что ваши основные данные размещены в BigQuery и у вашей учетной записи есть доступ к ним на чтение. См. раздел Настройка приема данных .
- Прием и сопоставление данных из первых рук
- Вы форматируете и загружаете собственные данные в свой набор данных BigQuery.
- Вы инициируете запрос на сопоставление данных, создавая запрос анализа Private Cloud Match и устанавливая расписание.
- Google объединяет данные вашего проекта и данные Google, содержащие идентификатор пользователя Google и хешированные предоставленные пользователями данные, для создания и обновления таблиц соответствий.
- См. раздел «Прием собственных данных»
- Текущие запросы в Ads Data Hub на основе сопоставленных данных
- Запросы к таблицам соответствий выполняются так же, как и обычные запросы в Ads Data Hub. См. раздел Запрос совпадающих данных .
Узнайте о требованиях конфиденциальности
Сбор данных о клиентах
При использовании сопоставления данных, предоставленных пользователями, необходимо загрузить собственные данные. Это может быть информация, собранная вами на ваших веб-сайтах, в приложениях, в обычных магазинах, а также любая информация, которой клиент поделился с вами напрямую.
Вы должны:
- Убедитесь, что ваша политика конфиденциальности раскрывает информацию о том, что вы передаете данные клиентов третьим лицам для оказания услуг от вашего имени, и что вы получаете согласие на такую передачу в случаях, когда это требуется по закону.
- Используйте только одобренный API или интерфейс Google для загрузки данных клиентов.
- Соблюдайте все применимые законы и правила , включая любые кодексы саморегулирования или отраслевые кодексы, которые могут применяться.
Подтверждение согласия первой стороны
Чтобы использовать свои собственные данные в Ads Data Hub, вы должны подтвердить, что получили надлежащее согласие на передачу данных от конечных пользователей из ЕЭЗ в Google в соответствии с Политикой согласия пользователей из ЕС и Политикой Ads Data Hub . Это требование применяется к каждой учётной записи Ads Data Hub и должно обновляться при каждой загрузке новых собственных данных. Любой пользователь может дать такое согласие от имени всей учётной записи.
Обратите внимание, что к запросам UPDM применяются те же правила запросов к сервисам Google, что и к аналитическим запросам. Например, при создании таблицы соответствий невозможно выполнять кросс-сервисные запросы по пользователям в ЕЭЗ.
Чтобы узнать, как подтвердить согласие в Ads Data Hub, ознакомьтесь с требованиями к согласию для Европейской экономической зоны .
Размер данных
Для защиты конфиденциальности конечного пользователя сопоставление предоставленных пользователем данных обеспечивает соблюдение следующих требований к размеру ваших данных:
- Вам необходимо загрузить не менее 1000 записей в свой список пользователей.
Настройте прием данных
Прежде чем начать, убедитесь, что:
- Ваши основные данные должны храниться в BigQuery. Если у вас периметр VPC-SC, эти основные данные должны быть размещены в вашем VPC-SC.
- Ваша учетная запись сервиса Ads Data Hub должна иметь доступ на чтение основных данных.
- Ваши собственные данные должны быть правильно отформатированы и хешированы. Подробнее см. в следующем разделе.
Помимо этого, Private Cloud Match не требует дополнительной настройки. Если вы можете выполнить аналитический запрос, вы можете выполнить запрос Private Cloud Match.
Прием и сопоставление собственных данных
Форматировать данные для ввода
Для корректного сопоставления ваши данные должны соответствовать следующим требованиям к форматированию:
- В полях ввода, указанных ниже, необходимо выполнить загрузку с использованием хеширования SHA256.
- Поля ввода должны быть отформатированы как строки. Например, если вы используете хеш-функцию BigQuery SHA256 с функцией кодирования 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
Почтовый индекс
- Не хешируйте данные почтового индекса
- Разрешены как американские, так и международные почтовые индексы.
- Для США:
- Допускаются 5-значные коды, например, 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()
Питон
"""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")
}
Ява
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`;
Присоединить ключи
Некоторые комбинации предоставленных пользователями данных надёжнее других. Ниже приведён список различных комбинаций предоставленных пользователями данных, отсортированных по относительной надёжности. Если вы используете адрес, необходимо указать: имя, фамилию, страну и почтовый индекс.
- Электронная почта, телефон, адрес (самый надежный)
- Телефон, адрес
- Адрес электронной почты
- Электронная почта, Телефон
- Адрес
- Телефон
- Электронная почта (самая слабая)
Создайте таблицу соответствий
Нажмите Отчеты > Создать отчет > Генерация таблицы соответствий частного облака > Использовать шаблон. Необязательно: вы можете выбрать Генерация таблицы соответствий частного облака с хешированием, если ваши данные еще не хешированы.
// 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` );
Замените имена параметров именами столбцов, чтобы обеспечить правильное присвоение псевдонимов.
Нажмите «Установить расписание» , чтобы задать частоту обновления таблицы соответствий. При каждом запуске текущая таблица соответствий будет перезаписываться.
Запрос соответствующих данных
Запросить таблицы соответствий
Когда ваши таблицы соответствий содержат достаточно данных для удовлетворения проверок конфиденциальности, вы готовы выполнять запросы к таблицам.
Исходная таблица для данных первой стороны (1PD) представлена my_data
. Она включает как персональные данные (PII), так и данные, не относящиеся к PII. Использование исходной таблицы может улучшить ваши отчёты и сделать их более информативными, поскольку она представляет все данные первой стороны в области охвата, по сравнению с таблицей соответствий.
Каждая таблица в схеме 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
в таблице с данными из первой партии, вам может потребоваться кодировать значения в таблице перед сопоставлением данных. Для успешного сопоставления необходимо преобразовать ключ соединения в тип BYTES:
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 .