Editar conversiones

En esta guía, se proporcionan instrucciones detalladas para editar conversiones con el servicio Conversions de la API de Campaign Manager 360. Antes de continuar, te recomendamos que revises la descripción general para obtener una introducción a las conversiones sin conexión y familiarizarte con los conceptos que se analizan en esta guía.

Antes de comenzar

Este flujo de trabajo de edición te permite modificar los quantity y value de las conversiones en línea y sin conexión existentes. Para ello, deberás proporcionar valores que identifiquen de forma única las conversiones que se editarán. Según el tipo de conversiones que edites, obtendrás estos valores de diferentes maneras:

Una vez que hayas editado correctamente una conversión de cualquier tipo, ConversionsBatchUpdateResponse contendrá los valores necesarios para realizar ediciones posteriores.

Configura los recursos de conversión

El primer paso del flujo de trabajo de edición consiste en crear uno o más objetos de recursos Conversion.

Los siguientes campos se usan para identificar una conversión que se editará. Estos campos son obligatorios y deben coincidir exactamente con una conversión existente.

Campo Descripción

encryptedUserId o gclid o dclid o matchid o mobileDeviceId

El ID de usuario encriptado, el ID de clic de Google, el ID de clic de Display, el ID de coincidencia o el ID de dispositivo móvil que generó la conversión
floodlightActivityId Es la actividad de Floodlight a la que se atribuye la conversión.
floodlightConfigurationId Es la configuración de Floodlight que usa la actividad especificada.
ordinal El identificador de anulación de duplicación asociado con la conversión.
timestampMicros Es la marca de tiempo de la conversión, en microsegundos desde la época de Unix.

A continuación, se indican los campos que se pueden editar.

Estos campos son obligatorios, y los valores que proporciones reemplazarán cualquier valor preexistente en la conversión que se edite.

Campo Descripción
quantity Es la cantidad de artículos asociados con la conversión.
value Es el importe de los ingresos generados por la conversión.

Estos campos son opcionales. El valor no cambiará si no se establece.

Campo Descripción
customVariables Las variables personalizadas de Floodlight de la conversión Actualizará o insertará el valor si la variable está configurada. El valor de la variable no se modifica si no se establece.

Todos los demás campos que se mencionan en la documentación de referencia no son compatibles y no se pueden modificar. Si incluyes campos no admitidos en tu solicitud de edición, se producirá un error. Si la conversión que se edita contiene valores preexistentes para campos no compatibles, esos valores se conservarán automáticamente.

En el siguiente ejemplo, se ilustra la creación de un objeto de recurso de conversión simple para editar:

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

Especifica la información de encriptación

Si las conversiones que se editan están asociadas con IDs de usuario encriptados, deberás proporcionar detalles sobre cómo se encriptan como parte de la solicitud de edición. Consulta la guía Cómo subir conversiones para obtener más detalles.

Cuando sea necesario, crear un objeto EncryptionInfo que especifique estos valores es el segundo paso en el flujo de trabajo de edición:

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

Genera una solicitud de actualización

El último paso de este proceso es editar las conversiones con una llamada a batchupdate. Este método acepta un objeto ConversionsBatchUpdateRequest, que combina el conjunto de conversiones que se editarán con su información de encriptación asociada (cuando sea necesario):

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)

Ten en cuenta que Campaign Manager 360 intenta editar cada conversión de tu solicitud de la mejor manera posible, en lugar de actualizar todo el lote como una transacción de todo o nada. Si algunas conversiones de un lote no se actualizan, es posible que otras se actualicen correctamente. Por lo tanto, se recomienda que inspecciones el ConversionsBatchUpdateResponse que se muestra para determinar el estado de cada conversión:

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

El campo status de la respuesta, como se vio anteriormente, contendrá un objeto ConversionStatus para cada conversión incluida en la solicitud original. Si solo te interesan las conversiones que no se pudieron actualizar, puedes usar el campo hasFailures para determinar rápidamente si alguna conversión del lote proporcionado falló.