Import Conversion Adjustments

Once a conversion has already been reported to Google Ads, you can adjust the conversion at a later point in time in the Google Ads API.

In order to adjust a conversion, you must first have a conversion action set up , and you must also have recorded the conversions that you are about to adjust.

Code example

The Google Ads API supports using order_id , also known as transaction ID , to identify the conversion to adjust with the ConversionAdjustmentUploadService .

To get the conversion_action_id required to make a conversion adjustment, you can do one of the following:

  • Obtain the value from the ctId parameter available in the URL when you click conversion details in the Google Ads UI.

  • Query the Google Ads API for conversion_action.id in the conversion_action report.

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 
  
 orderId 
 , 
  
 string 
  
 adjustmentDateTime 
 , 
  
 ConversionAdjustmentType 
  
 adjustmentType 
 , 
  
 double? 
  
 restatementValue 
 ) 
 { 
  
 // Get the ConversionAdjustmentUploadService. 
  
 ConversionAdjustmentUploadServiceClient 
  
 conversionAdjustmentUploadService 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V21 
 . 
 ConversionAdjustmentUploadService 
 ); 
  
 // Associate conversion adjustments with the existing conversion action. 
  
 ConversionAdjustment 
  
 conversionAdjustment 
  
 = 
  
 new 
  
 ConversionAdjustment 
 () 
  
 { 
  
 ConversionAction 
  
 = 
  
 ResourceNames 
 . 
 ConversionAction 
 ( 
 customerId 
 , 
  
 conversionActionId 
 ), 
  
 AdjustmentType 
  
 = 
  
 adjustmentType 
 , 
  
 // Sets the orderId to identify the conversion to adjust. 
  
 OrderId 
  
 = 
  
 orderId 
 , 
  
 // As an alternative to setting orderId, you can provide a GclidDateTimePair, 
  
 // but setting orderId instead is strongly recommended. 
  
 //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 
  
 }, 
  
 // Enables partial failure (must be true). 
  
 PartialFailure 
  
 = 
  
 true 
 , 
  
 ValidateOnly 
  
 = 
  
 false 
  
 }); 
  
 // Prints any partial errors returned. 
  
 // To review the overall health of your recent uploads, see: 
  
 // https://developers.google.com/google-ads/api/docs/conversions/upload-summaries 
  
 if 
  
 ( 
 response 
 . 
 PartialFailureError 
  
 != 
  
 null 
 ) 
  
 { 
  
 // Extracts the partial failure from the response status. 
  
 GoogleAdsFailure 
  
 partialFailure 
  
 = 
  
 response 
 . 
 PartialFailure 
 ; 
  
 Console 
 . 
 WriteLine 
 ( 
 $"{partialFailure.Errors.Count} partial failure error(s) " 
  
 + 
  
 $"occurred" 
 ); 
  
 } 
  
 else 
  
 { 
  
 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 $orderId, 
 string $adjustmentType, 
 string $adjustmentDateTime, 
 ?float $restatementValue 
 ) { 
 $conversionAdjustmentType = ConversionAdjustmentType::value($adjustmentType); 
 // Applies the conversion adjustment to the existing conversion. 
 $conversionAdjustment = new ConversionAdjustment([ 
 'conversion_action' = 
> ResourceNames::forConversionAction($customerId, $conversionActionId), 
 'adjustment_type' => $conversionAdjustmentType, 
 // Sets the orderId to identify the conversion to adjust. 
 'order_id' => $orderId, 
 // As an alternative to setting orderId, you can provide a 'gclid_date_time_pair', but 
 // setting 'order_id' instead is strongly recommended. 
 // 'conversion_date_time' must be in "yyyy-mm-dd hh:mm:ss+|-hh:mm" format. 
 /* 
 'gclid_date_time_pair' => new GclidDateTimePair([ 
 'gclid' => 'INSERT_YOUR_GCLID_HERE', 
 'conversion_date_time' => 'INSERT_YOUR_CONVERSION_DATE_TIME_HERE' 
 ]), 
 */ 
 '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( 
 // Enables partial failure (must be true). 
 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 order ID '%s'.%s", 
 $uploadedConversionAdjustment->getConversionAction(), 
 $uploadedConversionAdjustment->getOrderId(), 
 PHP_EOL 
 ); 
 } 
 }  
 

Python

 def 
  
 main 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 conversion_action_id 
 : 
 str 
 , 
 adjustment_type 
 : 
 str 
 , 
 order_id 
 : 
 str 
 , 
 adjustment_date_time 
 : 
 str 
 , 
 restatement_value 
 : 
 Optional 
 [ 
 str 
 ] 
 = 
 None 
 , 
 ) 
 - 
