W tym przewodniku znajdziesz szczegółowe instrukcje przesyłania konwersji offline za pomocą interfejsu Campaign Manager 360 API Conversions
. Zanim przejdziesz dalej, przeczytaj omówienie, aby zapoznać się z konwersjami offline i pojęciami omówionymi w tym przewodniku.
Konfigurowanie zasobów konwersji
Pierwszym krokiem w procesie przesyłania konwersji jest utworzenie co najmniej 1 obiektu zasobu Conversion
. Każde z tych obiektów reprezentuje pojedyncze zdarzenie konwersji i zawiera kilka wymaganych pól:
Pole | Opis |
---|---|
floodlightActivityId |
Aktywność Floodlight, z którą będzie powiązana ta konwersja. |
floodlightConfigurationId |
Konfiguracja Floodlight używana przez określoną aktywność. |
ordinal |
Wartość służąca do określania sposobu usuwania duplikatów konwersji z tego samego urządzenia lub od tego samego użytkownika w tym samym dniu. Więcej informacji znajdziesz w najczęstszych pytaniach. |
timestampMicros |
Sygnatura czasowa konwersji w mikrosekundach od epoki uniksowej. |
Dodatkowo każdy obiekt musi zawierać jedno z tych pól:
Pole | Opis |
---|---|
encryptedUserId |
pojedynczy zaszyfrowany identyfikator użytkownika uzyskany z makry dopasowywania%m lub raportu Przenoszenie danych; |
encryptedUserIdCandidates[] |
Lista zaszyfrowanych identyfikatorów użytkowników uzyskanych z makra dopasowywania%m lub funkcji Przenoszenie danych. Użyty zostanie pierwszy z tych identyfikatorów, który ma zarejestrowaną ekspozycję Floodlight przed podaną datą timestampMicros . Jeśli żaden z identyfikatorów nie pasuje do istniejącej ekspozycji, wystąpi błąd. |
dclid |
Identyfikator kliknięcia w kampanii displayowej wygenerowany przez Campaign Managera 360 lub Display & Video 360. |
gclid |
Identyfikator kliknięcia Google wygenerowany przez Google Ads lub Search Ads 360. |
matchId |
Unikalny identyfikator utworzony przez reklamodawcę, przekazywany do usługi Campaign Manager 360 za pomocą tagu Floodlight. |
mobileDeviceId |
niezaszyfrowany identyfikator urządzenia mobilnego w formacie IDFA lub AdID albo identyfikator wyświetlania reklam na urządzeniach CTV (IFA) z obsługiwanej platformy CTV (Roku, Fire TV, Android TV, Apple TV, Xbox, Samsung, Vizio). Pamiętaj, że Google nie obsługuje IFA na urządzeniach CTV. |
Opcjonalne pola są opisane w dokumentacji referencyjnej. Pamiętaj, że pole „Ilość”, choć jest opcjonalne, musi zawierać co najmniej 1, aby konwersja była uwzględniana w określonych danych (np. w łącznej liczbie konwersji) podczas generowania raportów.
Przykład poniżej pokazuje tworzenie prostego obiektu zasobu konwersji:
// 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
)
Określ informacje o szyfrowaniu
Jeśli zamierzasz przypisywać konwersje offline do zaszyfrowanych identyfikatorów użytkowników, jak w poprzednim przykładzie, musisz podać szczegóły dotyczące sposobu ich zaszyfrowania w ramach żądania wstawiania. Musisz wiedzieć:
Źródło szyfrowania, które określa, skąd pochodzi grupa zaszyfrowanych identyfikatorów. Akceptowane wartości to
AD_SERVING
w przypadku identyfikatorów pochodzących z makra %m match, lubDATA_TRANSFER
w przypadku identyfikatorów pochodzących z plików Przenoszenia danych.element szyfrowania, czyli unikalny zestaw wartości służących do szyfrowania identyfikatorów użytkowników; Te wartości zwykle odnoszą się do konta Campaign Managera 360, gdy źródło to Przesyłanie danych, lub do reklamodawcy w usłudze Campaign Manager 360, gdy źródło to makro %m, ale nie zawsze tak jest. Jeśli nie masz pewności, skontaktuj się z przedstawicielem konta Campaign Managera 360 lub z zespołem pomocy Campaign Managera 360, aby uzyskać więcej informacji.
W razie potrzeby utworzenie obiektu EncryptionInfo
, który określa te wartości, jest drugim krokiem w procesie przesyłania konwersji:
// 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]
)
Pamiętaj, że każde żądanie wstawiania może zawierać tylko jeden obiekt EncryptionInfo
. Oznacza to, że wszystkie konwersje uwzględnione w danym żądaniu muszą pochodzić z tego samego źródła i korzystać z tego samego elementu szyfrowania.
Generowanie prośby o wstawienie
Ostatnim krokiem w tym procesie jest przesłanie konwersji za pomocą wywołania funkcji batchinsert
. Ta metoda przyjmuje obiekt ConversionsBatchInsertRequest
, który łączy zestaw konwersji do przesłania z powiązanymi informacjami szyfrowania (w razie potrzeby):
// 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)
Pamiętaj, że Campaign Manager 360 próbuje wstawiać każdą konwersję z Twojego żądania z największą starannością, a nie wstawiać całej partii jako transakcji typu „wszystko albo nic”. Jeśli nie uda się wstawić niektórych konwersji z partii, inne mogą zostać zaimportowane. Dlatego zalecamy sprawdzenie zwróconego parametru ConversionsBatchInsertResponse
, aby określić stan każdej konwersji:
// 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
Jak widać powyżej, pole status
w odpowiedzi zawiera obiekt ConversionStatus
dla każdej konwersji uwzględnionej w pierwotnym żądaniu. Jeśli interesują Cię tylko konwersje, które nie zostały wstawione, możesz użyć pola hasFailures
, aby szybko sprawdzić, czy jakakolwiek konwersja z podanej partii nie została wstawiona.
Sprawdzanie, czy konwersje zostały przetworzone
Przesłane konwersje są zwykle przetwarzane i dostępne do raportowania w ciągu 24 godzin. Aby sprawdzić, czy przesłane przez Ciebie konwersje zostały przetworzone, zalecamy wygenerowanie raportu Floodlight Impressions (Widoczności w Floodlight). W przeciwieństwie do innych raportów atrybucji te domyślnie zwracają zarówno konwersje przypisane (powiązane z reklamą), jak i nieprzypisane. Dzięki temu możesz szybko sprawdzić, czy wysłane przez Ciebie konwersje dotarły do Campaign Managera 360.