แก้ไข Conversion

คู่มือนี้จะให้วิธีการโดยละเอียดสำหรับการแก้ไข Conversion โดยใช้บริการ Conversions ของ Campaign Manager 360 API ก่อนดำเนินการต่อ เราขอแนะนำให้อ่านภาพรวมเพื่อดูข้อมูลเบื้องต้นเกี่ยวกับ Conversion ออฟไลน์และทำความคุ้นเคยกับแนวคิดที่กล่าวถึงในคู่มือนี้

ก่อนเริ่มต้น

เวิร์กโฟลว์การแก้ไขนี้ช่วยให้คุณแก้ไข quantity และ value ของ Conversion ออนไลน์และ Conversion ออฟไลน์ที่มีอยู่ได้ โดยคุณจะต้องระบุค่าที่ระบุ Conversion ที่จะแก้ไขได้อย่างไม่ซ้ำกัน คุณจะได้รับค่าเหล่านี้ด้วยวิธีที่แตกต่างกัน โดยขึ้นอยู่กับประเภทของ Conversion ที่คุณกำลังแก้ไข

  • คุณสามารถรับค่าที่จำเป็นในการระบุ Conversion ออนไลน์ได้จากการโอนข้อมูล

  • ระบบจะแสดงผลค่าที่จำเป็นในการระบุ Conversion ออฟไลน์ใน ConversionsBatchInsertResponse ของคำขอ batchinsert ที่สำเร็จ

เมื่อแก้ไข Conversion ประเภทใดประเภทหนึ่งเรียบร้อยแล้ว ConversionsBatchUpdateResponse จะมีค่าที่จำเป็นสำหรับการแก้ไขในภายหลัง

กำหนดค่าแหล่งข้อมูล Conversion

ขั้นตอนแรกในเวิร์กโฟลว์การแก้ไขเกี่ยวข้องกับการสร้างออบเจ็กต์ทรัพยากร Conversion อย่างน้อย 1 รายการ

ระบบจะใช้ช่องต่อไปนี้เพื่อระบุ Conversion ที่จะแก้ไข ช่องเหล่านี้เป็นช่องที่ต้องกรอกและต้องตรงกับ Conversion ที่มีอยู่ทุกประการ

ช่อง คำอธิบาย

encryptedUserId หรือ gclid หรือ dclid หรือ matchid หรือ mobileDeviceId

รหัสผู้ใช้ที่เข้ารหัส, Google Click ID, Display Click ID, รหัสที่ตรงกัน หรือรหัสอุปกรณ์เคลื่อนที่ที่สร้าง Conversion
floodlightActivityId กิจกรรม Floodlight ที่ระบุแหล่งที่มาของ Conversion
floodlightConfigurationId การกำหนดค่า Floodlight ที่ใช้โดยกิจกรรมที่ระบุ
ordinal ตัวระบุการกรองข้อมูลที่ซ้ำกันออกที่เชื่อมโยงกับ Conversion
timestampMicros การประทับเวลาของ Conversion ในหน่วยไมโครวินาทีตั้งแต่ Unix Epoch

ช่องที่แก้ไขได้มีดังนี้

ช่องเหล่านี้เป็นช่องที่ต้องกรอก และค่าที่คุณระบุจะเขียนทับค่าที่มีอยู่ก่อนแล้วใน Conversion ที่กำลังแก้ไข

ช่อง คำอธิบาย
quantity จำนวนสินค้าที่เชื่อมโยงกับ Conversion
value จำนวนรายได้ที่เกิดจาก Conversion

คุณจะกรอกข้อมูลในช่องเหล่านี้หรือไม่ก็ได้ ค่าจะไม่เปลี่ยนแปลงหากไม่ได้ตั้งค่า

ช่อง คำอธิบาย
customVariables ตัวแปร Floodlight ที่กำหนดเองของ Conversion จะอัปเดตหรือแทรกค่าหากมีการตั้งค่าตัวแปร ค่าของตัวแปรจะไม่เปลี่ยนแปลงหากไม่ได้ตั้งค่า