> None 
 : 
  
 """The main method that creates all necessary entities for the example. 
 Args: 
 client: an initialized GoogleAdsClient instance. 
 customer_id: a client customer ID. 
 conversion_action_id: the ID of the conversion action to upload the 
 adjustment to. 
 adjustment_type: the adjustment type, e.g. " "RETRACTION, RESTATEMENT. 
 order_id: the transaction ID of the conversion to adjust. Strongly 
 recommended instead of using gclid and conversion_date_time. 
 adjustment_date_time: the date and time of the adjustment. 
 restatement_value: the adjusted value for adjustment type RESTATEMENT. 
 """ 
 conversion_adjustment_type_enum 
 : 
 ConversionAdjustmentTypeEnum 
 = 
 ( 
 client 
 . 
 enums 
 . 
 ConversionAdjustmentTypeEnum 
 ) 
 # Determine the adjustment type. 
 conversion_adjustment_type 
 : 
 int 
 = 
 conversion_adjustment_type_enum 
 [ 
 adjustment_type 
 ] 
 . 
 value 
 # Applies the conversion adjustment to the existing conversion. 
 conversion_adjustment 
 : 
 ConversionAdjustment 
 = 
 client 
 . 
 get_type 
 ( 
 "ConversionAdjustment" 
 ) 
 conversion_action_service 
 : 
 ConversionActionServiceClient 
 = 
 ( 
 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 
 # Sets the order_id to identify the conversion to adjust. 
 conversion_adjustment 
 . 
 order_id 
 = 
 order_id 
 # As an alternative to setting order_id, you can provide a 
 # gclid_date_time_pair, but setting order_id instead is strongly recommended. 
 # 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 
 ) 
 # Uploads the click conversion. Partial failure should always be set to 
 # true. 
 service 
 : 
 ConversionAdjustmentUploadServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "ConversionAdjustmentUploadService" 
 ) 
 request 
 : 
 UploadConversionAdjustmentsRequest 
 = 
 client 
 . 
 get_type 
 ( 
 "UploadConversionAdjustmentsRequest" 
 ) 
 request 
 . 
 customer_id 
 = 
 customer_id 
 request 
 . 
 conversion_adjustments 
 . 
 append 
 ( 
 conversion_adjustment 
 ) 
 # Enables partial failure (must be true) 
 request 
 . 
 partial_failure 
 = 
 True 
 response 
 : 
 UploadConversionAdjustmentsResponse 
 = 
 ( 
 service 
 . 
 upload_conversion_adjustments 
 ( 
 request 
 = 
 request 
 ) 
 ) 
 # Extracts the partial failure error if present on the response. 
 error_details 
 = 
 None 
 if 
 response 
 . 
 partial_failure_error 
 : 
 error_details 
 : 
 Iterable 
 [ 
 Any 
 ] 
 = 
 response 
 . 
 partial_failure_error 
 . 
 details 
 i 
 : 
 int 
 conversion_adjustment_result 
 : 
 ConversionAdjustmentResult 
 for 
 i 
 , 
 conversion_adjustment_result 
 in 
 enumerate 
 ( 
 response 
 . 
 results 
 ): 
 # If there's a GoogleAdsFailure in error_details at this position then 
 # the uploaded operation failed and we print the error message. 
 if 
 error_details 
 and 
 error_details 
 [ 
 i 
 ]: 
 error_detail 
 : 
 Any 
 = 
 error_details 
 [ 
 i 
 ] 
 failure_message 
 : 
 GoogleAdsFailure 
 = 
 client 
 . 
 get_type 
 ( 
 "GoogleAdsFailure" 
 ) 
 # Parse the string into a GoogleAdsFailure message instance. 
 # To access class-only methods on the message we retrieve its type. 
 google_ads_failure_class 
 : 
 GoogleAdsFailure 
 = 
 type 
 ( 
 failure_message 
 ) 
 failure_object 
 : 
 GoogleAdsFailure 
 = 
 ( 
 google_ads_failure_class 
 . 
 deserialize 
 ( 
 error_detail 
 . 
 value 
 ) 
 ) 
 error 
 : 
 GoogleAdsError 
 for 
 error 
 in 
 failure_object 
 . 
 errors 
 : 
 # Construct and print a string that details which element in 
 # the operation list failed (by index number) as well as the 
 # error message and error code. 
 print 
 ( 
 "A partial failure at index " 
 f 
 " 
 { 
 error 
 . 
 location 
 . 
 field_path_elements 
 [ 
 0 
 ] 
 . 
 index 
 } 
 occurred " 
 f 
 " 
 \n 
 Error message: 
 { 
 error 
 . 
 message 
 } 
 \n 
 Error code: " 
 f 
 " 
 { 
 error 
 . 
 error_code 
 } 
 " 
 ) 
 else 
 : 
 print 
 ( 
 "Uploaded conversion adjustment for conversion action " 
 f 
 "' 
 { 
 conversion_adjustment_result 
 . 
 conversion_action 
 } 
 ' and order " 
 f 
 "ID ' 
 { 
 conversion_adjustment_result 
 . 
 order_id 
 } 
 '." 
 ) 
  

