사용자 제공 데이터 매칭

사용자 제공 데이터 매칭 (UPDM)은 웹사이트, 앱, 오프라인 상점의 정보와 같이 사용자에 관해 수집한 퍼스트 파티 데이터를 Google 소유 및 운영 데이터를 포함한 모든 Google 광고 데이터에 있는 동일한 사용자의 로그인 활동과 결합합니다. 여기에는 Google Marketing Platform(GMP) 제품을 통해 구매한 데이터(예: Display & Video 360을 사용하여 구매한 YouTube)가 포함됩니다. Google 소유 및 운영이 아닌 기타 GMP 제품은 지원되지 않습니다.

사용자 제공 데이터 매칭에 사용하려면 광고 이벤트를 Google 광고 데이터에서 로그인한 사용자와 연결해야 합니다.

이 문서에서는 사용자 제공 데이터 매칭 기능을 설명하고 설정 및 사용에 관한 안내를 제공합니다.

프라이빗 클라우드 데이터 이동 개요

광고에 대한 유용한 통계를 얻으려면 여러 소스의 데이터를 연결해야 하는 경우가 많습니다. 이 데이터 파이프라인 문제를 해결하기 위한 자체 솔루션을 빌드하려면 상당한 시간과 엔지니어링 투자가 필요합니다. Ads Data Hub의 비공개 클라우드 매치는 BigQuery에서 일치 테이블을 만드는 Ads Data Hub 쿼리 템플릿을 제공하여 이 프로세스를 간소화합니다. 이 테이블은 Ads Data Hub 쿼리에서 광고 데이터를 퍼스트 파티 데이터와 일치시키는 데 사용할 수 있습니다. 퍼스트 파티 데이터로 쿼리를 보강하면 더욱 풍부한 고객 경험을 제공할 수 있고 업계 전반의 광고 추적 변화에 더 잘 대처할 수 있습니다.

로그인한 사용자의 경우 Google이 소유하고 운영하는 인벤토리에서만 사용자 제공 데이터 매칭을 사용할 수 있으므로 곧 있을 서드 파티 쿠키 지원 중단으로 인한 영향을 받지 않습니다. 퍼스트 파티 데이터는 서드 파티 데이터보다 업계 변화에 대한 저항력이 더 강하므로 더 풍부한 통계를 제공할 수 있으며, 이는 고객 참여도 증가로 이어질 수 있습니다.

프로세스 요약

  1. 데이터 수집 및 매칭 설정
    • 퍼스트 파티 데이터가 BigQuery에 있고 서비스 계정에 읽기 액세스 권한이 있는지 확인합니다. 데이터 수집 설정을 참고하세요.
  2. 퍼스트 파티 데이터 수집 및 매칭
    • 사용자가 자사 데이터를 BigQuery 데이터 세트에 형식화하고 업로드합니다.
    • 사용자는 Private Cloud Match 분석 쿼리를 만들고 일정을 설정하여 데이터 매칭 요청을 시작합니다.
    • Google은 프로젝트와 Google 소유 데이터 간의 데이터를 결합하여 Google의 사용자 ID와 해싱된 사용자 제공 데이터를 포함하여 일치 테이블을 빌드하고 업데이트합니다.
    • 퍼스트 파티 데이터 수집 참고
  3. 일치하는 데이터를 기반으로 Ads Data Hub에서 실행 중인 쿼리
    • 사용자는 Ads Data Hub에서 일반 쿼리를 실행하는 것과 동일한 방식으로 데이터 이동 색인에 대해 쿼리를 실행합니다. 일치하는 데이터 쿼리를 참고하세요.

개인 정보 보호 요구사항 알아보기

고객 데이터 수집

사용자 제공 데이터 매칭을 사용하는 경우 퍼스트 파티 데이터를 업로드해야 합니다. 여기에는 웹사이트, 앱, 오프라인 상점에서 수집한 정보 또는 고객이 직접 공유한 정보가 포함될 수 있습니다.

상담사는 다음 작업을 수행해야 합니다.

  • 개인정보처리방침에 광고주를 대신하여 서비스를 수행하기 위해 고객 데이터를 제3자와 공유한다는 사실을 공개하고, 법적으로 필요한 경우 고객의 동의를 구합니다.
  • 고객 데이터 업로드 시 Google의 승인된 API 또는 인터페이스만 사용해야 합니다.
  • 적용되는 자체 규제 또는 업계 규정을 비롯한 모든 관련 법률 및 규정을 준수해야 합니다.