ระบบไม่รองรับและไม่สามารถแก้ไขช่องอื่นๆ ทั้งหมดที่กล่าวถึงในเอกสารอ้างอิง การใส่ช่องที่ไม่รองรับในคำขอแก้ไขจะทำให้เกิดข้อผิดพลาด หาก Conversion ที่กำลังแก้ไขมีค่าที่มีอยู่ก่อนแล้วสำหรับช่องที่ไม่รองรับ ระบบจะเก็บค่าเหล่านั้นไว้โดยอัตโนมัติ

ตัวอย่างด้านล่างแสดงการสร้างออบเจ็กต์ทรัพยากร Conversion แบบง่ายเพื่อแก้ไข

C#

// Find the Floodlight configuration ID based on the provided activity ID.
FloodlightActivity floodlightActivity =
    service.FloodlightActivities.Get(profileId, floodlightActivityId).Execute();
long floodlightConfigurationId = (long) floodlightActivity.FloodlightConfigurationId;

// Construct the conversion object with values that identify the conversion to update.
Conversion conversion = new Conversion();
conversion.EncryptedUserId = conversionUserId;
conversion.FloodlightActivityId = floodlightActivityId;
conversion.FloodlightConfigurationId = floodlightConfigurationId;
conversion.Ordinal = conversionOrdinal;
conversion.TimestampMicros = conversionTimestamp;

// Set the fields to be updated. These fields are required; to preserve a value from the
// existing conversion, it must be copied over manually.
conversion.Quantity = newQuantity;
conversion.Value = newValue;

Java

// Create a conversion object populated with values that identify the conversion to update.
Conversion conversion = new Conversion();
conversion.setEncryptedUserId(encryptedUserId);
conversion.setFloodlightActivityId(floodlightActivityId);
conversion.setFloodlightConfigurationId(floodlightConfigurationId);
conversion.setOrdinal(ordinal);
conversion.setTimestampMicros(timestampMicros);

// Set the fields to be updated. These fields are required; to preserve a value from the
// existing conversion, it must be copied over manually.
conversion.setQuantity(newQuantity);
conversion.setValue(newValue);

PHP

// Find Floodlight configuration ID based on provided activity ID.
$activity = $this->service->floodlightActivities->get(
    $values['user_profile_id'],
    $values['floodlight_activity_id']
);
$floodlightConfigId = $activity->getFloodlightConfigurationId();

// Create a conversion object with values that identify the conversion to
// update.
$conversion = new Google_Service_Dfareporting_Conversion();
$conversion->setEncryptedUserId($values['encrypted_user_id']);
$conversion->setFloodlightActivityId($values['floodlight_activity_id']);
$conversion->setFloodlightConfigurationId($floodlightConfigId);
$conversion->setOrdinal($values['ordinal']);
$conversion->setTimestampMicros($values['timestamp']);

// Set the fields to be updated. These fields are required; to preserve a
// value from the existing conversion, it must be copied over manually.
$conversion->setQuantity($values['new_quantity']);
$conversion->setValue($values['new_value']);

Python

# Construct the conversion object with values that identify the conversion
# to update.
conversion = {
    'encryptedUserId': encrypted_user_id,
    'floodlightActivityId': floodlight_activity_id,
    'floodlightConfigurationId': floodlight_config_id,
    'ordinal': ordinal,
    'timestampMicros': timestamp
}

# Set the fields to be updated. These fields are required; to preserve a
# value from the existing conversion, it must be copied over manually.
conversion['quantity'] = new_quantity
conversion['value'] = new_value

Ruby

# Look up the Floodlight configuration ID based on activity ID.
floodlight_activity = service.get_floodlight_activity(profile_id,
  existing_conversion[:floodlight_activity_id])
floodlight_config_id = floodlight_activity.floodlight_configuration_id