Ruby

 def 
  
 upload_conversion_adjustment 
 ( 
  
 customer_id 
 , 
  
 conversion_action_id 
 , 
  
 order_id 
 , 
  
 adjustment_type 
 , 
  
 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 
  
 # Applies the conversion adjustment to the existing 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 
 . 
 order_id 
  
 = 
  
 order_id 
  
 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 for conversion action 
 #{ 
 result 
 . 
 conversion_action 
 } 
 " 
 \ 
  
 "and order ID 
 #{ 
 result 
 . 
 order_id 
 } 
 ." 
  
 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 
 | 
  
 index 
  
 = 
  
 error 
 . 
 location 
 . 
 field_path_elements 
 . 
 first 
 . 
 index 
  
 puts 
  
 " 
 \t 
 operation[ 
 #{ 
 index 
 } 
 ] 
 #{ 
 error 
 . 
 error_code 
 . 
 error_code 
 } 
 : 
 #{ 
 error 
 . 
 message 
 } 
 " 
  
 end 
  
 end 
  
 end 
 end  
 
 . 
 rb 
  

Perl

 sub 
  
 upload_conversion_adjustment 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $conversion_action_id 
 , 
  
 $order_id 
 , 
  
 $adjustment_type 
 , 
  
 $adjustment_date_time 
 , 
  
 $restatement_value 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Applies the conversion adjustment to the existing conversion. 
  
 my 
  
 $conversion_adjustment 
  
 = 
  
 Google::Ads::GoogleAds::V21::Services::ConversionAdjustmentUploadService:: 
 ConversionAdjustment 
  
 - 
> new 
 ({ 
  
 conversionAction 
  
 = 
>  
 Google::Ads::GoogleAds::V21::Utils::ResourceNames:: 
 conversion_action 
 ( 
  
 $customer_id 
 , 
  
 $conversion_action_id 
  
 ), 
  
 adjustmentType 
  
 = 
>  
 $adjustment_type 
 , 
  
 # Sets the orderId to identify the conversion to adjust. 
  
 orderId 
  
 = 
>  
 $order_id 
 , 
  
 # As an alternative to setting orderId, you can provide a 'gclid_date_time_pair', 
  
 # but setting 'order_id' instead is strongly recommended. 
  
 # gclidDateTimePair = 
>  
 #  Google::Ads::GoogleAds::V21::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::V21::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 order ID '%s'.\n" 
 , 
  
 $uploaded_conversion_adjustment 
 - 
> { 
 conversionAction 
 }, 
  
 $uploaded_conversion_adjustment 
 - 
> { 
 orderId 
 }; 
  
 } 
  
 return 
  
 1 
 ; 
 } 
  
  

Requirements

Here are some requirements and restrictions to keep in mind while adjusting conversions in the API:

  • Only the account that manages conversion actions is able to import adjustments. Use the conversion tracking setup instructions to determine which account is managing conversions for your Google Ads account.

    Attempting to import an adjustment using a different account results in a NO_CONVERSION_ACTION_FOUND error. This error also occurs if the conversion action of the adjustment is not enabled.

  • Google Ads only supports adjusting conversions for conversion action types of SALESFORCE , UPLOAD_CLICKS , or WEBPAGE . Attempting to import an adjustment for a conversion where the conversion action is not one of these types results in an INVALID_CONVERSION_ACTION_TYPE error.

  • The fields specifying date and time require a selected timezone which can be different than the account's time zone. The format of these fields is as yyyy-mm-dd HH:mm:ss+|-HH:mm , for example: 2022-01-01 19:32:45-05:00 (ignoring daylight saving time) .

  • Wait 4 to 6 hours after creating the conversion action before adjusting its conversions to avoid a TOO_RECENT_CONVERSION_ACTION error.

  • The adjustment fails with a CONVERSION_NOT_FOUND error if the conversion was never imported, or was imported, but discarded due to being deemed invalid or spam.

  • You must specify the order_id in the ConversionAdjustment under any of these conditions:

    • The type of the conversion action is equal to WEBPAGE .

    • The original conversion you are adjusting was assigned an order_id .

    If you specify the gclid_date_time_pair instead, the operation will fail with a ConversionAdjustmentUploadError.MISSING_ORDER_ID_FOR_WEBPAGE or ConversionAdjustmentUploadError.CONVERSION_NOT_FOUND error, respectively.

  • When creating a ConversionAdjustment , the partial_failure attribute of the UploadConversionAdjustmentsRequest should always be set to true . Follow the partial failures guidelines when handling valid and failed operations simultaneously.

  • You cannot change the ConversionAction assigned to a conversion with an adjustment. Instead, use a RETRACTION to remove the previous conversion and import a new conversion with the updated ConversionAction . The timestamp does not need to be modified. See About conversion adjustments for more information.

Design a Mobile Site
View Site in Mobile | Classic
Share by: