เมื่อมีการรายงาน Conversion ไปยัง Google Ads แล้ว คุณจะปรับ Conversion ในภายหลังได้ใน Google Ads API
หากต้องการปรับเปลี่ยน Conversion คุณต้องตั้งค่าการกระทำที่ถือเป็น Conversion ก่อน และต้องบันทึก Conversion ที่คุณกำลังจะปรับด้วย
ตัวอย่างโค้ด
Google Ads API รองรับการใช้ order_id
หรือที่เรียกว่ารหัสธุรกรรม เพื่อระบุ Conversion ที่จะปรับให้เข้ากับการใช้ ConversionAdjustmentUploadService
หากต้องการรับเงิน conversion_action_id
ที่จำเป็นในการปรับเปลี่ยน Conversion คุณสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้
รับค่าจากพารามิเตอร์
ctId
ที่มีอยู่ใน URL เมื่อคลิกรายละเอียด Conversion ใน UI ของ Google Adsค้นหา Google Ads API สำหรับ
conversion_action.id
ในรายงานconversion_action
Java
private void runExample( GoogleAdsClient googleAdsClient, long customerId, long conversionActionId, String orderId, String adjustmentType, String adjustmentDateTime, @Nullable Float restatementValue) throws InvalidProtocolBufferException { // Gets the conversion adjustment enum value from the adjustmentType String. ConversionAdjustmentType conversionAdjustmentType = ConversionAdjustmentType.valueOf(adjustmentType); // Applies the conversion adjustment to the existing conversion. ConversionAdjustment conversionAdjustment = ConversionAdjustment.newBuilder() .setConversionAction(ResourceNames.conversionAction(customerId, conversionActionId)) .setAdjustmentType(conversionAdjustmentType) // Sets the orderId to identify the conversion to adjust. .setOrderId(orderId) // As an alternative to setting orderId, you can provide a GclidDateTimePair, but // setting orderId instead is strongly recommended. // .setGclidDateTimePair( // GclidDateTimePair.newBuilder() // .setGclid(gclid) // .setConversionDateTime(conversionDateTime) // .build()) .setAdjustmentDateTime(adjustmentDateTime) .build(); // Sets adjusted value for adjustment type RESTATEMENT. if (restatementValue != null && conversionAdjustmentType == ConversionAdjustmentType.RESTATEMENT) { conversionAdjustment = conversionAdjustment.toBuilder() .setRestatementValue( RestatementValue.newBuilder().setAdjustedValue(restatementValue).build()) .build(); } // Creates the conversion upload service client. try (ConversionAdjustmentUploadServiceClient conversionUploadServiceClient = googleAdsClient.getLatestVersion().createConversionAdjustmentUploadServiceClient()) { // Uploads the click conversion. Partial failure should always be set to true. UploadConversionAdjustmentsRequest request = UploadConversionAdjustmentsRequest.newBuilder() .setCustomerId(Long.toString(customerId)) // Enables partial failure (must be true). .setPartialFailure(true) .addConversionAdjustments(conversionAdjustment) .build(); UploadConversionAdjustmentsResponse response = conversionUploadServiceClient.uploadConversionAdjustments(request); // Extracts the partial failure error if present on the response. ErrorUtils errorUtils = ErrorUtils.getInstance(); GoogleAdsFailure googleAdsFailure = response.hasPartialFailureError() ? errorUtils.getGoogleAdsFailure(response.getPartialFailureError()) : null; // Constructs a protocol buffer printer that will print error details in a concise format. final Printer errorPrinter = JsonFormat.printer().omittingInsignificantWhitespace(); // Prints the results for each adjustment, including any partial errors returned. for (int opIndex = 0; opIndex < request.getConversionAdjustmentsCount(); opIndex++) { ConversionAdjustmentResult result = response.getResults(opIndex); if (errorUtils.isPartialFailureResult(result)) { // The operation failed. Prints the error details. for (GoogleAdsError googleAdsError : errorUtils.getGoogleAdsErrors(opIndex, googleAdsFailure)) { System.out.printf( "%4d: Partial failure occurred: %s%n", opIndex, errorPrinter.print(googleAdsError)); } } else { System.out.printf( "%4d: Uploaded conversion adjustment for conversion action '%s' and order ID '%s'.%n", opIndex, result.getConversionAction(), result.getOrderId()); } } } }
C#
public void Run(GoogleAdsClient client, long customerId, long conversionActionId, string gclid, string conversionDateTime, string adjustmentDateTime, ConversionAdjustmentType adjustmentType, double? restatementValue) { // Get the ConversionAdjustmentUploadService. ConversionAdjustmentUploadServiceClient conversionAdjustmentUploadService = client.GetService(Services.V16.ConversionAdjustmentUploadService); // Associate conversion adjustments with the existing conversion action. // The GCLID should have been uploaded before with a conversion. ConversionAdjustment conversionAdjustment = new ConversionAdjustment() { ConversionAction = ResourceNames.ConversionAction(customerId, conversionActionId), AdjustmentType = adjustmentType, GclidDateTimePair = new GclidDateTimePair() { Gclid = gclid, ConversionDateTime = conversionDateTime, }, AdjustmentDateTime = adjustmentDateTime, }; // Set adjusted value for adjustment type RESTATEMENT. if (adjustmentType == ConversionAdjustmentType.Restatement) { conversionAdjustment.RestatementValue = new RestatementValue() { AdjustedValue = restatementValue.Value }; } try { // Issue a request to upload the conversion adjustment. UploadConversionAdjustmentsResponse response = conversionAdjustmentUploadService.UploadConversionAdjustments( new UploadConversionAdjustmentsRequest() { CustomerId = customerId.ToString(), ConversionAdjustments = { conversionAdjustment }, PartialFailure = true, ValidateOnly = false }); ConversionAdjustmentResult result = response.Results[0]; // Print the result. Console.WriteLine($"Uploaded conversion adjustment value of" + $" '{result.ConversionAction}' for Google Click ID " + $"'{result.GclidDateTimePair.Gclid}'"); } 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 $gclid, string $adjustmentType, string $conversionDateTime, string $adjustmentDateTime, float $restatementValue ) { $conversionAdjustmentType = ConversionAdjustmentType::value($adjustmentType); // Associates conversion adjustments with the existing conversion action. // The GCLID should have been uploaded before with a conversion. $conversionAdjustment = new ConversionAdjustment([ 'conversion_action' => ResourceNames::forConversionAction($customerId, $conversionActionId), 'adjustment_type' => $conversionAdjustmentType, 'gclid_date_time_pair' => new GclidDateTimePair([ 'gclid' => $gclid, 'conversion_date_time' => $conversionDateTime ]), 'adjustment_date_time' => $adjustmentDateTime ]); // Sets adjusted value for adjustment type RESTATEMENT. if ( $restatementValue !== null && $conversionAdjustmentType === ConversionAdjustmentType::RESTATEMENT ) { $conversionAdjustment->setRestatementValue(new RestatementValue([ 'adjusted_value' => $restatementValue ])); } // Issues a request to upload the conversion adjustment. $conversionAdjustmentUploadServiceClient = $googleAdsClient->getConversionAdjustmentUploadServiceClient(); $response = $conversionAdjustmentUploadServiceClient->uploadConversionAdjustments( UploadConversionAdjustmentsRequest::build($customerId, [$conversionAdjustment], 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 ConversionAdjustmentResult $uploadedConversionAdjustment */ $uploadedConversionAdjustment = $response->getResults()[0]; printf( "Uploaded conversion adjustment of '%s' for Google Click ID '%s'.%s", $uploadedConversionAdjustment->getConversionAction(), $uploadedConversionAdjustment->getGclidDateTimePair()->getGclid(), PHP_EOL ); } }
Python
def main( client, customer_id, conversion_action_id, gclid, adjustment_type, conversion_date_time, adjustment_date_time, restatement_value, ): conversion_adjustment_type_enum = client.enums.ConversionAdjustmentTypeEnum # Determine the adjustment type. conversion_adjustment_type = conversion_adjustment_type_enum[ adjustment_type ].value # Associates conversion adjustments with the existing conversion action. # The GCLID should have been uploaded before with a conversion conversion_adjustment = client.get_type("ConversionAdjustment") conversion_action_service = client.get_service("ConversionActionService") conversion_adjustment.conversion_action = ( conversion_action_service.conversion_action_path( customer_id, conversion_action_id ) ) conversion_adjustment.adjustment_type = conversion_adjustment_type conversion_adjustment.adjustment_date_time = adjustment_date_time # Set the Gclid Date conversion_adjustment.gclid_date_time_pair.gclid = gclid conversion_adjustment.gclid_date_time_pair.conversion_date_time = ( conversion_date_time ) # Sets adjusted value for adjustment type RESTATEMENT. if ( restatement_value and conversion_adjustment_type == conversion_adjustment_type_enum.RESTATEMENT.value ): conversion_adjustment.restatement_value.adjusted_value = float( restatement_value ) conversion_adjustment_upload_service = client.get_service( "ConversionAdjustmentUploadService" ) request = client.get_type("UploadConversionAdjustmentsRequest") request.customer_id = customer_id request.conversion_adjustments = [conversion_adjustment] request.partial_failure = True response = ( conversion_adjustment_upload_service.upload_conversion_adjustments( request=request, ) ) conversion_adjustment_result = response.results[0] print( f"Uploaded conversion that occurred at " f'"{conversion_adjustment_result.adjustment_date_time}" ' f"from Gclid " f'"{conversion_adjustment_result.gclid_date_time_pair.gclid}"' f' to "{conversion_adjustment_result.conversion_action}"' )
Ruby
def upload_conversion_adjustment( customer_id, conversion_action_id, gclid, adjustment_type, conversion_date_time, adjustment_date_time, restatement_value ) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new # Associate conversion adjustments with the existing conversion action. # The GCLID should have been uploaded before with a conversion. conversion_adjustment = client.resource.conversion_adjustment do |ca| ca.conversion_action = client.path.conversion_action(customer_id, conversion_action_id) ca.adjustment_type = adjustment_type ca.gclid_date_time_pair = client.resource.gclid_date_time_pair do |gdtp| gdtp.gclid = gclid gdtp.conversion_date_time = conversion_date_time end ca.adjustment_date_time = adjustment_date_time # Set adjusted value for adjustment type RESTATEMENT. if adjustment_type == :RESTATEMENT ca.restatement_value = client.resource.restatement_value do |ra| ra.adjusted_value = restatement_value.to_f end end end # Issue a request to upload the conversion adjustment(s). response = client.service.conversion_adjustment_upload.upload_conversion_adjustments( customer_id: customer_id, # This example shows just one adjustment but you may upload multiple ones. conversion_adjustments: [conversion_adjustment], partial_failure: true ) if response.partial_failure_error.nil? # Process and print all results for multiple adjustments response.results.each do |result| puts "Uploaded conversion adjustment at #{result.adjustment_date_time} " \ "for adjustment #{result.adjustment_type} to #{result.conversion_action}." end else # Print any partial errors returned. failures = client.decode_partial_failure_error(response.partial_failure_error) puts 'Request failed. Failure details:' failures.each do |failure| failure.errors.each do |error| puts "\t#{error.error_code.error_code}: #{error.message}" end end end end
Perl
sub upload_conversion_adjustment { my ($api_client, $customer_id, $conversion_action_id, $gclid, $adjustment_type, $conversion_date_time, $adjustment_date_time, $restatement_value) = @_; # Associate conversion adjustments with the existing conversion action. # The GCLID should have been uploaded before with a conversion. my $conversion_adjustment = Google::Ads::GoogleAds::V16::Services::ConversionAdjustmentUploadService::ConversionAdjustment ->new({ conversionAction => Google::Ads::GoogleAds::V16::Utils::ResourceNames::conversion_action( $customer_id, $conversion_action_id ), adjustmentType => $adjustment_type, gclidDateTimePair => Google::Ads::GoogleAds::V16::Services::ConversionAdjustmentUploadService::GclidDateTimePair ->new({ gclid => $gclid, conversionDateTime => $conversion_date_time } ), adjustmentDateTime => $adjustment_date_time, }); # Set adjusted value for adjustment type RESTATEMENT. $conversion_adjustment->{restatementValue} = Google::Ads::GoogleAds::V16::Services::ConversionAdjustmentUploadService::RestatementValue ->new({ adjustedValue => $restatement_value }) if defined $restatement_value && $adjustment_type eq RESTATEMENT; # Issue a request to upload the conversion adjustment. my $upload_conversion_adjustments_response = $api_client->ConversionAdjustmentUploadService() ->upload_conversion_adjustments({ customerId => $customer_id, conversionAdjustments => [$conversion_adjustment], partialFailure => "true" }); # Print any partial errors returned. if ($upload_conversion_adjustments_response->{partialFailureError}) { printf "Partial error encountered: '%s'.\n", $upload_conversion_adjustments_response->{partialFailureError}{message}; } # Print the result if valid. my $uploaded_conversion_adjustment = $upload_conversion_adjustments_response->{results}[0]; if (%$uploaded_conversion_adjustment) { printf "Uploaded conversion adjustment of the conversion action " . "with resource name '%s' for Google Click ID '%s'.\n", $uploaded_conversion_adjustment->{conversionAction}, $uploaded_conversion_adjustment->{gclidDateTimePair}{gclid}; } return 1; }
ข้อกำหนด
ข้อกำหนดและข้อจำกัดบางประการที่ควรคำนึงถึงเมื่อปรับเปลี่ยน Conversion ใน API มีดังนี้
เฉพาะบัญชีที่จัดการการกระทำที่ถือเป็น Conversion เท่านั้นที่อัปโหลดการปรับเปลี่ยนได้ ใช้วิธีตั้งค่าเครื่องมือวัด Conversion เพื่อดูว่าบัญชีใดจัดการ Conversion สำหรับบัญชี Google Ads ของคุณ
การพยายามอัปโหลดการปรับค่าใช้จ่ายโดยใช้บัญชีอื่นจะทําให้เกิดข้อผิดพลาด
NO_CONVERSION_ACTION_FOUND
ข้อผิดพลาดนี้ยังเกิดขึ้นได้หากไม่ได้เปิดใช้การกระทำที่ถือเป็น Conversion ของการปรับเปลี่ยนGoogle Ads รองรับเฉพาะการปรับ Conversion สำหรับการกระทำที่ถือเป็น Conversion ประเภท
SALESFORCE
,UPLOAD_CLICKS
หรือWEBPAGE
เท่านั้น การพยายามอัปโหลดการปรับเปลี่ยนสำหรับ Conversion ที่การกระทำที่ถือเป็น Conversion ไม่ใช่ประเภทข้างต้นจะทําให้เกิดข้อผิดพลาดINVALID_CONVERSION_ACTION_TYPE
ช่องที่ระบุวันที่และเวลาจะต้องระบุเขตเวลาที่ไม่จำเป็นของบัญชี รูปแบบของช่องเหล่านี้จะเป็น
yyyy-mm-dd HH:mm:ss+|-HH:mm
เช่น2022-01-01 19:32:45-05:00
(ไม่สนใจเวลาออมแสง)โปรดรอ 4-6 ชั่วโมงหลังจากสร้างการกระทำที่ถือเป็น Conversion ก่อนที่จะปรับ Conversion เพื่อหลีกเลี่ยงข้อผิดพลาด
TOO_RECENT_CONVERSION_ACTION
การปรับจะไม่สำเร็จโดยมีข้อผิดพลาด
CONVERSION_NOT_FOUND
หากเป็นไปตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้ไม่เคยมีการรายงาน Conversion
มีการรายงาน Conversion ไม่ถึง 24 ชั่วโมงก่อนที่จะพยายามปรับค่าใช้จ่าย ในบางสถานการณ์ การเปลี่ยนแปลงนี้อาจทำให้เกิดข้อผิดพลาด
TOO_RECENT_CONVERSION
แทน
คุณต้องระบุ
order_id
ในConversionAdjustment
ภายใต้เงื่อนไขใดๆ ต่อไปนี้type
ของการกระทําที่ถือเป็น Conversion มีค่าเท่ากับWEBPAGE
Conversion เดิมที่คุณกำลังปรับเปลี่ยนได้รับ
order_id
หากคุณระบุ
gclid_date_time_pair
แทน การดำเนินการจะล้มเหลวโดยมีข้อผิดพลาดConversionAdjustmentUploadError.MISSING_ORDER_ID_FOR_WEBPAGE
หรือConversionAdjustmentUploadError.CONVERSION_NOT_FOUND
ตามลำดับเมื่อสร้าง
ConversionAdjustment
แอตทริบิวต์partial_failure
ของUploadConversionAdjustmentsRequest
ควรตั้งค่าเป็นtrue
เสมอ ทำตามหลักเกณฑ์เกี่ยวกับความล้มเหลวบางส่วนเมื่อจัดการการดำเนินการที่ถูกต้องและล้มเหลวพร้อมกันคุณจะเปลี่ยน
ConversionAction
ด้วยการปรับค่าใช้จ่ายไม่ได้ แต่ให้ใช้RETRACTION
เพื่อนำ Conversion ก่อนหน้าออกและอัปโหลด Conversion ใหม่ด้วยConversionAction
ที่อัปเดตแล้วแทน ไม่จำเป็นต้องแก้ไขการประทับเวลา ดูเกี่ยวกับการปรับเปลี่ยน Conversion