# Construct the conversion with values that identify the conversion to
# update.
conversion = DfareportingUtils::API_NAMESPACE::Conversion.new(
  encrypted_user_id: existing_conversion[:encrypted_user_id],
  floodlight_activity_id: existing_conversion[:floodlight_activity_id],
  floodlight_configuration_id: floodlight_config_id,
  ordinal: existing_conversion[:ordinal],
  timestamp_micros: existing_conversion[:timestamp]
)

# Set the fields to be updated. These fields are required; to preserve a
# value from the existing conversion, it must be copied over manually.
conversion.quantity = new_quantity
conversion.value = new_value

ระบุข้อมูลการเข้ารหัส

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

เมื่อจำเป็น การสร้างออบเจ็กต์ EncryptionInfo ที่ระบุค่าเหล่านี้เป็นขั้นตอนที่ 2 ในเวิร์กโฟลว์การแก้ไข ดังนี้

C#

// Create the encryption info.
EncryptionInfo encryptionInfo = new EncryptionInfo();
encryptionInfo.EncryptionEntityId = encryptionEntityId;
encryptionInfo.EncryptionEntityType = encryptionEntityType;
encryptionInfo.EncryptionSource = encryptionSource;

Java

// Create the encryption info.
EncryptionInfo encryptionInfo = new EncryptionInfo();
encryptionInfo.setEncryptionEntityId(encryptionEntityId);
encryptionInfo.setEncryptionEntityType(encryptionEntityType);
encryptionInfo.setEncryptionSource(encryptionSource);

PHP

$encryptionInfo = new Google_Service_Dfareporting_EncryptionInfo();
$encryptionInfo->setEncryptionEntityId($values['encryption_entity_id']);
$encryptionInfo->setEncryptionEntityType($values['encryption_entity_type']);
$encryptionInfo->setEncryptionSource($values['encryption_source']);

Python

# Construct the encryption info.
encryption_info = {
    'encryptionEntityId': encryption_entity_id,
    'encryptionEntityType': encryption_entity_type,
    'encryptionSource': encryption_source
}

Ruby

# Construct the encryption info.
encryption_info = DfareportingUtils::API_NAMESPACE::EncryptionInfo.new(
  encryption_entity_id: encryption[:entity_id],
  encryption_entity_type: encryption[:entity_type],
  encryption_source: encryption[:source]
)

สร้างคำขออัปเดต

ขั้นตอนสุดท้ายในกระบวนการนี้คือการแก้ไข Conversion ด้วยการเรียกใช้ batchupdate เมธอดนี้ยอมรับออบเจ็กต์ ConversionsBatchUpdateRequest ซึ่งรวมชุด Conversion ที่จะแก้ไขเข้ากับข้อมูลการเข้ารหัสที่เกี่ยวข้อง (เมื่อจำเป็น) ดังนี้

C#

// Insert the conversion.
ConversionsBatchUpdateRequest request = new ConversionsBatchUpdateRequest();
request.Conversions = new List<Conversion>() { conversion };
request.EncryptionInfo = encryptionInfo;

ConversionsBatchUpdateResponse response =
    service.Conversions.Batchupdate(request, profileId).Execute();

Java

ConversionsBatchUpdateRequest request = new ConversionsBatchUpdateRequest();
request.setConversions(ImmutableList.of(conversion));
request.setEncryptionInfo(encryptionInfo);

ConversionsBatchUpdateResponse response = reporting.conversions()
    .batchupdate(profileId, request).execute();

PHP

$batch = new Google_Service_Dfareporting_ConversionsBatchUpdateRequest();
$batch->setConversions([$conversion]);
$batch->setEncryptionInfo($encryptionInfo);

$result = $this->service->conversions->batchupdate(
    $values['user_profile_id'],
    $batch
);

Python

# Update the conversion.
request_body = {
    'conversions': [conversion],
    'encryptionInfo': encryption_info
}
request = service.conversions().batchupdate(
    profileId=profile_id, body=request_body)
response = request.execute()

Ruby

# Construct the batch update request.
batch_update_request =
  DfareportingUtils::API_NAMESPACE::ConversionsBatchUpdateRequest.new(
    conversions: [conversion],
    encryption_info: encryption_info
  )

