변환 수정

이 가이드에서는 Campaign Manager 360 API Conversions 서비스를 사용하여 전환을 수정하는 방법을 자세히 설명합니다. 계속하기 전에 개요에서 오프라인 전환에 대한 소개를 확인하고 이 가이드에서 다루는 개념을 숙지하는 것이 좋습니다.

시작하기 전에

이 수정 워크플로를 사용하면 기존 온라인 및 오프라인 전환의 quantityvalue를 수정할 수 있습니다. 이렇게 하려면 수정할 전환을 고유하게 식별하는 값을 제공해야 합니다. 수정하는 전환 유형에 따라 이러한 값을 얻는 방법은 다음과 같이 다릅니다.

두 유형의 전환 중 하나를 수정하면 ConversionsBatchUpdateResponse에 후속 수정을 실행하는 데 필요한 값이 포함됩니다.

전환 리소스 구성

수정 워크플로의 첫 번째 단계는 하나 이상의 Conversion 리소스 객체를 만드는 것입니다.

다음 필드는 수정할 전환을 식별하는 데 사용됩니다. 이 필드는 필수이며 기존 전환과 정확히 일치해야 합니다.

필드 설명

encryptedUserId 또는 gclid 또는 dclid 또는 matchid 또는 mobileDeviceId

전환을 생성한 암호화된 사용자 ID, Google 클릭 ID, 디스플레이 클릭 ID, 일치 ID 또는 휴대기기 ID입니다.
floodlightActivityId 전환 기여도가 부여된 플러드라이트 활동입니다.
floodlightConfigurationId 지정된 활동에서 사용하는 플러드라이트 구성입니다.
ordinal 전환과 연결된 중복 삭제 식별자입니다.
timestampMicros 변환의 타임스탬프(Unix epoch 이후 마이크로초 단위)입니다.

수정할 수 있는 필드는 다음과 같습니다.

이 필드는 필수이며 입력한 값은 수정 중인 전환의 기존 값을 덮어씁니다.

필드 설명
quantity 전환과 연결된 상품의 수입니다.
value 전환으로 발생한 수익 금액입니다.

이 필드는 선택사항입니다. 설정하지 않으면 값이 변경되지 않습니다.

필드 설명
customVariables 전환의 맞춤 플러드라이트 변수입니다. 변수가 설정된 경우 값을 업데이트하거나 삽입합니다. 설정하지 않으면 변수 값은 변경되지 않습니다.

참조 문서에 언급된 다른 모든 필드는 지원되지 않으며 수정할 수 없습니다. 수정 요청에 지원되지 않는 필드를 포함하면 오류가 발생합니다. 수정 중인 전환에 지원되지 않는 필드의 기존 값이 포함된 경우 해당 값은 자동으로 보존됩니다.

아래 예는 수정할 간단한 전환 리소스 객체를 만드는 방법을 보여줍니다.

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;

자바

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

암호화 정보 지정

수정하려는 전환이 암호화된 사용자 ID와 연결된 경우 수정 요청의 일부로 암호화 방법에 관한 세부정보를 제공해야 합니다. 자세한 내용은 전환 업로드 가이드를 참고하세요.

필요한 경우 이러한 값을 지정하는 EncryptionInfo 객체를 만드는 것이 수정 워크플로의 두 번째 단계입니다.

C#

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

자바

// 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]
)

업데이트 요청 생성

이 프로세스의 마지막 단계는 batchupdate 호출을 사용하여 전환을 수정하는 것입니다. 이 메서드는 수정할 변환 집합과 연결된 암호화 정보 (필요한 경우)를 결합한 ConversionsBatchUpdateRequest 객체를 허용합니다.

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();

자바

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은 전체 일괄 처리를 '전부 또는 전혀' 트랜잭션으로 업데이트하는 대신 요청의 각 전환을 최선의 방식으로 수정하려고 시도합니다. 일괄 처리의 일부 전환이 업데이트되지 않더라도 다른 전환은 계속 업데이트될 수 있습니다. 따라서 반환된 ConversionsBatchUpdateResponse를 검사하여 각 전환의 상태를 확인하는 것이 좋습니다.

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);
  }
}

자바

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 객체가 포함됩니다. 업데이트에 실패한 전환에만 관심이 있는 경우 hasFailures 필드를 사용하여 제공된 일괄 처리에서 전환이 실패했는지 빠르게 확인할 수 있습니다.