퍼스트 파티 동의 확인

Ads Data Hub에서 퍼스트 파티 데이터를 사용하려면 EU 사용자 동의 정책Ads Data Hub 정책에 따라 데이터를 Google과 공유하기 위해 적절한 동의를 얻었음을 확인해야 합니다. 이 요건은 각 Ads Data Hub 계정에 적용되며, 새로운 퍼스트 파티 데이터를 업로드할 때마다 업데이트해야 합니다. 어느 사용자나 계정 전체를 대신하여 이를 확인할 수 있습니다.

분석 쿼리에 적용되는 것과 동일한 Google 서비스 쿼리 규칙이 UPDM 쿼리에도 적용됩니다. 예를 들어 데이터 이동 색인을 만들 때 EEA의 사용자에게 교차 서비스 쿼리를 실행할 수 없습니다.

Ads Data Hub에서 동의를 확인하는 방법은 유럽 경제 지역의 동의 요건을 참고하세요.

데이터 크기

최종 사용자 개인 정보를 보호하기 위해 사용자 제공 데이터 매칭에서는 데이터 크기에 관한 다음 요구사항을 적용합니다.

  • 사용자 목록에 레코드를 1,000개 이상 업로드해야 합니다.

데이터 수집 설정

시작하기 전에 다음 사항을 확인하세요.

  • 퍼스트 파티 데이터는 BigQuery에 있어야 합니다. VPC-SC 경계가 있는 경우 이 퍼스트 파티 데이터는 VPC-SC 내에 있어야 합니다.
  • Ads Data Hub 서비스 계정에 퍼스트 파티 데이터에 대한 읽기 액세스 권한이 있어야 합니다.
  • 퍼스트 파티 데이터의 형식이 올바르고 해싱되어야 합니다. 자세한 내용은 다음 섹션을 참고하세요.

그 외에는 Private Cloud Match에 추가 온보딩이 없습니다. 분석 쿼리를 실행할 수 있으면 비공개 클라우드 일치 쿼리를 실행할 수 있습니다.

퍼스트 파티 데이터 수집 및 매칭

입력 데이터 형식 지정

데이터가 올바르게 일치하려면 다음 형식 요구사항을 준수해야 합니다.

  • 다음 입력 필드 설명에 표시된 경우 SHA256 해싱을 사용하여 업로드해야 합니다.
  • 입력 필드는 문자열로 형식이 지정되어야 합니다. 예를 들어 Base64 인코딩 함수(TO_BASE64)와 함께 BigQuery의 SHA256 해시 함수를 사용하는 경우 TO_BASE64(SHA256(user_data)) 변환을 사용합니다.
  • UPDM은 Base64 인코딩을 지원합니다. 퍼스트 파티 데이터의 인코딩은 Ads Data Hub 쿼리에서 사용되는 디코딩과 일치해야 합니다. 퍼스트 파티 데이터 인코딩을 변경하는 경우 동일한 기본값에서 디코딩하도록 Ads Data Hub 쿼리를 업데이트해야 합니다. 다음 예에서는 Base64 인코딩을 사용합니다.

사용자 ID

  • 일반 텍스트
  • 해싱: 없음

이메일

  • 선행 및 후행 공백 삭제
  • 소문자로만 입력하세요.
  • 모든 이메일 주소에 도메인 이름(예: gmail.com 또는 hotmail.co.jp)을 포함하세요.
  • 악센트 삭제: 예를 들어 è, é, ê, ë를 e로 변경
  • gmail.comgooglemail.com 이메일 주소의 도메인 이름 앞에 있는 모든 마침표 (.)를 삭제합니다.
  • 해싱: Base64 인코딩 SHA256

유효함: TO_BASE64(SHA256("jeffersonloveshiking@gmail.com"))

잘못됨: TO_BASE64(SHA256(" Jéfferson.Lôves.Hiking@gmail.com "))

전화

  • 공백 제거
  • E.164 형식으로 형식을 지정합니다. 미국 예: +14155552671, 영국 예: +442071838750
  • 국가 코드 앞의 '+'를 제외한 모든 특수문자를 삭제합니다.
  • 해싱: Base64 인코딩 SHA256

유효함: TO_BASE64(SHA256("+18005550101"))

잘못됨: TO_BASE64(SHA256("(800) 555-0101"))

