Conversion ที่ปรับปรุงแล้ว

Conversion API ออฟไลน์ของ CM360 รองรับการเพิ่มประสิทธิภาพตามแท็กเว็บไซต์ Conversion ด้วยตัวระบุผู้ใช้

Conversion ที่ปรับปรุงแล้ว

  • ยอมรับข้อกําหนดของ Conversion ที่ปรับปรุงแล้ว บริการสำหรับ Floodlight การกำหนดค่าใน CM360
  • วัดคุมเว็บไซต์ด้วย Match ID
  • บันทึก Conversion ของ Floodlight ที่เกิดขึ้นในเว็บไซต์ อย่าลืมบันทึก ข้อมูลทั้งหมดต่อไปนี้เนื่องจากเป็นช่องที่ต้องกรอกในการเรียก API ครั้งต่อๆ ไป
    • matchId
    • ordinal
    • timestampMicros
    • floodlightActivityId
    • floodlightConfigurationId
    • quantity
    • value
  • หลังจากผ่านไป 90 นาทีนับตั้งแต่แท็กออนไลน์บันทึก Conversion โทรหา conversions.batchupdate เพื่อเพิ่มประสิทธิภาพรายการเหล่านี้ Conversion ด้วยตัวระบุผู้ใช้
    • ตัวระบุผู้ใช้ควรจัดรูปแบบและแฮชแล้ว แล้วเพิ่มลงใน ช่อง userIdentifiers ในออบเจ็กต์ Conversion
    • ต้องระบุจำนวนและค่า คุณสามารถเลือกปรับจำนวนและมูลค่าของ Conversion ได้ใน การเรียกใช้ conversions.batchupdate เดียวกัน หรือระบุจำนวนเดิมและ
    • ส่วนแทรกและการอัปเดตแต่ละกลุ่มสามารถผสมผสานทั้งความสำเร็จและ ควรลองดำเนินการไม่สำเร็จ NOT_FOUND รายการอีกครั้งเผื่อในกรณีที่เวลา ทำให้การประมวลผล Conversion ล่าช้ากว่าปกติถึง 6 ชั่วโมง
    • ต้องเพิ่มประสิทธิภาพ Conversion ด้วยตัวระบุผู้ใช้ภายใน 24 ชั่วโมงหลังจาก แล้วจะบันทึกโดยแท็กออนไลน์

การทำให้เป็นมาตรฐานและการแฮช

เพื่อช่วยปกป้องความเป็นส่วนตัว อีเมล หมายเลขโทรศัพท์ ชื่อ นามสกุล ต้องแฮชชื่อและที่อยู่ถนนโดยใช้อัลกอริทึม SHA-256 กำลังอัปโหลด ปรับผลลัพธ์แฮชให้เป็นมาตรฐานก่อนแฮช 1 รายการ คุณต้องมีคุณสมบัติต่อไปนี้

  • นําช่องว่างขึ้นต้นหรือต่อท้ายออก
  • แปลงข้อความให้เป็นตัวพิมพ์เล็ก
  • จัดรูปแบบหมายเลขโทรศัพท์ตามมาตรฐาน E164
  • นำจุด (.) ที่อยู่ก่อนชื่อโดเมนใน gmail.com ออกทั้งหมด และ googlemail.com อีเมล

C#

/// <summary>
/// Normalizes the email address and hashes it. For this use case, Campaign Manager 360
/// requires removal of any '.' characters preceding <code>gmail.com</code> or
/// <code>googlemail.com</code>.
/// </summary>
/// <param name="emailAddress">The email address.</param>
/// <returns>The hash code.</returns>
private string NormalizeAndHashEmailAddress(string emailAddress)
{
    string normalizedEmail = emailAddress.ToLower();
    string[] emailParts = normalizedEmail.Split('@');
    if (emailParts.Length > 1 && (emailParts[1] == "gmail.com" ||
        emailParts[1] == "googlemail.com"))
    {
        // Removes any '.' characters from the portion of the email address before
        // the domain if the domain is gmail.com or googlemail.com.
        emailParts[0] = emailParts[0].Replace(".", "");
        normalizedEmail = $"{emailParts[0]}@{emailParts[1]}";
    }
    return NormalizeAndHash(normalizedEmail);
}

