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, le recomendamos que consulte la Descripción general a fin de obtener una introducción a las conversiones sin conexión y familiarizarse con los conceptos que se analizan en esta guía.
Antes de comenzar
Este flujo de trabajo de edición te permite modificar las quantity
y value
de las conversiones existentes en línea y sin conexión. Para ello, deberá proporcionar valores que identifiquen de forma única las conversiones que se van a editar. Según el tipo de conversiones que edite, obtendrá estos valores de diferentes maneras:
Los valores necesarios para identificar las conversiones en línea se pueden obtener de Transferencia de datos.
Los valores necesarios para identificar conversiones sin conexión se muestran en el
ConversionsBatchInsertResponse
de las solicitudesbatchinsert
exitosas.
Una vez que hayas editado correctamente una conversión de cualquier tipo, ConversionsBatchUpdateResponse
contendrá los valores necesarios para realizar modificaciones posteriores.
Configure los recursos de conversión
El primer paso del flujo de trabajo de edición implica crear uno o más objetos de recursos Conversion
.
Los siguientes campos se utilizan para identificar una conversión que se debe editar. Estos campos son obligatorios y deben coincidir exactamente con una conversión existente.
Campo | Descripción |
---|---|
|
Indica 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 |
La configuración de Floodlight que utiliza la actividad especificada. |
ordinal |
Es el identificador de anulación de duplicación asociado con la conversión. |
timestampMicros |
La marca de tiempo de la conversión, en microsegundos y desde el epoch Unix. |
Los campos que se pueden editar se enumeran a continuación. Estos campos son obligatorios y los valores que proporcione reemplazarán cualquier valor preexistente en la conversión que se está editando.
Campo | Descripción |
---|---|
quantity |
Indica la cantidad de elementos asociados con la conversión. |
value |
Indica el importe de los ingresos generados por la conversión. |
Los demás campos mencionados 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 mostrará un error. Si la conversión que se edita contiene valores preexistentes para los campos no admitidos, 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 ID del usuario encriptados, deberá proporcionar detalles sobre cómo se encriptan como parte de la solicitud de edición. Consulte la guía Cómo subir conversiones para obtener más información.
Cuando sea necesario, el segundo paso del flujo de trabajo de edición es crear un objeto EncryptionInfo
que especifique estos valores:
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 la 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 la solicitud según el criterio del mejor esfuerzo, en lugar de actualizar todo el lote como una transacción con todo o nada. Si algunas conversiones en un lote no se actualizan, otras podrían actualizarse correctamente. Por lo tanto, te recomendamos que inspecciones la 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 más arriba, contendrá un objeto ConversionStatus
para cada conversión incluida en la solicitud original. Si solo te interesan las conversiones que no se pudieron actualizar, el campo hasFailures
se puede utilizar para determinar rápidamente si alguna conversión del lote proporcionado falló.