Edit conversions

This guide provides detailed instructions for editing conversions using the Campaign Manager 360 API Conversions service. Before continuing, it is recommended that you review the Overview for an introduction to offline conversions and to familiarize yourself with concepts discussed in this guide.

Before you begin

This edit workflow allows you to modify the quantity and value of existing online and offline conversions. To do so, you'll need to provide values that uniquely identify the conversions to be edited. Depending on the type of conversions you're editing, you'll obtain these values in different ways:

Once you've successfully edited a conversion of either type, the ConversionsBatchUpdateResponse will contain the values necessary to perform subsequent edits.

Configure conversion resources

The first step in the edit workflow involves creating one or more Conversion resource objects.

The following fields are used to identify a conversion to edit. These fields are required and must exactlymatch an existing conversion.

Field Description

encryptedUserId or gclid or dclid or matchid or mobileDeviceId

The encrypted user ID, Google Click ID, Display Click ID, match ID, or mobile device ID that generated the conversion.
floodlightActivityId The Floodlight activity to which the conversion is attributed.
floodlightConfigurationId The Floodlight configuration used by the specified activity.
ordinal The deduplication identifier associated with the conversion.
timestampMicros The timestamp of the conversion, in microseconds since the Unix epoch.

The fields that can be edited are listed below.

These fields are required and the values you provide will overwrite any pre-existing values on the conversion being edited.

Field Description
quantity The number of items associated with the conversion.
value The amount of revenue generated by the conversion.

These fields are optional. The value will be unchanged if not set.

Field Description
customVariables The custom floodlight variables of the conversion. Will update or insert the value if the variable is set. The variable's value is unchanged if not set.

All other fields mentioned in the reference documentation are unsupported and cannot be modified. Including unsupported fields in your edit request will result in an error. If the conversion being edited contains pre-existing values for any unsupported fields, those values will be automatically preserved.

The example below illustrates the creation of a simple conversion resource object to edit:

C#

 // Find the Floodlight configuration ID based on the provided activity ID. 
 FloodlightActivity 
  
 floodlightActivity 
  
 = 
  
 service 
 . 
 FloodlightActivities 
 . 
 Get 
 ( 
 profileId 
 , 
  
 floodlightActivityId 
 ). 
 Execute 
 (); 
 long 
  
 floodlightConfigurationId 
  
 = 
  
 ( 
 long 
 ) 
  
 floodlightActivity 
 . 
 FloodlightConfigurationId 
 ; 
 // Construct the conversion object with values that identify the conversion to update. 
 Conversion 
  
 conversion 
  
 = 
  
 new 
  
 Conversion 
 (); 
 conversion 
 . 
 EncryptedUserId 
  
 = 
  
 conversionUserId 
 ; 
 conversion 
 . 
 FloodlightActivityId 
  
 = 
  
 floodlightActivityId 
 ; 
 conversion 
 . 
 FloodlightConfigurationId 
  
 = 
  
 floodlightConfigurationId 
 ; 
 conversion 
 . 
 Ordinal 
  
 = 
  
 conversionOrdinal 
 ; 
 conversion 
 . 
 TimestampMicros 
  
 = 
  
 conversionTimestamp 
 ; 
 // Set the fields to be updated. These fields are required; to preserve a value from the 
 // existing conversion, it must be copied over manually. 
 conversion 
 . 
 Quantity 
  
 = 
  
 newQuantity 
 ; 
 conversion 
 . 
 Value 
  
 = 
  
 newValue 
 ; 

Java

 // Create a conversion object populated with values that identify the conversion to update. 
 Conversion 
  
 conversion 
  
 = 
  
 new 
  
 Conversion 
 (); 
 conversion 
 . 
 setEncryptedUserId 
 ( 
 encryptedUserId 
 ); 
 conversion 
 . 
 setFloodlightActivityId 
 ( 
 floodlightActivityId 
 ); 
 conversion 
 . 
 setFloodlightConfigurationId 
 ( 
 floodlightConfigurationId 
 ); 
 conversion 
 . 
 setOrdinal 
 ( 
 ordinal 
 ); 
 conversion 
 . 
 setTimestampMicros 
 ( 
 timestampMicros 
 ); 
 // Set the fields to be updated. These fields are required; to preserve a value from the 
 // existing conversion, it must be copied over manually. 
 conversion 
 . 
 setQuantity 
 ( 
 newQuantity 
 ); 
 conversion 
 . 
 setValue 
 ( 
 newValue 
 ); 

