用户提供的数据匹配

概览

UPDM(用户提供的数据匹配)会将您收集的关于用户的第一方数据(例如从您的网站、应用或实体店收集的信息)与该用户在 Google 广告数据(不包括 Google Marketing Platform)中记录的同一登录活动合并。为了符合用户提供的数据匹配的条件,广告事件必须与 Google 广告数据中已登录的用户相关联。

与其他形式目标客户匹配相比,用户提供的数据匹配具有一些独特的优势。用户提供的数据匹配:

  • 比第三方数据更能抵御行业变化
  • 不受第三方 Cookie 即将停用的影响,因为用户提供的数据匹配仅适用于 Google 自有自营的广告资源(面向已登录的用户)
  • 可以提供更具相关性的客户体验,这通常可以提高客户互动度
  • 提供更丰富的客户数据洞见

流程摘要

为您的帐号提供用户提供的数据匹配后,持续使用该功能需要两个阶段:

  1. 将第一方数据提取到广告数据中心
    • 设置格式并将第一方数据上传到 BigQuery 数据集。除管理项目外,您可以使用自己拥有的任何 BigQuery 数据集。
    • 通过创建连接和导入时间表来发起数据匹配请求。
    • Google 会将您的项目和 Google 自有数据(包含 Google 的用户 ID 和经过哈希处理的用户提供的数据)连接起来,以构建和更新 *_match 表。
  2. 广告数据中心中基于匹配数据的持续查询
    • 您向 *_match运行查询的方式与在 Google Ads 数据中心中运行常规查询的方式相同。

数据源和目标项目

如需使用连接,您需要使用两个不同的 Google Cloud 项目:数据源项目和目标项目。

  • 数据源:此项目以原始格式包含您的专有广告数据。
  • 目标:这是广告数据中心写入的 BigQuery 数据集。默认情况下,这是您的管理项目。如需将其更改为其他 Google Cloud 项目,请参阅配置服务帐号

隐私权限制

收集客户数据

使用用户提供的数据匹配时,您必须上传第一方数据。可以是您从网站、应用、实体店收集的信息,也可以是客户直接与您分享的任何信息。

数据大小

为了保护最终用户的隐私,用户提供的数据匹配强制执行以下有关数据大小的要求:

  • 您必须在用户列表中上传至少 1000 条记录。
  • 匹配表每次成功更新后,新添加的用户都必须至少达到一个下限。此行为与差异检查类似。
  • 您的列表不得超过记录数上限。如需了解数据量上限,请与您的 Google 代表联系。

启用“连接”标签页

在开始之前,请配置您的广告数据中心帐号以启用“连接”标签页,您可以在其中建立数据匹配流水线。您只需执行一次这些步骤。

  1. 向您的 Google 代表发送以下信息:
    1. 您要使用的用户数据中心数据 ID 所对应的广告数据中心帐号 ID。
    2. 有权访问您的 Destination 项目的超级用户电子邮件地址。
    3. 与您的 Google 代表联系,确认相应帐号和超级用户已列入许可名单。
  2. 在指定的 Google Cloud 项目中启用 Ads Data Connector API。默认情况下,这是您的管理员项目。如需使用其他项目,请按照以下步骤操作,并将备用 Google Cloud 项目作为数据源。您必须以列入许可名单的超级用户的身份登录,才能执行以下步骤。

    1. 转到 Cloud Console API 库
    2. 从列表中选择您的数据源项目。
    3. 搜索“Ads Data Connector API”。如果 Google Ads Data Connector API 未显示在搜索结果中,则说明已登录的 Google 帐号不是已列入许可名单的超级用户。
    4. 在 API 页面上,点击启用
    5. 与您的 Google 代表联系,确认该 API 已启用。
  3. 您的 Google 代表会向您发送三个电子邮件地址,分别指定为 DatafusionDataprocUPDM 服务帐号。

    您的广告数据中心帐号中还将显示一个新的连接部分,其中包含一个名为您的第一方数据数据匹配的标签页。了解每个标签页的用例

  4. 向服务帐号授予适当的权限。如需了解不同服务帐号及其所需权限的说明,请在表中选择您的数据源:

    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 AmericaUSA

