Anda dapat menggunakan Google Ads API untuk mengimpor konversi panggilan offline ke Google Ads untuk melacak kapan iklan menghasilkan panggilan telepon dan kapan panggilan telepon tersebut menghasilkan tindakan pelanggan yang berharga.
Jika dipetakan ke UI Google Ads, hal ini sama dengan menggunakan sumber konversi Upload, lalu memilih Konversi dari panggilan.
Membuat konversi panggilan
Beberapa hal yang perlu diingat saat membuat CallConversion:
Anda harus mengisi kolom
consentdari objekCallConversion.Atribut
partial_failuredariUploadCallConversionsRequestharus selalu disetel ketrue. Ikuti panduan kegagalan parsialsaat menangani operasi yang valid dan gagal secara bersamaan.Jika Anda menemukan pesan respons
TOO_RECENT_CONVERSION_ACTIONatauTOO_RECENT_CALLuntuk permintaan impor konversi, tunggu 6 jam atau 12 jam, sebelum mencoba lagi baris yang gagal.Perlu waktu hingga 3 jam agar statistik konversi yang diimpor muncul di akun Google Ads Anda.
- Jika satu permintaan berisi beberapa operasi untuk konversi yang sama,
error
DUPLICATE_CALL_CONVERSION_IN_REQUESTakan ditampilkan.
- Jika satu permintaan berisi beberapa operasi untuk konversi yang sama,
error
Jika pengguna menyalin nomor penerusan Google secara manual dan meneleponnya, tidak ada konversi yang dapat dicatat.
Mengimpor konversi panggilan
Untuk mengaitkan konversi panggilan offline dengan tindakan konversi, Anda memerlukan informasi berikut: ID penelepon (nomor telepon), waktu tanggal konversi, nama resource tindakan konversi, dan secara opsional nilai konversi dan mata uang ke
ConversionUploadService.
Untuk mengetahui detail selengkapnya tentang berbagai input, lihat artikel Pusat Bantuan kami. Contoh
kode juga menjelaskan format untuk berbagai input.
Persyaratan
Persyaratan berikut harus dipenuhi saat mengimpor
CallConversion.
Untuk menghindari error ConversionUploadError.INVALID_CONVERSION_ACTION, atribut
conversion_action
harus merujuk ke ConversionAction dengan:
ConversionActionTypeadalahUPLOAD_CALLS.statusdariConversionActionadalahENABLED. Jika tidak, operasi akan gagal dengan errorNO_CONVERSION_ACTION_FOUND.ConversionActionada di pelanggan konversi Google Ads dari akun Google Ads klik.
Sebaiknya tetapkan juga
ConversionAction.category ke
kategori yang paling sesuai dengan konversi Anda.
Selain itu, kondisi berikut harus dipenuhi:
Pada waktu panggilan, tracking konversi diaktifkan di pelanggan konversi Google Ads dari akun Google Ads panggilan tersebut.
customer_iddariUploadCallConversionsRequestharus berupa ID pelanggan konversi Google Ads pelanggan dari akun Google Ads panggilan. Jika tidak, impor konversi akan menghasilkan errorConversionUploadError.INVALID_CUSTOMER_FOR_CALL.conversion_valueharus lebih besar dari atau sama dengan nol.conversion_date_timeharus memiliki zona waktu yang ditentukan, dan formatnya adalahyyyy-mm-dd HH:mm:ss+|-HH:mm, misalnya:2022-01-01 19:32:45-05:00(mengabaikan waktu musim panas) . Zona waktu dapat berupa nilai valid apa pun: zona waktu tidak harus cocok dengan zona waktu akun. Namun, jika Anda berencana membandingkan data konversi yang diimpor dengan data di UI Google Ads, sebaiknya gunakan zona waktu yang sama dengan akun Google Ads Anda agar jumlah konversi cocok.
Contoh kode
Java
private void runExample( GoogleAdsClient googleAdsClient, long customerId, String conversionActionId, String callerId, String callStartDateTime, double conversionValue, Long conversionCustomVariableId, String conversionCustomVariableValue, ConsentStatus adUserDataConsent) { // Create a call conversion by specifying currency as USD. CallConversion.Builder conversionBuilder = CallConversion.newBuilder() .setConversionAction(conversionActionId) .setCallerId(callerId) .setCallStartDateTime(callStartDateTime) .setConversionValue(conversionValue) .setCurrencyCode("USD"); if (conversionCustomVariableId != null && conversionCustomVariableValue != null) { conversionBuilder.addCustomVariables( CustomVariable.newBuilder() .setConversionCustomVariable( ResourceNames.conversionCustomVariable(customerId, conversionCustomVariableId)) .setValue(conversionCustomVariableValue)); } // Sets the consent information, if provided. if (adUserDataConsent != null) { // Specifies whether user consent was obtained for the data you are uploading. See // https://www.google.com/about/company/user-consent-policy for details. conversionBuilder.setConsent(Consent.newBuilder().setAdUserData(adUserDataConsent)); } CallConversion conversion = conversionBuilder.build(); // Uploads the call conversion to the API. try (ConversionUploadServiceClient conversionUploadServiceClient = googleAdsClient.getLatestVersion().createConversionUploadServiceClient()) { // Partial failure MUST be enabled for this request. // NOTE: This request contains a single conversion as a demonstration. However, if you have // multiple conversions to upload, it's best to upload multiple conversions per request // instead of sending a separate request per conversion. See the following for per-request // limits: // https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service UploadCallConversionsResponse response = conversionUploadServiceClient.uploadCallConversions( UploadCallConversionsRequest.newBuilder() .setCustomerId(String.valueOf(customerId)) .setCustomerId(Long.toString(customerId)) .addConversions(conversion) .setPartialFailure(true) .build()); // Prints any partial failure errors returned. if (response.hasPartialFailureError()) { GoogleAdsFailure googleAdsFailure = ErrorUtils.getInstance().getGoogleAdsFailure(response.getPartialFailureError()); googleAdsFailure .getErrorsList() .forEach(e -> System.out.println("Partial failure occurred: " + e.getMessage())); throw new RuntimeException( "Partial failure occurred " + response.getPartialFailureError().getMessage()); } // Prints the result if valid. CallConversionResult result = response.getResults(0); System.out.printf( "Uploaded call conversion that occurred at '%' for caller ID '%' to the conversion" + " action with resource name '%'.%n", result.getCallStartDateTime(), result.getCallerId(), result.getConversionAction()); } }
C#
public void Run(GoogleAdsClient client, long customerId, long conversionActionId, string callerId, string callStartTime, string conversionTime, double conversionValue, long? conversionCustomVariableId, string conversionCustomVariableValue, ConsentStatus? adUserDataConsent) { // Get the ConversionUploadService. ConversionUploadServiceClient conversionUploadService = client.GetService(Services.V22.ConversionUploadService); // Create a call conversion by specifying currency as USD. CallConversion callConversion = new CallConversion() { ConversionAction = ResourceNames.ConversionAction(customerId, conversionActionId), CallerId = callerId, CallStartDateTime = callStartTime, ConversionDateTime = conversionTime, ConversionValue = conversionValue, CurrencyCode = "USD", }; if (adUserDataConsent != null) { // Specifies whether user consent was obtained for the data you are uploading. See // https://www.google.com/about/company/user-consent-policy // for details. callConversion.Consent = new Consent() { AdUserData = (ConsentStatus)adUserDataConsent }; } if (conversionCustomVariableId != null && !string.IsNullOrEmpty(conversionCustomVariableValue)) { callConversion.CustomVariables.Add(new CustomVariable() { ConversionCustomVariable = ResourceNames.ConversionCustomVariable( customerId, conversionCustomVariableId.Value), Value = conversionCustomVariableValue }); } UploadCallConversionsRequest request = new UploadCallConversionsRequest() { CustomerId = customerId.ToString(), Conversions = { callConversion }, PartialFailure = true }; try { // Issues a request to upload the call conversion. The partialFailure parameter // is set to true, and validateOnly parameter to false as required by this method // call. // NOTE: This request contains a single conversion as a demonstration. However, if // you have multiple conversions to upload, it's best to upload multiple conversions // per request instead of sending a separate request per conversion. See the // following for per-request limits: // https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service UploadCallConversionsResponse response = conversionUploadService.UploadCallConversions(request); // Since we set partialFailure = true, we can retrieve error messages (if any) from // the operation response. if (response.PartialFailureError != null) { Console.WriteLine("Call conversion upload failed."); // Retrieves the errors from the partial failure and prints them. List<GoogleAdsError> errors = response.PartialFailure.GetErrorsByOperationIndex(0); foreach (GoogleAdsError error in errors) { Console.WriteLine($"Operation failed with error: {error}."); } } else { // Prints the result. CallConversionResult uploadedCallConversion = response.Results[0]; Console.WriteLine($"Uploaded call conversion that occurred at " + $"'{uploadedCallConversion.CallStartDateTime}' for caller ID " + $"'{uploadedCallConversion.CallerId}' to the conversion action with " + $"resource name '{uploadedCallConversion.ConversionAction}'."); } } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }
PHP
public static function runExample( GoogleAdsClient $googleAdsClient, int $customerId, int $conversionActionId, string $callerId, string $callStartDateTime, string $conversionDateTime, float $conversionValue, ?string $conversionCustomVariableId, ?string $conversionCustomVariableValue, ?int $adUserDataConsent ) { // Creates a call conversion by specifying currency as USD. $callConversion = new CallConversion([ 'conversion_action' => ResourceNames::forConversionAction($customerId, $conversionActionId), 'caller_id' => $callerId, 'call_start_date_time' => $callStartDateTime, 'conversion_date_time' => $conversionDateTime, 'conversion_value' => $conversionValue, 'currency_code' => 'USD' ]); if (!is_null($conversionCustomVariableId) && !is_null($conversionCustomVariableValue)) { $callConversion->setCustomVariables([new CustomVariable([ 'conversion_custom_variable' => ResourceNames::forConversionCustomVariable( $customerId, $conversionCustomVariableId ), 'value' => $conversionCustomVariableValue ])]); } // Sets the consent information, if provided. if (!empty($adUserDataConsent)) { // Specifies whether user consent was obtained for the data you are uploading. See // https://www.google.com/about/company/user-consent-policy for details. $callConversion->setConsent(new Consent(['ad_user_data' => $adUserDataConsent])); } // Issues a request to upload the call conversion. $conversionUploadServiceClient = $googleAdsClient->getConversionUploadServiceClient(); // NOTE: This request contains a single conversion as a demonstration. However, if you have // multiple conversions to upload, it's best to upload multiple conversions per request // instead of sending a separate request per conversion. See the following for per-request // limits: // https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service $response = $conversionUploadServiceClient->uploadCallConversions( // Partial failure MUST be enabled for this request. UploadCallConversionsRequest::build($customerId, [$callConversion], true) ); // Prints the status message if any partial failure error is returned. // Note: The details of each partial failure error are not printed here, you can refer to // the example HandlePartialFailure.php to learn more. if ($response->hasPartialFailureError()) { printf( "Partial failures occurred: '%s'.%s", $response->getPartialFailureError()->getMessage(), PHP_EOL ); } else { // Prints the result if exists. /** @var CallConversionResult $uploadedCallConversion */ $uploadedCallConversion = $response->getResults()[0]; printf( "Uploaded call conversion that occurred at '%s' for caller ID '%s' to the " . "conversion action with resource name '%s'.%s", $uploadedCallConversion->getCallStartDateTime(), $uploadedCallConversion->getCallerId(), $uploadedCallConversion->getConversionAction(), PHP_EOL ); } }