PHP

 // 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(); 
 // Create a conversion object with values that identify the conversion to 
 // update. 
 $conversion = new Google_Service_Dfareporting_Conversion(); 
 $conversion->setEncryptedUserId($values['encrypted_user_id']); 
 $conversion->setFloodlightActivityId($values['floodlight_activity_id']); 
 $conversion->setFloodlightConfigurationId($floodlightConfigId); 
 $conversion->setOrdinal($values['ordinal']); 
 $conversion->setTimestampMicros($values['timestamp']); 
 // Set the fields to be updated. These fields are required; to preserve a 
 // value from the existing conversion, it must be copied over manually. 
 $conversion->setQuantity($values['new_quantity']); 
 $conversion->setValue($values['new_value']); 

Python

 # Construct the conversion object with values that identify the conversion 
 # to update. 
 conversion 
 = 
 { 
 'encryptedUserId' 
 : 
 encrypted_user_id 
 , 
 'floodlightActivityId' 
 : 
 floodlight_activity_id 
 , 
 'floodlightConfigurationId' 
 : 
 floodlight_config_id 
 , 
 'ordinal' 
 : 
 ordinal 
 , 
 'timestampMicros' 
 : 
 timestamp 
 } 
 # Set the fields to be updated. These fields are required; to preserve a 
 # value from the existing conversion, it must be copied over manually. 
 conversion 
 [ 
 'quantity' 
 ] 
 = 
 new_quantity 
 conversion 
 [ 
 'value' 
 ] 
 = 
 new_value 

Ruby

 # Look up the Floodlight configuration ID based on activity ID. 
 floodlight_activity 
  
 = 
  
 service 
 . 
 get_floodlight_activity 
 ( 
 profile_id 
 , 
  
 existing_conversion 
 [ 
 :floodlight_activity_id 
 ] 
 ) 
 floodlight_config_id 
  
 = 
  
 floodlight_activity 
 . 
 floodlight_configuration_id 
 # Construct the conversion with values that identify the conversion to 
 # update. 
 conversion 
  
 = 
  
 DfareportingUtils 
 :: 
 API_NAMESPACE 
 :: 
 Conversion 
 . 
 new 
 ( 
  
 encrypted_user_id 
 : 
  
 existing_conversion 
 [ 
 :encrypted_user_id 
 ] 
 , 
  
 floodlight_activity_id 
 : 
  
 existing_conversion 
 [ 
 :floodlight_activity_id 
 ] 
 , 
  
 floodlight_configuration_id 
 : 
  
 floodlight_config_id 
 , 
  
 ordinal 
 : 
  
 existing_conversion 
 [ 
 :ordinal 
 ] 
 , 
  
 timestamp_micros 
 : 
  
 existing_conversion 
 [ 
 :timestamp 
 ] 
 ) 
 # Set the fields to be updated. These fields are required; to preserve a 
 # value from the existing conversion, it must be copied over manually. 
 conversion 
 . 
 quantity 
  
 = 
  
 new_quantity 
 conversion 
 . 
 value 
  
 = 
  
 new_value 

Specify encryption info

If the conversions being edited are associated with encrypted user IDs, you'll need to provide details about how they're encrypted as part of the edit request. Refer to the Uploading Conversions guide for details.

When necessary, creating an EncryptionInfo object that specifies these values is the second step in the edit workflow:

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 
 } 

Ruby

 # 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 
 ] 
 ) 

Generate an update request

The final step in this process is to edit the conversions with a call to batchupdate . This method accepts a ConversionsBatchUpdateRequest object, which combines the set of conversions to be edited with their associated encryption info (when necessary):

C#

 // Insert the conversion. 
 ConversionsBatchUpdateRequest 
  
 request 
  
 = 
  
 new 
  
 ConversionsBatchUpdateRequest 
 (); 
 request 
 . 
 Conversions 
  
 = 
  
 new 
  
 List<Conversion> 
 () 
  
 { 
  
 conversion 
  
 }; 
 request 
 . 
 EncryptionInfo 
  
 = 
  
 encryptionInfo 
 ; 
 ConversionsBatchUpdateResponse 
  
 response 
  
 = 
  
 service 
 . 
 Conversions 
 . 
 Batchupdate 
 ( 
 request 
 , 
  
 profileId 
 ). 
 Execute 
 (); 

Java

 ConversionsBatchUpdateRequest 
  
 request 
  
 = 
  
 new 
  
 ConversionsBatchUpdateRequest 
 (); 
 request 
 . 
 setConversions 
 ( 
 ImmutableList 
 . 
 of 
 ( 
 conversion 
 )); 
 request 
 . 
 setEncryptionInfo 
 ( 
 encryptionInfo 
 ); 
 ConversionsBatchUpdateResponse 
  
 response 
  
 = 
  
 reporting 
 . 
 conversions 
 () 
  
 . 
 batchupdate 
 ( 
 profileId 
 , 
  
 request 
 ). 
 execute 
 (); 

PHP

 $batch = new Google_Service_Dfareporting_ConversionsBatchUpdateRequest(); 
 $batch->setConversions([$conversion]); 
 $batch->setEncryptionInfo($encryptionInfo); 
 $result = $this->service->conversions->batchupdate( 
 $values['user_profile_id'], 
 $batch 
 ); 

Python

 # Update the conversion. 
 request_body 
 = 
 { 
 'conversions' 
 : 
 [ 
 conversion 
 ], 
 'encryptionInfo' 
 : 
 encryption_info 
 } 
 request 
 = 
 service 
 . 
 conversions 
 () 
 . 
 batchupdate 
 ( 
 profileId 
 = 
 profile_id 
 , 
 body 
 = 
 request_body 
 ) 
 response 
 = 
 request 
 . 
 execute 
 () 

Ruby

 # Construct the batch update request. 
 batch_update_request 
  
 = 
  
 DfareportingUtils 
 :: 
 API_NAMESPACE 
 :: 
 ConversionsBatchUpdateRequest 
 . 
 new 
 ( 
  
 conversions 
 : 
  
 [ 
 conversion 
 ] 
 , 
  
 encryption_info 
 : 
  
 encryption_info 
  
 ) 
 # Update the conversion. 
 result 
  
 = 
  
 service 
 . 
 batchupdate_conversion 
 ( 
 profile_id 
 , 
  
 batch_update_request 
 ) 

Be aware that Campaign Manager 360 attempts to edit each conversion in your request on a best-effort basis, rather than updating the entire batch as an all-or-nothing transaction. If some conversions in a batch fail to update, others might still be updated successfully. Therefore, it's recommended that you inspect the returned ConversionsBatchUpdateResponse , to determine the status of each conversion:

C#

 // Handle the batchinsert response. 
 if 
  
 ( 
 ! 
 response 
 . 
 HasFailures 
 . 
 Value 
 ) 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 "Successfully updated conversion for encrypted user ID {0}." 
 , 
  
 conversionUserId 
 ); 
 } 
  
 else 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 "Error(s) updating 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 updated conversion for encrypted user ID %s.%n" 
 , 
  
 encryptedUserId 
 ); 
 } 
  
 else 
  
 { 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
 "Error(s) updating 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 updated conversion for encrypted user ID %s.', 
 $values['encrypted_user_id'] 
 ); 
 } else { 
 printf( 
 'Error(s) updating 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 updated conversion for encrypted user ID 
 %s 
 .' 
 % 
 encrypted_user_id 
 ) 
 else 
 : 
 print 
 ( 
 'Error(s) updating 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' 
 ]) 

Ruby

 if 
  
 result 
 . 
 has_failures 
  
 puts 
  
 format 
 ( 
 'Error(s) updating conversion for encrypted user ID %s.' 
 , 
  
 existing_conversion 
 [ 
 :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 updated conversion for encrypted user ID %s.' 
 , 
  
 existing_conversion 
 [ 
 :encrypted_user_id 
 ] 
 ) 
 end 

The status field of the response, as seen above, will contain a ConversionStatus object for every conversion included in the original request. If you're only interested in conversions that failed to update, the hasFailures field can be used to quickly determine if anyconversion in the provided batch failed.

Create a Mobile Website
View Site in Mobile | Classic
Share by: