En esta guía, se proporcionan instrucciones detalladas para subir conversiones sin conexión 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.
Configura los recursos de conversión
El primer paso del proceso de carga de conversiones es crear uno o más objetos de recursos Conversion
. Cada uno de estos objetos representa un solo evento de conversión y contiene algunos campos obligatorios:
Campo | Descripción |
---|---|
floodlightActivityId |
Es la actividad de Floodlight con la que se asociará esta conversión. |
floodlightConfigurationId |
Es la configuración de Floodlight que usa la actividad especificada. |
ordinal |
Es un valor que se usa para controlar cómo se anulan las duplicaciones de las conversiones del mismo dispositivo o usuario en el mismo día. Consulta las Preguntas frecuentes para obtener más información. |
timestampMicros |
Es la marca de tiempo de la conversión, en microsegundos desde la época de Unix. |
Además, cada objeto debe contener uno de los siguientes campos:
Campo | Descripción |
---|---|
encryptedUserId |
Un solo ID de usuario encriptado obtenido de la macro de coincidencia%m o de la Transferencia de datos |
encryptedUserIdCandidates[] |
Una lista de IDs de usuario encriptados obtenidos de la macro de coincidencia%m o de la Transferencia de datos Se usará el primero de estos IDs con una exposición registrada de Floodlight anterior a la timestampMicros especificada. Si ninguno de los IDs coincide con una exposición existente, se mostrará un error. |
dclid |
Un identificador de clics de Display que genera Campaign Manager 360 o Display & Video 360. |
gclid |
Un identificador de clics de Google que genera Google Ads o Search Ads 360. |
matchId |
Es un identificador único creado por el anunciante que se pasa a Campaign Manager 360 a través de una etiqueta de Floodlight. |
mobileDeviceId |
Un ID de dispositivo móvil sin encriptar en el formato IDFA o ID del anuncio o un identificador para publicidad (IFA) de TV conectada de una plataforma de dispositivo de CTV compatible (Roku, Fire TV, Android TV, Apple TV, Xbox, Samsung o Vizio) Ten en cuenta que Google no admite IFA de YouTube Connected TV. |
Los campos opcionales se documentan en la documentación de referencia. Ten en cuenta que el campo de cantidad, aunque es opcional, debe ser de al menos 1 para que la conversión se registre en ciertas métricas (como Total de conversiones) cuando se ejecuten informes.
En el siguiente ejemplo, se ilustra la creación de un objeto de recurso de conversión simple:
// Generate a timestamp in milliseconds since Unix epoch.
TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1);
long currentTimeInMilliseconds = (long) timeSpan.TotalMilliseconds;
// Find the Floodlight configuration ID based on the provided activity ID.
FloodlightActivity floodlightActivity =
service.FloodlightActivities.Get(profileId, floodlightActivityId).Execute();
long floodlightConfigurationId = (long) floodlightActivity.FloodlightConfigurationId;
// Create the conversion.
Conversion conversion = new Conversion();
conversion.EncryptedUserId = conversionUserId;
conversion.FloodlightActivityId = floodlightActivityId;
conversion.FloodlightConfigurationId = floodlightConfigurationId;
conversion.Ordinal = currentTimeInMilliseconds.ToString();
conversion.TimestampMicros = currentTimeInMilliseconds * 1000;
long currentTimeInMilliseconds = System.currentTimeMillis();
// Find Floodlight configuration ID based on the provided activity ID.
FloodlightActivity floodlightActivity = reporting.floodlightActivities()
.get(profileId, floodlightActivityId).execute();
long floodlightConfigurationId = floodlightActivity.getFloodlightConfigurationId();
Conversion conversion = new Conversion();
conversion.setEncryptedUserId(encryptedUserId);
conversion.setFloodlightActivityId(floodlightActivityId);
conversion.setFloodlightConfigurationId(floodlightConfigurationId);
conversion.setOrdinal(String.valueOf(currentTimeInMilliseconds));
conversion.setTimestampMicros(currentTimeInMilliseconds * 1000);
$currentTimeInMicros = time() * 1000 * 1000;
// 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();
$conversion = new Google_Service_Dfareporting_Conversion();
$conversion->setEncryptedUserId($values['encrypted_user_id']);
$conversion->setFloodlightActivityId($values['floodlight_activity_id']);
$conversion->setFloodlightConfigurationId($floodlightConfigId);
$conversion->setOrdinal($currentTimeInMicros);
$conversion->setTimestampMicros($currentTimeInMicros);
# Look up the Floodlight configuration ID based on activity ID.
floodlight_activity = service.floodlightActivities().get(
profileId=profile_id, id=floodlight_activity_id).execute()
floodlight_config_id = floodlight_activity['floodlightConfigurationId']
current_time_in_micros = int(time.time() * 1000000)
# Construct the conversion.
conversion = {
'encryptedUserId': encrypted_user_id,
'floodlightActivityId': floodlight_activity_id,
'floodlightConfigurationId': floodlight_config_id,
'ordinal': current_time_in_micros,
'timestampMicros': current_time_in_micros
}
# Look up the Floodlight configuration ID based on activity ID.
floodlight_activity = service.get_floodlight_activity(profile_id,
floodlight_activity_id)
floodlight_config_id = floodlight_activity.floodlight_configuration_id
current_time_in_micros = DateTime.now.strftime('%Q').to_i * 1000
# Construct the conversion.
conversion = DfareportingUtils::API_NAMESPACE::Conversion.new(
encrypted_user_id: encrypted_user_id,
floodlight_activity_id: floodlight_activity_id,
floodlight_configuration_id: floodlight_config_id,
ordinal: current_time_in_micros,
timestamp_micros: current_time_in_micros
)
Especifica la información de encriptación
Si planeas atribuir conversiones sin conexión a IDs de usuario encriptados, como en el ejemplo anterior, deberás proporcionar algunos detalles sobre cómo se encriptan como parte de tu solicitud de inserción. En particular, debes saber lo siguiente:
La fuente de encriptación, que describe de dónde proviene un lote de IDs encriptados Los valores aceptables son
AD_SERVING
para los IDs provenientes de la macro de coincidencia %m oDATA_TRANSFER
para los IDs provenientes de archivos de transferencia de datos.La entidad de encriptación, que es un conjunto único de valores que se usa para encriptar los IDs de usuario. Por lo general, estos valores se relacionan con una cuenta de Campaign Manager 360 cuando la fuente es Transferencia de datos o con un anunciante de Campaign Manager 360 cuando la fuente es la macro %m, pero no siempre es así. Si no lo tienes claro, comunícate con tu representante de cuenta de Campaign Manager 360 o con el equipo de asistencia de Campaign Manager 360 para obtener más información.
Cuando sea necesario, crear un objeto EncryptionInfo
que especifique estos valores es el segundo paso del proceso de carga de conversiones:
// 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);
$encryptionInfo = new Google_Service_Dfareporting_EncryptionInfo();
$encryptionInfo->setEncryptionEntityId($values['encryption_entity_id']);
$encryptionInfo->setEncryptionEntityType($values['encryption_entity_type']);
$encryptionInfo->setEncryptionSource($values['encryption_source']);
# Construct the encryption info.
encryption_info = {
'encryptionEntityId': encryption_entity_id,
'encryptionEntityType': encryption_entity_type,
'encryptionSource': encryption_source
}
# 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]
)
Ten en cuenta que cada solicitud de inserción puede contener solo un objeto EncryptionInfo
. Esto significa que todas las conversiones incluidas en una solicitud determinada deben provenir de la misma fuente y usar la misma entidad de encriptación.
Genera una solicitud de inserción
El último paso de este proceso es subir tus conversiones con una llamada a batchinsert
. Este método acepta un objeto ConversionsBatchInsertRequest
, que combina el conjunto de conversiones que se subirán con su información de encriptación asociada (cuando sea necesario):
// Insert the conversion.
ConversionsBatchInsertRequest request = new ConversionsBatchInsertRequest();
request.Conversions = new List<Conversion>() { conversion };
request.EncryptionInfo = encryptionInfo;
ConversionsBatchInsertResponse response =
service.Conversions.Batchinsert(request, profileId).Execute();
ConversionsBatchInsertRequest request = new ConversionsBatchInsertRequest();
request.setConversions(ImmutableList.of(conversion));
request.setEncryptionInfo(encryptionInfo);
ConversionsBatchInsertResponse response = reporting.conversions()
.batchinsert(profileId, request).execute();
$batch = new Google_Service_Dfareporting_ConversionsBatchInsertRequest();
$batch->setConversions([$conversion]);
$batch->setEncryptionInfo($encryptionInfo);
$result = $this->service->conversions->batchinsert(
$values['user_profile_id'],
$batch
);
# Insert the conversion.
request_body = {
'conversions': [conversion],
'encryptionInfo': encryption_info
}
request = service.conversions().batchinsert(profileId=profile_id,
body=request_body)
response = request.execute()
# Construct the batch insert request.
batch_insert_request =
DfareportingUtils::API_NAMESPACE::ConversionsBatchInsertRequest.new(
conversions: [conversion],
encryption_info: encryption_info
)
# Insert the conversion.
result = service.batchinsert_conversion(profile_id, batch_insert_request)
Ten en cuenta que Campaign Manager 360 intenta insertar cada conversión en tu solicitud de la mejor manera posible, en lugar de insertar todo el lote como una transacción todo o nada. Si no se pueden insertar algunas conversiones de un lote, es posible que otras se inserten correctamente. Por lo tanto, se recomienda que inspecciones el ConversionsBatchInsertResponse
que se muestra para determinar el estado de cada conversión:
// Handle the batchinsert response.
if (!response.HasFailures.Value) {
Console.WriteLine("Successfully inserted conversion for encrypted user ID {0}.",
conversionUserId);
} else {
Console.WriteLine("Error(s) inserting 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 inserted conversion for encrypted user ID %s.%n",
encryptedUserId);
} else {
System.out.printf("Error(s) inserting 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());
}
}
if (!$result->getHasFailures()) {
printf(
'Successfully inserted conversion for encrypted user ID %s.',
$values['encrypted_user_id']
);
} else {
printf(
'Error(s) inserting 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());
}
}
if not response['hasFailures']:
print ('Successfully inserted conversion for encrypted user ID %s.'
% encrypted_user_id)
else:
print ('Error(s) inserting 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'])
if result.has_failures
puts format('Error(s) inserting conversion for encrypted user ID %s.',
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 inserted conversion for encrypted user ID %s.',
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 insertar, puedes usar el campo hasFailures
para determinar rápidamente si alguna conversión del lote proporcionado falló.
Verifica que se hayan procesado las conversiones
Por lo general, las conversiones subidas se procesarán y estarán disponibles para generar informes en un plazo de 24 horas. Para verificar si se procesaron las conversiones que subiste, te recomendamos que ejecutes un informe de Impresiones de Floodlight. A diferencia de otros informes de atribución, estos mostrarán conversiones atribuidas (asociadas con un anuncio) y no atribuidas de forma predeterminada. Esto lo hace ideal para verificar rápidamente si las conversiones que enviaste llegaron a Campaign Manager 360.