이름

  • 공백 제거
  • 소문자로만 입력하세요.
  • 모든 접두사(예: Mrs., Mr., Ms., 박사
  • è, é, ê, ë와 같은 악센트를 삭제하지 마세요.
  • 해싱: Base64 인코딩 SHA256

유효함: TO_BASE64(SHA256("daní"))

잘못됨: TO_BASE64(SHA256("Mrs. Daní"))

  • 공백 제거
  • 소문자로만 입력하세요.
  • 모든 접미사를 삭제합니다(예: Jr., Sr., 2nd, 3rd, II, III, PHD, MD
  • è, é, ê, ë와 같은 악센트를 삭제하지 마세요.
  • 해싱: Base64 인코딩 SHA256

유효함: 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).
  • 기타 모든 국가:
    • 형식 지정이 필요하지 않습니다 (소문자로 변환하거나 공백 및 특수문자를 삭제할 필요가 없음).
    • 우편번호 확장은 비워 두세요.
  • 해싱: 없음

해시 검증 및 데이터 인코딩

다음 해시 유효성 검사 스크립트를 사용하여 데이터 형식이 올바른지 확인할 수 있습니다.

자바스크립트

  /**
   * @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()

Go

  /*
  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`;

통합 키

사용자 제공 데이터의 일부 조합은 다른 조합보다 강력합니다. 다음은 상대적 강도에 따라 순위가 매겨진 다양한 사용자 제공 데이터 조합의 목록입니다. 주소를 사용하는 경우 이름, 성, 국가, 우편번호를 포함해야 합니다.

  1. 이메일, 전화, 주소 (가장 강력함)
  2. 전화, 주소
  3. 이메일, 주소
  4. 이메일, 전화
  5. 주소
  6. 전화
  7. 이메일 (가장 약함)

일치 테이블 만들기

  1. 보고서 > 보고서 만들기 > 프라이빗 클라우드 데이터 이동 색인 생성 > 템플릿 사용을 클릭합니다. 선택사항: 데이터가 아직 해싱되지 않은 경우 프라이빗 클라우드 데이터 이동 색인 생성(해싱 포함)을 선택할 수 있습니다.

    // 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`
    );
    
  2. 매개변수 이름을 열 이름으로 바꿔 적절한 별칭을 제공합니다.

  3. 일정 설정을 클릭하여 일치 테이블을 새로고침할 빈도를 설정합니다. 실행할 때마다 현재 일치 테이블이 덮어쓰여집니다.

일치하는 데이터 쿼리

일치 테이블 쿼리

데이터 이동 색인에 개인 정보 보호 검사를 충족하기에 충분한 데이터가 포함되어 있으면 테이블에 대해 쿼리를 실행할 수 있습니다.

퍼스트 파티 데이터 (1PD)의 원본 테이블은 my_data로 표시됩니다. 여기에는 개인 식별 정보 (PII)와 비PII 데이터가 모두 포함됩니다. 원본 테이블을 사용하면 데이터 이동 색인과 비교했을 때 범위 내의 모든 퍼스트 파티 데이터를 나타내므로 보고서의 유용한 정보를 늘릴 수 있습니다.

user_id 필드가 포함된 Ads Data Hub 스키마의 각 테이블에 데이터 매칭 테이블이 함께 제공됩니다. 예를 들어 adh.google_ads_impressions 테이블의 경우 Ads Data Hub는 사용자 ID가 포함된 adh.google_ads_impressions_updm라는 데이터 이동 색인도 생성합니다. 정책에 따라 격리된 네트워크 테이블의 경우 별도의 데이터 이동 색인이 생성됩니다. 예를 들어 adh.google_ads_impressions_policy_isolated_network 테이블의 경우 Ads Data Hub는 사용자 ID가 포함된 adh.google_ads_impressions_policy_isolated_network_updm라는 데이터 이동 색인도 생성합니다.

이러한 테이블에는 user_id에 일치하는 항목이 있는 원본 테이블에서 사용 가능한 사용자의 하위 집합이 포함됩니다. 예를 들어 원본 테이블에 사용자 A와 사용자 B의 데이터가 포함되어 있지만 사용자 A만 일치하는 경우 사용자 B는 데이터 이동 색인에 포함되지 않습니다.

데이터 이동 색인에는 사용자 식별자를 BYTES로 저장하는 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 필드는 2024년 10월 1일부터 사용할 수 있습니다. 이 날짜 이전에는 이 필드를 사용하여 일치율을 계산할 수 없습니다.

/* 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 FAQ

UPDM 관련 FAQ 목록은 UPDM FAQ를 참고하세요.