邮政编码

  • 请勿对邮政编码数据进行哈希处理
  • 美国邮编和国际邮编均可使用
  • 对于美国:
    • 可以使用 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`;

联接键

用户提供的数据的某些组合比其他组合更强大。下面列出了用户提供的不同数据组合(按相对强度排序):

  1. 电子邮件地址、电话号码、地址(最强)
  2. 电话、地址
  3. 电子邮件地址、地址
  4. 电子邮件、电话
  5. 地址
  6. 手机
  7. 电子邮件(最弱)

创建匹配表

  1. 点击连接 &gt;数据匹配 &gt;创建连接
  2. 选择数据源,然后点击连接。根据系统提示进行身份验证,然后点击下一步
  3. 配置数据源,然后点击下一步

    BigQuery

    选择要导入的 BigQuery 表。

    Cloud Storage

    输入 gsutil 文件路径(例如 gs://my-bucket/folder/),然后选择文件的格式。

    Salesforce

    即将推出

  4. 设置 destination,然后点击 Next
    1. 选择一个新的 BigQuery 数据集作为数据的中间目标位置。此步骤可确保您的数据采用正确的格式
  5. 可选:修改数据格式。转换包括计算哈希、小写/大写格式以及合并/拆分字段。
    1. 点击操作 &gt; &gt;转换
    2. 在弹出的面板中,点击添加转换添加其他转换
    3. 从下拉菜单中选择转换类型,然后输入要求。
    4. 点击保存
  6. 请选择至少一个联接键来映射要使用的字段,然后点击下一步
  7. 设置时间表:
    1. 为连接命名。
    2. 设置频率,指示将数据导入您在上一步中选择的数据集的频率。每次运行都将覆盖 destination 表中的数据。
    3. 指定如何处理用户 ID 冲突。您可以选择保留现有的匹配项,也可以覆盖新数据。
  8. 点击 Finish

查看连接详细信息

连接详情页面为您提供了有关给定连接最近的运行和错误的信息。要查看特定连接的详细信息,请执行以下操作:

  1. 点击连接 &gt;数据匹配
  2. 点击连接的名称以查看其详细信息。
  3. 您现在可以查看连接的详情和最近的运行。每种错误都会显示两种类型的错误:连接级错误(连接未运行)和行级错误(行未导入)。
    1. 失败状态表示整个连接运行失败(例如,服务帐号权限问题)。点击错误状态可查看哪些错误影响了连接。
    2. “已完成”状态表示连接已成功运行。 但是,可能仍存在行级错误 - 在“出错的行数”列中显示为非零值。点击该值可详细了解失败的记录。

修改连接

尚不支持修改连接。如需更改连接,请创建一个新连接,然后删除旧连接。

查询广告数据中心中的数据

查询匹配表

当您的匹配表包含足够的数据以满足隐私设置检查要求时,您就可以针对这些表运行查询了。广告数据中心架构中的每个表均包含一个 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)。选择哪些列包含个人身份信息后,连接就会对数据进行加密,确保只有有权导出或读取您的第一方数据的用户才能执行这些操作。

您可以使用连接从以下位置导入数据:

了解衡量或激活用例需要哪些第一方数据可能很困难,因此 Connections 提供了一个完整的预定义用例列表,然后指导您完成提取、转换和加载数据的整个体验。

第一方数据与数据匹配之间的区别

配置用户提供的匹配表的工作流类似于通过 Connections 创建常规第一方数据连接。但是,双项目要求假设您在使用用户提供的数据匹配之前设置了连接。如果您仅将连接用作数据准备工具,则可以使用单个 Google Cloud 项目。

针对用户提供的数据匹配的其他要求:

  • 您必须使用电子邮件地址、电话号码、地址或任意组合作为联接键。
  • 您必须指定如何解决 user_id 冲突。您可以选择保留现有的匹配项,也可以用新数据覆盖。
  • 除了 Datafusion 和 Chromebox 帐号外,您还必须使用 UPDM 服务帐号。

您的第一方数据工作流程

创建连接

  1. 依次点击连接 > 您的第一方数据 > 创建连接
  2. 连接到数据源。系统会提示您进行身份验证。

    BigQuery

    权限基于您的 Google 帐号,因此无需额外进行身份验证。确保连接服务帐号拥有表的读取权限。

    Cloud Storage

    权限基于您的 Google 帐号,因此无需额外进行身份验证。确保连接服务帐号拥有存储分区的读取权限。

    Salesforce

    (即将推出)

    使用您单位的 Salesforce 凭据登录。 Google 不会存储您的凭据,因此每个新的 Salesforce 连接都需要重新进行身份验证。

  3. 选择一个用例联接键,然后点击选择用例。如果您不想选择用例,请点击跳过。 您以后无法再选择用例。
  4. 配置数据源

    BigQuery

    选择要导入的 BigQuery 表。

    Cloud Storage

    输入 gsutil 文件路径(例如 gs://my-bucket/folder/),然后选择文件的格式。

    Salesforce

    即将发布

  5. 配置目的地和映射字段。
    • 选择要写入结果的 Google Cloud 项目、数据集和表。确保连接服务帐号对您要写入的数据集具有写入权限。
    • 每个连接都会创建一个新表来写入数据。如果您选择已存在的表,则会看到错误。
    • 将目标字段(将显示在您要创建的表中的字段)映射到源数据中的源字段。
  6. 设置时间表。
    1. 为连接命名。
    2. 设置频率,指示将数据导入您在上一步中选择的数据集的频率。每次运行都将覆盖 destination 表中的数据。
  7. 点击完成。处理大量数据的连接可能需要运行数小时。

查看连接详细信息

连接详情页面为您提供了有关给定连接最近的运行和错误的信息。要查看特定连接的详细信息,请执行以下操作:

  1. 点击连接 &gt 您的第一方数据
  2. 点击连接的名称以查看其详细信息。
  3. 您现在可以查看连接的详情和最近的运行。每种错误都会显示两种类型的错误:连接级错误(连接未运行)和行级错误(行未导入)。
    1. 失败状态表示整个连接运行失败(例如,服务帐号权限问题)。点击错误状态可查看哪些错误影响了连接。
    2. “已完成”状态表示连接已成功运行。 但是,可能仍存在行级错误 - 在“出错的行数”列中显示为非零值。点击该值可详细了解失败的记录。

修改连接

尚不支持修改连接。如需更改连接,请创建一个新连接并删除旧连接。

使用场景

您选择的用例会影响目标表架构和导入的联接键字段。请展开下面的用例,了解它们如何影响架构和联接键:

覆盖面和频次

衡量广告系列在不同渠道和设备上的覆盖面和频次,按第一方细分用户群进行划分。

字段名称 说明 类型 必需/可选
联接键 根据您使用的连接键而发生的变化 字符串 必需
性别 性别 字符串 选填
年龄 年龄 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 选填
订阅类型 客户拥有的子产品 / 订阅类型 - 例如豪华版、家庭方案 字符串 选填