# Update the conversion.
result = service.batchupdate_conversion(profile_id, batch_update_request)

โปรดทราบว่า Campaign Manager 360 จะพยายามแก้ไข Conversion แต่ละรายการในคำขอของคุณอย่างเต็มความสามารถ แทนที่จะอัปเดตทั้งกลุ่มเป็นธุรกรรมแบบทั้งหมดหรือไม่มีเลย หาก Conversion บางรายการในกลุ่มอัปเดตไม่สำเร็จ รายการอื่นๆ อาจยังอัปเดตได้สำเร็จ ดังนั้น เราขอแนะนําให้คุณตรวจสอบ ConversionsBatchUpdateResponse ที่แสดงผลเพื่อดูสถานะของ Conversion แต่ละรายการ ดังนี้

C#

// Handle the batchinsert response.
if (!response.HasFailures.Value) {
  Console.WriteLine("Successfully updated conversion for encrypted user ID {0}.",
      conversionUserId);
} else {
  Console.WriteLine("Error(s) updating conversion for encrypted user ID {0}:",
      conversionUserId);

  ConversionStatus status = response.Status[0];
  foreach(ConversionError error in status.Errors) {
    Console.WriteLine("\t[{0}]: {1}", error.Code, error.Message);
  }
}

Java

if (!response.getHasFailures()) {
  System.out.printf("Successfully updated conversion for encrypted user ID %s.%n",
      encryptedUserId);
} else {
  System.out.printf("Error(s) updating conversion for encrypted user ID %s:%n",
      encryptedUserId);

  // Retrieve the conversion status and report any errors found. If multiple conversions
  // were included in the original request, the response would contain a status for each.
  ConversionStatus status = response.getStatus().get(0);
  for (ConversionError error : status.getErrors()) {
    System.out.printf("\t[%s]: %s.%n", error.getCode(), error.getMessage());
  }
}

PHP

if (!$result->getHasFailures()) {
    printf(
        'Successfully updated conversion for encrypted user ID %s.',
        $values['encrypted_user_id']
    );
} else {
    printf(
        'Error(s) updating conversion for encrypted user ID %s:<br><br>',
        $values['encrypted_user_id']
    );

    $status = $result->getStatus()[0];
    foreach ($status->getErrors() as $error) {
        printf('[%s] %s<br>', $error->getCode(), $error->getMessage());
    }
}

Python

if not response['hasFailures']:
  print('Successfully updated conversion for encrypted user ID %s.' %
        encrypted_user_id)
else:
  print('Error(s) updating conversion for encrypted user ID %s.' %
        encrypted_user_id)

  status = response['status'][0]
  for error in status['errors']:
    print('\t[%s]: %s' % (error['code'], error['message']))

Ruby

if result.has_failures
  puts format('Error(s) updating conversion for encrypted user ID %s.',
    existing_conversion[:encrypted_user_id])

  status = result.status[0]
  status.errors.each do |error|
    puts format("\t[%s]: %s", error.code, error.message)
  end
else
  puts format('Successfully updated conversion for encrypted user ID %s.',
    existing_conversion[:encrypted_user_id])
end

ฟิลด์ status ของการตอบกลับตามที่เห็นก่อนหน้านี้จะมีออบเจ็กต์ ConversionStatus สําหรับ Conversion ทุกรายการที่รวมอยู่ในคําขอเดิม หากคุณสนใจเฉพาะ Conversion ที่อัปเดตไม่สำเร็จ คุณสามารถใช้ช่อง hasFailures เพื่อระบุได้อย่างรวดเร็วว่า Conversion ใดในกลุ่มที่ระบุไม่สำเร็จหรือไม่ ดูคำแนะนำเกี่ยวกับวิธีจัดการรหัสข้อผิดพลาดแต่ละรายการและ Conversion ที่ล้มเหลวซึ่งควรลองอีกครั้ง (INTERNAL และ NOT_FOUND) ได้ที่คำถามที่พบบ่อย