/// <summary>
/// Normalizes and hashes a string value.
/// </summary>
/// <param name="value">The value to normalize and hash.</param>
/// <returns>The normalized and hashed value.</returns>
private static string NormalizeAndHash(string value)
{
    return ToSha256String(digest, ToNormalizedValue(value));
}

/// <summary>
/// Hash a string value using SHA-256 hashing algorithm.
/// </summary>
/// <param name="digest">Provides the algorithm for SHA-256.</param>
/// <param name="value">The string value (e.g. an email address) to hash.</param>
/// <returns>The hashed value.</returns>
private static string ToSha256String(SHA256 digest, string value)
{
    byte[] digestBytes = digest.ComputeHash(Encoding.UTF8.GetBytes(value));
    // Convert the byte array into an unhyphenated hexadecimal string.
    return BitConverter.ToString(digestBytes).Replace("-", string.Empty);
}

/// <summary>
/// Removes leading and trailing whitespace and converts all characters to
/// lower case.
/// </summary>
/// <param name="value">The value to normalize.</param>
/// <returns>The normalized value.</returns>
private static string ToNormalizedValue(string value)
{
    return value.Trim().ToLower();
}

Java

private String normalizeAndHash(MessageDigest digest, String s)
    throws UnsupportedEncodingException {
  // Normalizes by removing leading and trailing whitespace and converting all characters to
  // lower case.
  String normalized = s.trim().toLowerCase();
  // Hashes the normalized string using the hashing algorithm.
  byte[] hash = digest.digest(normalized.getBytes("UTF-8"));
  StringBuilder result = new StringBuilder();
  for (byte b : hash) {
    result.append(String.format("%02x", b));
  }

  return result.toString();
}

/**
 * Returns the result of normalizing and hashing an email address. For this use case, Campaign Manager 360
 * requires removal of any '.' characters preceding {@code gmail.com} or {@code googlemail.com}.
 *
 * @param digest the digest to use to hash the normalized string.
 * @param emailAddress the email address to normalize and hash.
 */
private String normalizeAndHashEmailAddress(MessageDigest digest, String emailAddress)
    throws UnsupportedEncodingException {
  String normalizedEmail = emailAddress.toLowerCase();
  String[] emailParts = normalizedEmail.split("@");
  if (emailParts.length > 1 && emailParts[1].matches("^(gmail|googlemail)\\.com\\s*")) {
    // Removes any '.' characters from the portion of the email address before the domain if the
    // domain is gmail.com or googlemail.com.
    emailParts[0] = emailParts[0].replaceAll("\\.", "");
    normalizedEmail = String.format("%s@%s", emailParts[0], emailParts[1]);
  }
  return normalizeAndHash(digest, normalizedEmail);
}

PHP

private static function normalizeAndHash(string $hashAlgorithm, string $value): string
{
    return hash($hashAlgorithm, strtolower(trim($value)));
}

/**
  * Returns the result of normalizing and hashing an email address. For this use case, Campaign
  * Manager 360 requires removal of any '.' characters preceding "gmail.com" or "googlemail.com".
  *
  * @param string $hashAlgorithm the hash algorithm to use
  * @param string $emailAddress the email address to normalize and hash
  * @return string the normalized and hashed email address
  */
private static function normalizeAndHashEmailAddress(
    string $hashAlgorithm,
    string $emailAddress
): string {
    $normalizedEmail = strtolower($emailAddress);
    $emailParts = explode("@", $normalizedEmail);
    if (
        count($emailParts) > 1
        && preg_match('/^(gmail|googlemail)\.com\s*/', $emailParts[1])
    ) {
        // Removes any '.' characters from the portion of the email address before the domain
        // if the domain is gmail.com or googlemail.com.
        $emailParts[0] = str_replace(".", "", $emailParts[0]);
        $normalizedEmail = sprintf('%s@%s', $emailParts[0], $emailParts[1]);
    }
    return self::normalizeAndHash($hashAlgorithm, $normalizedEmail);
}

Python

