В этом руководстве представлены подробные инструкции по загрузке данных о конверсиях в офлайн-режиме с помощью сервиса Campaign Manager 360 API Conversions . Прежде чем продолжить, рекомендуется ознакомиться с разделом «Обзор» , чтобы получить представление об офлайн-конверсиях и ознакомиться с понятиями, рассматриваемыми в этом руководстве.
Настройка ресурсов преобразования
Первым шагом в процессе загрузки данных о конверсии является создание одного или нескольких объектов ресурсов Conversion . Каждый из этих объектов представляет собой отдельное событие конверсии и содержит несколько обязательных полей:
| Поле | Описание |
|---|---|
floodlightActivityId | Данный проект Floodlight будет связан с определенной функцией преобразования. |
floodlightConfigurationId | Конфигурация прожектора, используемая указанным действием. |
ordinal | Значение, используемое для управления процессом дедупликации конверсий с одного и того же устройства или пользователя в один и тот же день. Дополнительную информацию см. в разделе часто задаваемых вопросов . |
timestampMicros | Временная метка преобразования в микросекундах с момента начала эпохи Unix. |
Кроме того, каждый объект должен содержать одно из следующих полей:
| Поле | Описание |
|---|---|
encryptedUserId | Единый зашифрованный идентификатор пользователя, полученный из макроса %m match или функции передачи данных . |
encryptedUserIdCandidates[] | Список зашифрованных идентификаторов пользователей, полученных из макроса %m match или функции Data Transfer . Будет использован первый из этих идентификаторов, для которого была записана экспозиция Floodlight до указанной timestampMicros . Если ни один из идентификаторов не соответствует существующей экспозиции, будет выдана ошибка. |
dclid | Идентификатор клика по рекламному объявлению, сгенерированный Campaign Manager 360 или Display & Video 360. |
gclid | Идентификатор клика Google, генерируемый Google Ads или Search Ads 360. |
matchId | Уникальный идентификатор, созданный рекламодателем, передается в Campaign Manager 360 через тег Floodlight. |
mobileDeviceId | Незашифрованный мобильный идентификатор в формате IDFA или AdID, либо идентификатор Connected TV для рекламы (IFA) с поддерживаемой платформы устройства CTV (Roku, Fire TV, Android TV, Apple TV, Xbox, Samsung, Vizio). Обратите внимание, что Google не поддерживает идентификаторы YouTube Connected TV IFA. |
Наконец, для каждой конверсии существуют два показателя:
| Поле | Описание |
|---|---|
quantity | Обязательно. Количество элементов, связанных с конверсией. Должно быть не менее 1, чтобы конверсия учитывалась в определенных показателях (например, в общем количестве конверсий). |
value | Сумма в долларах, связанная с конвертацией. Интерпретируется в конфигурации Floodlight, владеющей валютой рекламодателя. |
Дополнительные поля описаны в справочной документации .
Приведенный ниже пример иллюстрирует создание простого объекта ресурса преобразования:
C#
// 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;
Java
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);
PHP
$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);
Python
# Look up the Floodlight configuration ID based on activity ID. floodlight_activity = ( service.floodlightActivities() .get(profileId=str(profile_id), id=str(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 )
Укажите информацию о шифровании.
Если вы планируете привязывать офлайн-конверсии к зашифрованным идентификаторам пользователей, как в предыдущем примере, вам потребуется предоставить некоторые сведения о способе их шифрования в запросе на вставку. В частности, вам необходимо знать:
Параметр «Источник шифрования» описывает, откуда поступила партия зашифрованных идентификаторов. Допустимые значения:
AD_SERVINGдля идентификаторов, полученных из макроса %m match, илиDATA_TRANSFERдля идентификаторов, полученных из файлов передачи данных.Идентификатор шифрования — это уникальный набор значений, используемых для шифрования идентификаторов пользователей. Обычно эти значения относятся к учетной записи Campaign Manager 360, если источником является передача данных, или к рекламодателю Campaign Manager 360, если источником является макрос %m, но это не всегда так. Если вы не уверены, обратитесь к представителю вашей учетной записи Campaign Manager 360 или в службу поддержки Campaign Manager 360 за дополнительной информацией.
При необходимости вторым шагом в процессе загрузки преобразованных данных является создание объекта EncryptionInfo , в котором указываются эти значения:
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 }
Руби
# 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] )
Обратите внимание, что каждый запрос на вставку может содержать только один объект EncryptionInfo . Это означает, что все преобразования, включенные в данный запрос, должны исходить из одного источника и использовать один и тот же объект шифрования.
Сгенерировать запрос на вставку
Заключительным этапом этого процесса является загрузка результатов конверсий с помощью вызова метода batchinsert . Этот метод принимает объект ConversionsBatchInsertRequest , который объединяет набор загружаемых результатов конверсий с соответствующей информацией о шифровании (при необходимости):
C#
// Insert the conversion. ConversionsBatchInsertRequest request = new ConversionsBatchInsertRequest(); request.Conversions = new List<Conversion>() { conversion }; request.EncryptionInfo = encryptionInfo; ConversionsBatchInsertResponse response = service.Conversions.Batchinsert(request, profileId).Execute();
Java
ConversionsBatchInsertRequest request = new ConversionsBatchInsertRequest(); request.setConversions(ImmutableList.of(conversion)); request.setEncryptionInfo(encryptionInfo); ConversionsBatchInsertResponse response = reporting.conversions() .batchinsert(profileId, request).execute();
PHP
$batch = new Google_Service_Dfareporting_ConversionsBatchInsertRequest(); $batch->setConversions([$conversion]); $batch->setEncryptionInfo($encryptionInfo); $result = $this->service->conversions->batchinsert( $values['user_profile_id'], $batch );
Python
# Insert the conversion. request_body = { 'conversions': [conversion], 'encryptionInfo': encryption_info } request = service.conversions().batchinsert( profileId=str(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)
Обратите внимание, что Campaign Manager 360 пытается вставить каждое конверсию в вашем запросе по мере возможности, а не вставлять всю партию целиком по принципу «всё или ничего». Если некоторые конверсии в партии не удается вставить, другие могут быть успешно вставлены. Поэтому рекомендуется проверить возвращаемый объект ConversionsBatchInsertResponse , чтобы определить статус каждой конверсии:
C#
// 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); } }
Java
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()); } }
PHP
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()); } }
Python
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
Поле status в ответе, как показано выше, будет содержать объект ConversionStatus для каждой конверсии, включенной в исходный запрос. Если вас интересуют только конверсии, которые не удалось вставить, поле hasFailures можно использовать для быстрого определения того, была ли какая-либо конверсия в предоставленной партии неудачной.
Проверка обработки конверсий.
Загруженные данные о конверсиях, как правило, обрабатываются и становятся доступны для составления отчетов в течение 24 часов. Чтобы проверить, были ли обработаны загруженные вами конверсии, рекомендуется запустить отчет Floodlight Impressions . В отличие от других отчетов по атрибуции, эти отчеты по умолчанию возвращают как атрибутивные (связанные с объявлением), так и неатрибутивные конверсии. Это делает их идеальными для быстрой проверки того, попали ли отправленные вами конверсии в Campaign Manager 360.