概览
UPDM(用户提供的数据匹配)会将您收集的关于用户的第一方数据(例如从您的网站、应用或实体店收集的信息)与该用户在 Google 广告数据(不包括 Google Marketing Platform)中记录的同一登录活动合并。为了符合用户提供的数据匹配的条件,广告事件必须与 Google 广告数据中已登录的用户相关联。
与其他形式目标客户匹配相比,用户提供的数据匹配具有一些独特的优势。用户提供的数据匹配:
- 比第三方数据更能抵御行业变化
- 不受第三方 Cookie 即将停用的影响,因为用户提供的数据匹配仅适用于 Google 自有自营的广告资源(面向已登录的用户)
- 可以提供更具相关性的客户体验,这通常可以提高客户互动度
- 提供更丰富的客户数据洞见
流程摘要
为您的帐号提供用户提供的数据匹配后,持续使用该功能需要两个阶段:
数据源和目标项目
如需使用连接,您需要使用两个不同的 Google Cloud 项目:数据源项目和目标项目。
- 数据源:此项目以原始格式包含您的专有广告数据。
- 目标:这是广告数据中心写入的 BigQuery 数据集。默认情况下,这是您的管理项目。如需将其更改为其他 Google Cloud 项目,请参阅配置服务帐号。
隐私权限制
收集客户数据
使用用户提供的数据匹配时,您必须上传第一方数据。可以是您从网站、应用、实体店收集的信息,也可以是客户直接与您分享的任何信息。
数据大小
为了保护最终用户的隐私,用户提供的数据匹配强制执行以下有关数据大小的要求:
- 您必须在用户列表中上传至少 1000 条记录。
- 匹配表每次成功更新后,新添加的用户都必须至少达到一个下限。此行为与差异检查类似。
- 您的列表不得超过记录数上限。如需了解数据量上限,请与您的 Google 代表联系。
启用“连接”标签页
在开始之前,请配置您的广告数据中心帐号以启用“连接”标签页,您可以在其中建立数据匹配流水线。您只需执行一次这些步骤。
- 向您的 Google 代表发送以下信息:
- 您要使用的用户数据中心数据 ID 所对应的广告数据中心帐号 ID。
- 有权访问您的 Destination 项目的超级用户电子邮件地址。
- 与您的 Google 代表联系,确认相应帐号和超级用户已列入许可名单。
在指定的 Google Cloud 项目中启用 Ads Data Connector API。默认情况下,这是您的管理员项目。如需使用其他项目,请按照以下步骤操作,并将备用 Google Cloud 项目作为数据源。您必须以列入许可名单的超级用户的身份登录,才能执行以下步骤。
- 转到 Cloud Console API 库。
- 从列表中选择您的数据源项目。
- 搜索“Ads Data Connector API”。如果 Google Ads Data Connector API 未显示在搜索结果中,则说明已登录的 Google 帐号不是已列入许可名单的超级用户。
- 在 API 页面上,点击启用。
- 与您的 Google 代表联系,确认该 API 已启用。
您的 Google 代表会向您发送三个电子邮件地址,分别指定为 Datafusion、Dataproc 和 UPDM 服务帐号。
您的广告数据中心帐号中还将显示一个新的连接部分,其中包含一个名为您的第一方数据和数据匹配的标签页。了解每个标签页的用例。
向服务帐号授予适当的权限。如需了解不同服务帐号及其所需权限的说明,请在表中选择您的数据源:
BigQuery
Datafusion 服务帐号 目的 数据融合服务帐号用于在广告数据中心界面中显示来源字段列表。 格式 service-some-number@gcp-sa-datafusion.iam.gserviceaccount.com
所需的访问权限 BigQuery Data Viewer
roles/bigquery.dataViewer
(对于数据源和目标项目中的特定数据集) Storage Admin
roles/storage.admin
(对于数据源项目)或专用存储分区, Dataproc 服务帐号 目的 该 Dataproc 服务帐号负责在后台运行数据流水线。 格式 some-number-compute@developer.gserviceaccount.com
所需的访问权限 BigQuery Data Viewer
roles/bigquery.dataViewer
(对于数据源和目标项目中的特定数据集) BigQuery Data Editor
roles/bigquery.dataEditor
对于 Destination 项目中的特定数据集,请执行以下操作: BigQuery Job User
roles/bigquery.jobUser
适用于数据源和目标项目 Storage Admin
roles/storage.admin
数据源和目标项目,或者一个专用的存储分区 UPDM 服务帐号 目的 UPDM 服务帐号用于运行匹配的作业。 格式 service-some-number@gcp-sa-adsdataconnector.iam.gserviceaccount.com
所需的访问权限 BigQuery Data Viewer
roles/bigquery.dataViewer
对于 Destination 项目 BigQuery Job User
roles/bigquery.jobUser
对于 Destination 项目 Cloud Storage
Datafusion 服务帐号 目的 数据融合服务帐号用于在广告数据中心界面中显示来源字段列表。 格式 service-some-number@gcp-sa-datafusion.iam.gserviceaccount.com
所需的访问权限 Storage Object Viewer
roles/storage.objectViewer
(针对数据源项目中的特定存储分区) BigQuery Data Viewer
roles/bigquery.dataViewer
(对于数据源项目)或专用存储分区, Storage Admin
roles/storage.admin
(对于数据源项目)或专用存储分区, Dataproc 服务帐号 目的 该 Dataproc 服务帐号负责在后台运行数据流水线。 格式 some-number-compute@developer.gserviceaccount.com
所需的访问权限 Storage Admin
roles/storage.admin
数据源和目标项目,或者一个专用的存储分区 BigQuery Job User
roles/bigquery.jobUser
对于 Destination 项目 UPDM 服务帐号 目的 UPDM 服务帐号用于运行匹配的作业。 格式 service-some-number@gcp-sa-adsdataconnector.iam.gserviceaccount.com
所需的访问权限 BigQuery Data Viewer
roles/bigquery.dataViewer
对于 Destination 项目 BigQuery Job User
roles/bigquery.jobUser
对于 Destination 项目 Salesforce
即将推出
注入第一方数据
设置输入数据的格式
您的数据必须符合以下格式要求才能正确匹配:
- 在指示的情况下,您必须使用编码为 Base16 字符串的 SHA256 哈希进行上传。虽然 UPDM 支持 Base64,但与 Google Ads 目标客户匹配指南不同。
- 输入字段必须采用字符串格式。如果您使用的是 BigQuery 的 SHA256 哈希函数和 Base16 编码函数 (TO_HEX),请使用以下转换:
TO_HEX(SHA256(user_data))
。
User-ID
- 纯文本
- 哈希处理:无
电子邮件
- 删除空格
- 所有字符均须采用小写格式
- 所有电子邮件地址都必须有域名,例如 gmail.com 或 hotmail.co.jp
- 移除重音符号(例如,将 è、é、ê 或 ë 更改为 e)
- 哈希处理:Base16 编码的 SHA256
有效:TO_HEX(SHA256("jeffersonloveshiking@gmail.com"))
无效:TO_HEX(SHA256("JéffersonLôvesHiking@gmail.com"))
手机
- 删除空格
- 采用 E.164 格式(例如,US +14155552671、UK +442071838750)
- 包含国家/地区代码(包括美国)
- 移除国家/地区代码前的所有特殊字符(“+”符号除外)
- 哈希处理:Base16 编码的 SHA256
有效:TO_HEX(SHA256("+18005550101"))
无效:TO_HEX(SHA256("(800) 555-0101"))
名字
- 删除空格
- 所有字符均须采用小写格式
- 移除所有前缀,例如“Mrs.
- 请勿移除重音符号,例如 è、é、ê 或 ë
- 哈希处理:Base16 编码的 SHA256
有效:TO_HEX(SHA256("daní"))
无效:TO_HEX(SHA256("Daní"))
姓氏
- 删除空格
- 所有字符均须采用小写格式
- 移除所有前缀,例如“Jr.
- 请勿移除重音符号,例如 è、é、ê 或 ë
- 哈希处理:Base16 编码的 SHA256
有效:TO_HEX(SHA256("delacruz"))
无效:TO_HEX(SHA256("de la Cruz, Jr."))
国家/地区
- 即使您的所有客户数据都来自同一个国家/地区,也请添加国家/地区代码
- 请勿对国家/地区数据进行哈希处理
- 使用 ISO 3166-1 alpha-2 国家/地区代码
- 哈希处理:无
有效:US
无效:United States of America
或 USA
邮政编码
- 请勿对邮政编码数据进行哈希处理
- 美国邮编和国际邮编均可使用
- 对于美国:
- 可以使用 5 位数代码,例如 94043
- 也可以使用 5 位基础邮编加 4 位扩展邮编的格式,例如 94043-1351 或 940431351
- 对于所有其他国家/地区:
- 无需设置格式(无需小写,或移除空格和特殊字符)
- 请勿添加扩展邮编
- 哈希处理:无
哈希验证和数据编码
您可以使用以下哈希验证脚本来确保数据的格式正确无误。
JavaScript
Base16
/**
* @fileoverview Provides the hashing algorithm for User-Provided Data Match, as
* well as some valid hashes of sample data for testing.
*/
async function hash(token) {
const formattedToken = token.trim().toLowerCase();
const hashArrayBuffer = await crypto.subtle.digest(
'SHA-256', (new TextEncoder()).encode(formattedToken));
return Array.from(new Uint8Array(hashArrayBuffer))
.map((b) => b.toString(16).padStart(2, '0'))
.join('');
}
function main() {
// Expected hash for test@gmail.com:
// 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
hash('test@gmail.com').then(result => console.log(result));
// Expected hash for +18005551212:
// 61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
hash('+18005551212').then(result => console.log(result));
// Expected hash for John:
// 96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
hash('John').then(result => console.log(result));
// Expected hash for Doe:
// 799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
hash('Doe').then(result => console.log(result));
}
main()
Base64
/**
* @fileoverview Provides the hashing algorithm, as well as some valid hashes of
* sample data for testing.
*/
async function hash(token) {
const formattedToken = token.trim().toLowerCase();
const hashBuffer = await crypto.subtle.digest(
'SHA-256', (new TextEncoder()).encode(formattedToken));
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
Base16
"""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': 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
- Phone '+18005551212': 61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
- First name 'John': 96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
- Last name 'Doe': 799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
"""
import base64
import hashlib
def updm_hash(token):
return hashlib.sha256(token.strip().lower().encode('utf-8')).hexdigest()
def print_updm_hash(token):
print('Hash: "{}"\t(Token: {})'.format(updm_hash(token), token))
def main():
print_updm_hash('test@gmail.com')
print_updm_hash('+18005551212')
print_updm_hash('John')
print_updm_hash('Doe')
if __name__ == '__main__':
main()
Base64
"""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):
return base64.b64encode(
hashlib.sha256(
token.strip().lower().encode('utf-8')).digest()).decode('utf-8')
def print_hash(token, expected=None):
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():
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()
Go
Base16
/*
Provides the hashing algorithm, as well as some valid hashes of sample data for testing.
Sample hashes:
- Email 'test@gmail.com': 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
- Phone '+18005551212': 61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
- First name 'John': 96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
- Last name 'Doe': 799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
*/
package main
import (
"crypto/sha256"
"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 := fmt.Sprintf("%x", 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")
}
Base64
/*
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
Base16
package updm.hashing;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.base.Ascii;
import com.google.common.hash.Hashing;
/**
* Example of the UPDM hashing algorithm using hex-encoded SHA-256.
*
* <p>This uses the Guava Hashing to generate the hash: https://github.com/google/guava
*
* <p>Sample valid hashes:
*
* <ul>
* <li>Email "test@gmail.com": "87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674"
* <li>Phone "+18005551212": "61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44"
* <li>First name "John": "96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a"
* <li>Last name "Doe": "799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f"
* </ul>
*/
public final class HashExample {
private HashExample() {}
public static String hash(String token) {
String formattedToken = Ascii.toLowerCase(token).strip();
return Hashing.sha256().hashString(formattedToken, UTF_8).toString();
}
public static void printHash(String token) {
System.out.printf("Hash: \"%s\"\t(Token: %s)\n", hash(token), token);
}
public static void main(String[] args) {
printHash("test@gmail.com");
printHash("+18005551212");
printHash("John");
printHash("Doe");
}
}
Base64
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) {
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) {
System.out.printf("Hash: \"%s\"\t(Token: %s)\n", hash(token), token);
}
public static void main(String[] args) {
printHash("test@gmail.com");
printHash("+18005551212");
printHash("John");
printHash("Doe");
}
}
SQL
Base16
/*
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': 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
- Phone '+18005551212': 61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
- First name 'John': 96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
- Last name 'Doe': 799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
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
*/
CREATE TABLE `your_project_name.your_dataset_name.output_hashed_table_name`
AS
SELECT
UserID,
TO_HEX(SHA256(LOWER(Email))) AS Email,
TO_HEX(SHA256(Phone)) AS Phone,
TO_HEX(SHA256(LOWER(FirstName))) AS FirstName,
TO_HEX(SHA256(LOWER(LastName))) AS LastName,
PostalCode,
CountryCode,
FROM
`your_project_name.your_dataset_name.input_unhashed_table_name`;
Base64
/*
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
*/
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`;
联接键
用户提供的数据的某些组合比其他组合更强大。下面列出了用户提供的不同数据组合(按相对强度排序):
- 电子邮件地址、电话号码、地址(最强)
- 电话、地址
- 电子邮件地址、地址
- 电子邮件、电话
- 地址
- 手机
- 电子邮件(最弱)
创建匹配表
- 点击连接 >;数据匹配 >;创建连接。
- 选择数据源,然后点击连接。根据系统提示进行身份验证,然后点击下一步。
- 配置数据源,然后点击下一步:
BigQuery
选择要导入的 BigQuery 表。
Cloud Storage
输入 gsutil 文件路径(例如
gs://my-bucket/folder/
),然后选择文件的格式。Salesforce
即将推出
- 设置 destination,然后点击 Next:
- 选择一个新的 BigQuery 数据集作为数据的中间目标位置。此步骤可确保您的数据采用正确的格式。
- 可选:修改数据格式。转换包括计算哈希、小写/大写格式以及合并/拆分字段。
- 点击操作 >; >;转换。
- 在弹出的面板中,点击添加转换或添加其他转换
- 从下拉菜单中选择转换类型,然后输入要求。
- 点击保存。
- 请选择至少一个联接键来映射要使用的字段,然后点击下一步。
- 设置时间表:
- 为连接命名。
- 设置频率,指示将数据导入您在上一步中选择的数据集的频率。每次运行都将覆盖 destination 表中的数据。
- 指定如何处理用户 ID 冲突。您可以选择保留现有的匹配项,也可以覆盖新数据。
- 点击 Finish。
查看连接详细信息
连接详情页面为您提供了有关给定连接最近的运行和错误的信息。要查看特定连接的详细信息,请执行以下操作:
- 点击连接 >;数据匹配。
- 点击连接的名称以查看其详细信息。
- 您现在可以查看连接的详情和最近的运行。每种错误都会显示两种类型的错误:连接级错误(连接未运行)和行级错误(行未导入)。
- 失败状态表示整个连接运行失败(例如,服务帐号权限问题)。点击错误状态可查看哪些错误影响了连接。
- “已完成”状态表示连接已成功运行。 但是,可能仍存在行级错误 - 在“出错的行数”列中显示为非零值。点击该值可详细了解失败的记录。
修改连接
尚不支持修改连接。如需更改连接,请创建一个新连接,然后删除旧连接。
查询广告数据中心中的数据
查询匹配表
当您的匹配表包含足够的数据以满足隐私设置检查要求时,您就可以针对这些表运行查询了。广告数据中心架构中的每个表均包含一个 user_id
字段,并随附一个 *_match
表。例如,对于 adh.google_ads_impressions
表,广告数据中心还会生成一个名为 adh.google_ads_impressions_match
且仅包含用户 ID 的匹配表。这些表包含原始表中可供使用的那部分用户,user_id
中有匹配项。例如,如果原始表包含用户 A 和用户 B 的数据,但仅匹配用户 A,则用户 B 不会出现在匹配表中。
匹配表还包含一个名为 external_cookie
的额外列,用于将 Cookie 存储为 Byte。
external_cookie 字段包含 ID 作为 BYTES。您需要将联接键转换为 Bytes,以便成功匹配。
JOIN ON
google_data_imp.external_cookie = CAST(my_data.user_id AS BYTES)
通过查询广告事件表的 *_match
视图来使用匹配表。如果您还使用 Cookie 匹配功能,则可以在查询中按匹配类型进行过滤。
使用:
match_type = 1
(用于 Cookie 匹配)match_type = 2
(针对用户提供的数据匹配)
虽然查询中允许使用 match_type
,但结果中无法返回此字段,因此不应将其包含在最终的 SELECT
语句中。
查询示例
统计匹配的用户数
此查询会统计 Google Ads 展示次数表格中的匹配用户数。
/* Count matched users in Google Ads impressions table */
SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_match
统计用户提供的数据的匹配用户数
此查询会按匹配类型统计匹配的用户数。由于广告事件表包含已登录用户和未登录用户的事件,因此按用户提供的数据匹配进行过滤将只匹配已登录的用户。
/* Count user-provided data matched users by match type.
match_type = 1 for cookie matching
match_type = 2 for user-provided data matching */
SELECT
match_type AS match_type,
COUNT(DISTINCT user_id) AS user_cnt,
FROM
adh.google_ads_impressions_match
GROUP BY
match_type
以下查询展示了如何将第一方数据与 Google Ads 数据合并:
/* Join first-party data with Google Ads data. The external_cookie 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_match AS google_data_imp
LEFT JOIN
`my_data`
ON
google_data_imp.external_cookie = CAST(my_data.user_id AS BYTES)
-- Uncomment the following line if cookie matching is enabled as well.
-- WHERE google_data_imp.match_type = 2
GROUP BY
inventory_type
此查询会统计由用户提供的数据匹配的用户数(不包括 Cookie 匹配用户)。请注意,广告事件表包含已登录用户和未登录用户的事件,因此如果仅按用户提供的数据匹配进行过滤,那么系统只会匹配已登录的用户。
/* Count user-provided data matched users, excluding cookie matched users. */
SELECT
COUNT(DISTINCT user_id)
FROM
adh.google_ads_impressions_match
WHERE
match_type = 2
沟通
获取有价值的广告数据洞见通常需要整合来自多个来源的数据。构建您自己的数据流水线问题解决方案需要大量时间和工程投入。Connections 提供了分步指导界面来简化此过程,支持将数据导入、转换和写入 BigQuery。写入数据后,您可以在广告数据中心查询或从 BigQuery 读取数据的任何其他产品中使用。使用第一方数据丰富查询可以带来更丰富的客户体验,并且更能适应整个行业的广告跟踪变化。
此外,Connections 还使用多种工具构建,可让您以保护隐私的方式加密和共享个人身份信息 (PII)。选择哪些列包含个人身份信息后,连接就会对数据进行加密,确保只有有权导出或读取您的第一方数据的用户才能执行这些操作。
您可以使用连接从以下位置导入数据:
- BigQuery
- Cloud Storage
- Salesforce(即将推出)
了解衡量或激活用例需要哪些第一方数据可能很困难,因此 Connections 提供了一个完整的预定义用例列表,然后指导您完成提取、转换和加载数据的整个体验。
第一方数据与数据匹配之间的区别
配置用户提供的匹配表的工作流类似于通过 Connections 创建常规第一方数据连接。但是,双项目要求假设您在使用用户提供的数据匹配之前设置了连接。如果您仅将连接用作数据准备工具,则可以使用单个 Google Cloud 项目。
针对用户提供的数据匹配的其他要求:
- 您必须使用电子邮件地址、电话号码、地址或任意组合作为联接键。
- 您必须指定如何解决 user_id 冲突。您可以选择保留现有的匹配项,也可以用新数据覆盖。
- 除了 Datafusion 和 Chromebox 帐号外,您还必须使用 UPDM 服务帐号。
您的第一方数据工作流程
创建连接
- 依次点击连接 > 您的第一方数据 > 创建连接。
- 连接到数据源。系统会提示您进行身份验证。
BigQuery
权限基于您的 Google 帐号,因此无需额外进行身份验证。确保连接服务帐号拥有表的读取权限。
Cloud Storage
权限基于您的 Google 帐号,因此无需额外进行身份验证。确保连接服务帐号拥有存储分区的读取权限。
Salesforce
(即将推出)
使用您单位的 Salesforce 凭据登录。 Google 不会存储您的凭据,因此每个新的 Salesforce 连接都需要重新进行身份验证。
- 选择一个用例和联接键,然后点击选择用例。如果您不想选择用例,请点击跳过。 您以后无法再选择用例。
- 配置数据源。
BigQuery
选择要导入的 BigQuery 表。
Cloud Storage
输入 gsutil 文件路径(例如
gs://my-bucket/folder/
),然后选择文件的格式。Salesforce
即将发布
- 配置目的地和映射字段。
- 选择要写入结果的 Google Cloud 项目、数据集和表。确保连接服务帐号对您要写入的数据集具有写入权限。
- 每个连接都会创建一个新表来写入数据。如果您选择已存在的表,则会看到错误。
- 将目标字段(将显示在您要创建的表中的字段)映射到源数据中的源字段。
- 设置时间表。
- 为连接命名。
- 设置频率,指示将数据导入您在上一步中选择的数据集的频率。每次运行都将覆盖 destination 表中的数据。
- 点击完成。处理大量数据的连接可能需要运行数小时。
查看连接详细信息
连接详情页面为您提供了有关给定连接最近的运行和错误的信息。要查看特定连接的详细信息,请执行以下操作:
- 点击连接 > 您的第一方数据。
- 点击连接的名称以查看其详细信息。
- 您现在可以查看连接的详情和最近的运行。每种错误都会显示两种类型的错误:连接级错误(连接未运行)和行级错误(行未导入)。
- 失败状态表示整个连接运行失败(例如,服务帐号权限问题)。点击错误状态可查看哪些错误影响了连接。
- “已完成”状态表示连接已成功运行。 但是,可能仍存在行级错误 - 在“出错的行数”列中显示为非零值。点击该值可详细了解失败的记录。
修改连接
尚不支持修改连接。如需更改连接,请创建一个新连接并删除旧连接。
使用场景
您选择的用例会影响目标表架构和导入的联接键字段。请展开下面的用例,了解它们如何影响架构和联接键:
覆盖面和频次
衡量广告系列在不同渠道和设备上的覆盖面和频次,按第一方细分用户群进行划分。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
transaction_id | 此交易的唯一 ID | 字符串 | 选填 |
transaction_date | 交易日期(Unix 纪元时间戳) | int | 选填 |
交易收入 | 交易收入 | int | 选填 |
currency | 交易的货币类型 | 字符串 | 选填 |
quantity | 交易中的商品数量 | 字符串 | 选填 |
price | 交易中每件商品的价格 | int | 选填 |
交易费用 | 交易产生的商品 / 服务费用 | int | 选填 |
交易利润 | 交易带来的毛利润 | int | 选填 |
product_id | 交易中的产品的 SKU / ID | 字符串 | 选填 |
交易说明 | 有关交易的其他说明 / 元数据 / 参数 | 字符串 | 选填 |
事件类型 | 例如,电视广告展示、营销电子邮件、网站访问、实体店光顾等 | 字符串 | 选填 |
event_id [事件 ID] | 上述事件的唯一 ID | 字符串 | 选填 |
event_timestamp | 事件日期(Unix 纪元时间戳) | int | 选填 |
频道元数据 | 有关此接触点渠道的其他元数据或信息 | 字符串 | 选填 |
多接触点归因
通过将您的第一方接触点与 Google 数据接触点相结合来衡量归因。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
事件类型 | 例如,电视广告展示、营销电子邮件、网站访问、实体店光顾等 | 字符串 | 必需 |
event_id [事件 ID] | 上述事件的唯一 ID | 字符串 | 必需 |
event_timestamp | 事件日期(Unix 纪元时间戳) | int | 必需 |
赠送金额 | 功劳值(用于归因)- 例如转化次数 | int | 选填 |
频道元数据 | 有关此接触点渠道的其他元数据或信息 | 字符串 | 选填 |
效果指标
衡量按受众特征、兴趣相似的受众群体或第一方细分用户群进行划分的广告系列效果。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
转化路径归因
分析包含自定义接触点(包括您的第一方接触点)的转化路径的效果。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
事件类型 | 例如,电视广告展示、营销电子邮件、网站访问、实体店光顾等 | 字符串 | 必需 |
event_id [事件 ID] | 上述事件的唯一 ID | 字符串 | 必需 |
event_timestamp | 事件日期(Unix 纪元时间戳) | int | 必需 |
赠送金额 | 功劳值(用于归因)- 例如转化次数 | int | 选填 |
频道元数据 | 有关此接触点渠道的其他元数据或信息 | 字符串 | 选填 |
在不同发布商网站上的重叠情况
分析广告系列在不同发布商网站上的覆盖面和频次,按第一方细分用户群进行划分。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
同时投放广告系列的效果
衡量同时投放的广告系列的曝光率对效果的影响,按第一方细分用户群进行划分。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
transaction_id | 此交易的唯一 ID | 字符串 | 选填 |
transaction_date | 交易日期(Unix 纪元时间戳) | int | 选填 |
交易收入 | 交易收入 | int | 选填 |
currency | 交易的货币类型 | 字符串 | 选填 |
quantity | 交易中的商品数量 | 字符串 | 选填 |
price | 交易中每件商品的价格 | int | 选填 |
交易费用 | 交易产生的商品 / 服务费用 | int | 选填 |
交易利润 | 交易带来的毛利润 | int | 选填 |
product_id | 交易中的产品的 SKU / ID | 字符串 | 选填 |
交易说明 | 有关交易的其他说明 / 元数据 / 参数 | 字符串 | 选填 |
事件类型 | 例如,电视广告展示、营销电子邮件、网站访问、实体店光顾等 | 字符串 | 选填 |
event_id [事件 ID] | 上述事件的唯一 ID | 字符串 | 选填 |
event_timestamp | 事件日期(Unix 纪元时间戳) | int | 选填 |
频道元数据 | 有关此接触点渠道的其他元数据或信息 | 字符串 | 选填 |
比较广告系列
比较 Google 广告系列和其他发布商广告系列的效果。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
声道 | 投放此广告系列的频道(例如 Facebook、电视等) | 字符串 | 必需 |
合作伙伴 | 涉及的合作伙伴的名称 | 字符串 | 选填 |
战术 | 特定策略的名称 | 字符串 | 选填 |
广告系列元数据 | 关于此广告系列的其他元数据或信息 | 字符串 | 选填 |
date | 广告系列活动的日期(Unix 纪元时间戳) | int | 必需 |
impressions | 此广告系列在此日期获得的展示次数 | int | 必需 |
clicks | 此广告系列在此日期获得的点击次数 | int | 必需 |
转化次数增幅 | 此广告系列在此日期促成的转化次数 | int | 必需 |
cost | 此广告系列在此日期的总费用 | int | 必需 |
比较兴趣相似的受众群体和标签
找出您的第一方细分受众群与 Google 提供的兴趣相似的细分受众群和有购买意向的细分受众群之间的重叠部分。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
应用转化分析
衡量广告系列对应用内行为的影响。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
date | 移动应用活动的日期(Unix 纪元时间戳) | int | 必需 |
安装 | 表示当天是否记录了安装事件的布尔值 | 布尔值 | 必需 |
注册 | 表示是否在这一天记录了注册事件的布尔值 | 布尔值 | 必需 |
login | 表示当天是否记录了登录事件的布尔值 | 布尔值 | 必需 |
应用内购 | 当日的应用内购买总次数 | int | 必需 |
计算投资回报率
根据第一方转化数据衡量回报增量。
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
transaction_id | 此交易的唯一 ID | 字符串 | 必需 |
transaction_date | 交易日期(Unix 纪元时间戳) | int | 必需 |
交易收入 | 交易收入 | int | 必需 |
currency | 交易的货币类型 | 字符串 | 选填 |
quantity | 交易中的商品数量 | 字符串 | 选填 |
price | 交易中每件商品的价格 | int | 选填 |
交易费用 | 交易产生的商品 / 服务费用 | int | 选填 |
交易利润 | 交易带来的毛利润 | int | 选填 |
product_id | 交易中的产品的 SKU / ID | 字符串 | 选填 |
交易说明 | 有关交易的其他说明 / 元数据 / 参数 | 字符串 | 选填 |
启用自定义受众群体
基于您的第一方数据和 Google 数据构建并启用自定义细分用户群
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
自定义出价
根据您的第一方数据和 Google 数据优化 Display & Video 360 出价策略
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |
在不同发布商网站上的效果
衡量按发布商划分或者按发布商和第一方细分用户群进行划分的效果指标
字段名称 | 说明 | 类型 | 必需/可选 |
---|---|---|---|
联接键 | 根据您使用的连接键而发生的变化 | 字符串 | 必需 |
性别 | 性别 | 字符串 | 选填 |
年龄 | 年龄 | int | 选填 |
城市 | 城市 | 字符串 | 选填 |
国家/地区 | 国家/地区 | 字符串 | 选填 |
生命周期状态 | 客户漏斗状态:未知、新手入门、感兴趣、已流失等 | 字符串 | 选填 |
会员卡状态 | 白银、黄金、白金、钻石等 | 字符串 | 选填 |
上次购买日期 | 上次购买的日期(Unix 纪元时间戳) | int | 选填 |
上次购买产品时间 | 上次购买 / 消耗的商品 | 字符串 | 选填 |
上次联系日期 | 上次联系 / 互动的日期(Unix 纪元时间戳) | int | 选填 |
生命周期价值 | 客户生命周期价值 | int | 选填 |
订阅类型 | 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 | 字符串 | 选填 |