def normalize_and_hash_email_address(email_address):
    """Returns the result of normalizing and hashing an email address.

    For this use case, Campaign Manager 360 requires removal of any '.'
    characters preceding "gmail.com" or "googlemail.com"

    Args:
        email_address: An email address to normalize.

    Returns:
        A normalized (lowercase, removed whitespace) and SHA-265 hashed string.
    """
    normalized_email = email_address.lower()
    email_parts = normalized_email.split("@")
    # Checks whether the domain of the email address is either "gmail.com"
    # or "googlemail.com". If this regex does not match then this statement
    # will evaluate to None.
    is_gmail = re.match(r"^(gmail|googlemail)\.com$", email_parts[1])

    # Check that there are at least two segments and the second segment
    # matches the above regex expression validating the email domain name.
    if len(email_parts) > 1 and is_gmail:
        # Removes any '.' characters from the portion of the email address
        # before the domain if the domain is gmail.com or googlemail.com.
        email_parts[0] = email_parts[0].replace(".", "")
        normalized_email = "@".join(email_parts)

    return normalize_and_hash(normalized_email)

def normalize_and_hash(s):
    """Normalizes and hashes a string with SHA-256.

    Private customer data must be hashed during upload, as described at:
    https://support.google.com/google-ads/answer/7474263

    Args:
        s: The string to perform this operation on.

    Returns:
        A normalized (lowercase, removed whitespace) and SHA-256 hashed string.
    """
    return hashlib.sha256(s.strip().lower().encode()).hexdigest()

Ruby

# Returns the result of normalizing and then hashing the string using the
# provided digest.  Private customer data must be hashed during upload, as
# described at https://support.google.com/google-ads/answer/7474263.
def normalize_and_hash(str)
  # Remove leading and trailing whitespace and ensure all letters are lowercase
  # before hasing.
  Digest::SHA256.hexdigest(str.strip.downcase)
end

# Returns the result of normalizing and hashing an email address. For this use
# case, Campaign Manager 360 requires removal of any '.' characters preceding
# 'gmail.com' or 'googlemail.com'.
def normalize_and_hash_email(email)
  email_parts = email.downcase.split("@")
  # Removes any '.' characters from the portion of the email address before the
  # domain if the domain is gmail.com or googlemail.com.
  if email_parts.last =~ /^(gmail|googlemail)\.com\s*/
    email_parts[0] = email_parts[0].gsub('.', '')
  end
  normalize_and_hash(email_parts.join('@'))
end

เพิ่มตัวระบุผู้ใช้ลงใน Conversion

ก่อนอื่น ให้เตรียมออบเจ็กต์ Conversion สำหรับการอัปโหลด หรือ แก้ไขตามปกติ จากนั้นแนบตัวระบุผู้ใช้ดังนี้

{
  "matchId": "my-match-id-846513278",
  "ordinal": "my-ordinal-12345678512",
  "quantity": 1,
  "value": 104.23,
  "timestampMicros": 1656950400000000,
  "floodlightConfigurationId": 99999,
  "floodlightActivityId": 8888,
  "userIdentifiers": [
    { "hashedEmail": "0c7e6a405862e402eb76a70f8a26fc732d07c32931e9fae9ab1582911d2e8a3b" },
    { "hashedPhoneNumber": "1fb1f420856780a29719b994c8764b81770d79f97e2e1861ba938a7a5a15dfb9" },
    {
      "addressInfo": {
        "hashedFirstName": "81f8f6dde88365f3928796ec7aa53f72820b06db8664f5fe76a7eb13e24546a2",
        "hashedLastName": "799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f",
        "hashedStreetAddress": "22b7e2d69b91e0ef4a88e81a73d897b92fd9c93ccfbe0a860f77db16c26f662e",
        "city": "seattle",
        "state": "washington",
        "countryCode": "US",
        "postalCode": "98101"
      }
    }
  ]
}

คำตอบที่ประสบความสำเร็จควรมีลักษณะดังนี้

{
  "hasFailures": false,
  "status": [
    {
      "conversion": {
        "floodlightConfigurationId": 99999,
        "floodlightActivityId": 8888,
        "timestampMicros": 1656950400000000,
        "value": 104.23,
        "quantity": 1,
        "ordinal": "my-ordinal-12345678512",
        "matchId": "my-match-id-846513278",
        "userIdentifiers": [
          { "hashedEmail": "0c7e6a405862e402eb76a70f8a26fc732d07c32931e9fae9ab1582911d2e8a3b" },
          { "hashedPhoneNumber": "1fb1f420856780a29719b994c8764b81770d79f97e2e1861ba938a7a5a15dfb9" },
          {
            "addressInfo": {
              "hashedFirstName": "81f8f6dde88365f3928796ec7aa53f72820b06db8664f5fe76a7eb13e24546a2",
              "hashedLastName": "799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f",
              "hashedStreetAddress": "22b7e2d69b91e0ef4a88e81a73d897b92fd9c93ccfbe0a860f77db16c26f662e",
              "city": "seattle",
              "state": "washington",
              "countryCode": "US",
              "postalCode": "98101"
            }
          }
        ],
        "kind": "dfareporting#conversion"
      },
      "kind": "dfareporting#conversionStatus"
    }
  ]
}

ข้อผิดพลาดที่พบบ่อย

ต่อไปนี้คือข้อผิดพลาดที่คุณอาจเห็นเมื่อเพิ่มประสิทธิภาพ Conversion กับผู้ใช้ ตัวระบุ:

ช่อง hashed_X ไม่ใช่แฮช SHA-256 ที่ถูกต้อง
ช่องทั้งหมดที่ขึ้นต้นด้วยที่แฮชแล้วจะยอมรับเฉพาะแฮช SHA-256 ที่เข้ารหัสแบบ เลขฐาน 16
ฟิลด์ country_code มีความยาวไม่ถูกต้อง
country_code ต้องเป็นตัวอักษร 2 ตัวเท่านั้น
การกำหนดค่า Floodlight ยังไม่ได้ลงนามในข้อกำหนดในการให้บริการของ Conversion ที่ปรับปรุงแล้ว
ยังไม่ได้ยอมรับข้อกำหนดในการให้บริการของ Conversion ที่ปรับปรุงแล้วสำหรับ รหัสการกำหนดค่า Floodlight ของคำขอ
ระบุ user_identifier มากกว่า 5 รายการ
Conversion มีตัวระบุผู้ใช้ได้สูงสุด 5 รายการเท่านั้น

คำถามที่พบบ่อย

เหตุใดจึงแนะนำให้ใช้รหัสการจับคู่
การแก้ไขตามรหัสคลิกจะยกเว้น Conversion ที่ไม่ได้เกิดจากคลิกและขีดจำกัด มูลค่าของการผสานรวม Conversion ที่ปรับปรุงแล้ว
เหตุใดจึงควรบันทึกจำนวนและค่า
CM360 Offline Conversions API ต้องมีจำนวนและมูลค่า ที่ระบุไว้
ฉันต้องขอการประทับเวลาแบบไมโครวินาทีที่ Google บันทึกไว้เพื่อแก้ไข Conversion ที่อิงตามแท็กออนไลน์ไหม
สำหรับการแก้ไขตามรหัสการจับคู่ ตอนนี้ API จะยอมรับการแก้ไข การประทับเวลาที่ระบุไว้ในคำขออยู่ภายใน 1 นาทีนับจากเวลาที่ Google บันทึกไว้ การประทับเวลาด้วยตนเอง
เหตุใดฉันจึงต้องรอ 90 นาทีหลังจากที่แท็กออนไลน์บันทึก Conversion ก่อนที่จะเพิ่มประสิทธิภาพ
อาจใช้เวลาสูงสุด 90 นาทีจึงจะจัดทำดัชนี Conversion ออนไลน์ตาม API และพร้อมสำหรับการแก้ไข
ฉันควรให้ความสนใจกับอะไรในการตอบกลับจาก API
แม้ว่า API สำหรับ Conversion ของ CM360 จะแสดงการตอบกลับที่สำเร็จ แต่ อัปโหลดหรืออัปเดต Conversion แต่ละรายการไม่สำเร็จ ตรวจสอบ ฟิลด์ ConversionStatus แต่ละช่องสำหรับความล้มเหลว:
  • การดำเนินการไม่สำเร็จ NOT_FOUND รายการสามารถทำได้และควรลองอีกครั้ง ซึ่งจะไม่เกิน 6 ชั่วโมงในกรณี การประมวลผล Conversion เกิดความล่าช้ามากกว่าปกติ นอกจากนี้ โปรดดู คำถามที่พบบ่อยเกี่ยวกับสาเหตุที่ข้อผิดพลาด NOT_FOUND ยังคงอยู่เกินกว่า 6 รายการ ชั่วโมง
  • ไม่ควรลองแก้ไขข้อผิดพลาด INVALID_ARGUMENT และ PERMISSION_DENIED รายการอีกครั้ง