Intra-campaign experiments

Intra-campaign experiments are used to test a specific feature within a single campaign. Unlike system-managed experiments where traffic is split between control and treatment campaigns , intra-campaign experiments split traffic within the campaign, based on whether the feature is enabled or not.

This workflow is supported for the following ExperimentType values:

  • ADOPT_AI_MAX
  • ADOPT_BROAD_MATCH_KEYWORDS

Setup

  1. Define the Experiment , providing an experiment type, a control ExperimentArm , and a treatment ExperimentArm . Each arm should reference the same campaign.
  2. Enable the test feature for the experiment by using a field mask. This is notnecessary for ADOPT_BROAD_MATCH_KEYWORDS ; instead, the broad match campaign setting will be enabled automatically upon experiment creation.
  3. Send a GoogleAdsService.Mutate request that includes mutate operations to create the experiment and experiment arms, and (if applicable) to enable the test feature.

Once set up, traffic is split within the campaign such that 50% of traffic is exposed to the enabled feature (the treatment group) and 50% is not (the control group).

Java

 // Create the experiment resource name using a temporary ID. 
 String 
  
 experimentResourceName 
  
 = 
  
 ResourceNames 
 . 
 experiment 
 ( 
 customerId 
 , 
  
 - 
 1L 
 ); 
 // Create the experiment. 
 Experiment 
  
 experiment 
  
 = 
  
 Experiment 
 . 
 newBuilder 
 () 
  
 . 
 setResourceName 
 ( 
 experimentResourceName 
 ) 
  
 . 
 setName 
 ( 
 "ADOPT_AI_MAX Experiment #" 
  
 + 
  
 UUID 
 . 
 randomUUID 
 ()) 
  
 . 
 setType 
 ( 
 ExperimentType 
 . 
 ADOPT_AI_MAX 
 ) 
  
 . 
 build 
 (); 
 MutateOperation 
  
 experimentOperation 
  
 = 
  
 MutateOperation 
 . 
 newBuilder 
 () 
  
 . 
 setExperimentOperation 
 ( 
 ExperimentOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 experiment 
 ). 
 build 
 ()) 
  
 . 
 build 
 (); 
 // Create the control arm. Both arms in an intra-campaign experiment reference the same base 
 // campaign. 
 ExperimentArm 
  
 controlArm 
  
 = 
  
 ExperimentArm 
 . 
 newBuilder 
 () 
  
 . 
 setExperiment 
 ( 
 experimentResourceName 
 ) 
  
 . 
 setName 
 ( 
 "Control Arm" 
 ) 
  
 . 
 setControl 
 ( 
 true 
 ) 
  
 . 
 setTrafficSplit 
 ( 
 50 
 ) 
  
 . 
 addCampaigns 
 ( 
 ResourceNames 
 . 
 campaign 
 ( 
 customerId 
 , 
  
 campaignId 
 )) 
  
 . 
 build 
 (); 
 MutateOperation 
  
 controlArmOperation 
  
 = 
  
 MutateOperation 
 . 
 newBuilder 
 () 
  
 . 
 setExperimentArmOperation 
 ( 
  
 ExperimentArmOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 controlArm 
 ). 
 build 
 ()) 
  
 . 
 build 
 (); 
 // Create the treatment arm. 
 ExperimentArm 
  
 treatmentArm 
  
 = 
  
 ExperimentArm 
 . 
 newBuilder 
 () 
  
 . 
 setExperiment 
 ( 
 experimentResourceName 
 ) 
  
 . 
 setName 
 ( 
 "Treatment Arm" 
 ) 
  
 . 
 setControl 
 ( 
 false 
 ) 
  
 . 
 setTrafficSplit 
 ( 
 50 
 ) 
  
 . 
 addCampaigns 
 ( 
 ResourceNames 
 . 
 campaign 
 ( 
 customerId 
 , 
  
 campaignId 
 )) 
  
 . 
 build 
 (); 
 MutateOperation 
  
 treatmentArmOperation 
  
 = 
  
 MutateOperation 
 . 
 newBuilder 
 () 
  
 . 
 setExperimentArmOperation 
 ( 
  
 ExperimentArmOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 treatmentArm 
 ). 
 build 
 ()) 
  
 . 
 build 
 (); 
 // Create a campaign operation with an update mask to enable AI Max and configure asset 
 // automation settings. 
 // Note: For intra-campaign experiments, these settings are applied to the base campaign but are 
 // only active for the treatment traffic split. 
 Campaign 
  
 campaign 
  
 = 
  
 Campaign 
 . 
 newBuilder 
 () 
  
 . 
 setResourceName 
 ( 
 ResourceNames 
 . 
 campaign 
 ( 
 customerId 
 , 
  
 campaignId 
 )) 
  
 . 
 setAiMaxSetting 
 ( 
 AiMaxSetting 
 . 
 newBuilder 
 (). 
 setEnableAiMax 
 ( 
 true 
 ). 
 build 
 ()) 
  
 . 
 addAssetAutomationSettings 
 ( 
  
 AssetAutomationSetting 
 . 
 newBuilder 
 () 
  
 . 
 setAssetAutomationType 
 ( 
 AssetAutomationType 
 . 
 TEXT_ASSET_AUTOMATION 
 ) 
  
 . 
 setAssetAutomationStatus 
 ( 
 AssetAutomationStatus 
 . 
 OPTED_IN 
 ) 
  
 . 
 build 
 ()) 
  
 . 
 addAssetAutomationSettings 
 ( 
  
 AssetAutomationSetting 
 . 
 newBuilder 
 () 
  
 . 
 setAssetAutomationType 
 ( 
  
 AssetAutomationType 
 . 
 FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION 
 ) 
  
 . 
 setAssetAutomationStatus 
 ( 
 AssetAutomationStatus 
 . 
 OPTED_IN 
 ) 
  
 . 
 build 
 ()) 
  
 . 
 build 
 (); 
 CampaignOperation 
  
 campaignOp 
  
 = 
  
 CampaignOperation 
 . 
 newBuilder 
 () 
  
 . 
 setUpdate 
 ( 
 campaign 
 ) 
  
 . 
 setUpdateMask 
 ( 
 FieldMasks 
 . 
 allSetFieldsOf 
 ( 
 campaign 
 )) 
  
 . 
 build 
 (); 
 MutateOperation 
  
 campaignMutateOperation 
  
 = 
  
 MutateOperation 
 . 
 newBuilder 
 (). 
 setCampaignOperation 
 ( 
 campaignOp 
 ). 
 build 
 (); 
 // Send all mutate operations in a single Mutate request. 
 List<MutateOperation> 
  
 mutateOperations 
  
 = 
  
 ImmutableList 
 . 
 of 
 ( 
  
 experimentOperation 
 , 
  
 controlArmOperation 
 , 
  
 treatmentArmOperation 
 , 
  
 campaignMutateOperation 
 ); 
 try 
  
 ( 
 GoogleAdsServiceClient 
  
 googleAdsServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createGoogleAdsServiceClient 
 ()) 
  
 { 
  
 MutateGoogleAdsRequest 
  
 request 
  
 = 
  
 MutateGoogleAdsRequest 
 . 
 newBuilder 
 () 
  
 . 
 setCustomerId 
 ( 
 Long 
 . 
 toString 
 ( 
 customerId 
 )) 
  
 . 
 addAllMutateOperations 
 ( 
 mutateOperations 
 ) 
  
 . 
 build 
 (); 
  
 MutateGoogleAdsResponse 
  
 response 
  
 = 
  
 googleAdsServiceClient 
 . 
 mutate 
 ( 
 request 
 ); 
  
  

C#

 // Create the experiment resource name using a temporary ID. 
 string 
  
 experimentResourceName 
  
 = 
  
 ResourceNames 
 . 
 Experiment 
 ( 
 customerId 
 , 
  
 - 
 1 
 ); 
 // Create the experiment. 
 MutateOperation 
  
 experimentOperation 
  
 = 
  
 new 
  
 MutateOperation 
 () 
 { 
  
 ExperimentOperation 
  
 = 
  
 new 
  
 ExperimentOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 new 
  
 Experiment 
 () 
  
 { 
  
 ResourceName 
  
 = 
  
 experimentResourceName 
 , 
  
 Name 
  
 = 
  
 $"ADOPT_AI_MAX Experiment #{ExampleUtilities.GetRandomString()}" 
 , 
  
 Type 
  
 = 
  
 ExperimentType 
 . 
 AdoptAiMax 
  
 } 
  
 } 
 }; 
 // Create the control arm. Both arms in an intra-campaign experiment 
 // reference the same base campaign. 
 MutateOperation 
  
 controlArmOperation 
  
 = 
  
 new 
  
 MutateOperation 
 () 
 { 
  
 ExperimentArmOperation 
  
 = 
  
 new 
  
 ExperimentArmOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 new 
  
 ExperimentArm 
 () 
  
 { 
  
 Experiment 
  
 = 
  
 experimentResourceName 
 , 
  
 Name 
  
 = 
  
 "Control Arm" 
 , 
  
 Control 
  
 = 
  
 true 
 , 
  
 TrafficSplit 
  
 = 
  
 50 
 , 
  
 Campaigns 
  
 = 
  
 { 
  
 ResourceNames 
 . 
 Campaign 
 ( 
 customerId 
 , 
  
 campaignId 
 ) 
  
 } 
  
 } 
  
 } 
 }; 
 // Create the treatment arm. 
 MutateOperation 
  
 treatmentArmOperation 
  
 = 
  
 new 
  
 MutateOperation 
 () 
 { 
  
 ExperimentArmOperation 
  
 = 
  
 new 
  
 ExperimentArmOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 new 
  
 ExperimentArm 
 () 
  
 { 
  
 Experiment 
  
 = 
  
 experimentResourceName 
 , 
  
 Name 
  
 = 
  
 "Treatment Arm" 
 , 
  
 Control 
  
 = 
  
 false 
 , 
  
 TrafficSplit 
  
 = 
  
 50 
 , 
  
 Campaigns 
  
 = 
  
 { 
  
 ResourceNames 
 . 
 Campaign 
 ( 
 customerId 
 , 
  
 campaignId 
 ) 
  
 } 
  
 } 
  
 } 
 }; 
 // Create a campaign operation with an update mask to enable AI Max and 
 // configure asset automation settings. 
 // Note: For intra-campaign experiments, these settings are applied to the 
 // base campaign but are only active for the treatment traffic split. 
 Campaign 
  
 campaign 
  
 = 
  
 new 
  
 Campaign 
 () 
 { 
  
 ResourceName 
  
 = 
  
 ResourceNames 
 . 
 Campaign 
 ( 
 customerId 
 , 
  
 campaignId 
 ), 
  
 AiMaxSetting 
  
 = 
  
 new 
  
 Campaign 
 . 
 Types 
 . 
 AiMaxSetting 
  
 { 
  
 EnableAiMax 
  
 = 
  
 true 
  
 } 
 }; 
 campaign 
 . 
 AssetAutomationSettings 
 . 
 Add 
 ( 
 new 
  
 Campaign 
 . 
 Types 
 . 
 AssetAutomationSetting 
 { 
  
 AssetAutomationType 
  
 = 
  
 AssetAutomationType 
 . 
 TextAssetAutomation 
 , 
  
 AssetAutomationStatus 
  
 = 
  
 AssetAutomationStatus 
 . 
 OptedIn 
 }); 
 campaign 
 . 
 AssetAutomationSettings 
 . 
 Add 
 ( 
 new 
  
 Campaign 
 . 
 Types 
 . 
 AssetAutomationSetting 
 { 
  
 AssetAutomationType 
  
 = 
  
 AssetAutomationType 
 . 
 FinalUrlExpansionTextAssetAutomation 
 , 
  
 AssetAutomationStatus 
  
 = 
  
 AssetAutomationStatus 
 . 
 OptedIn 
 }); 
 MutateOperation 
  
 campaignOperation 
  
 = 
  
 new 
  
 MutateOperation 
 () 
 { 
  
 CampaignOperation 
  
 = 
  
 new 
  
 CampaignOperation 
 () 
  
 { 
  
 Update 
  
 = 
  
 campaign 
 , 
  
 UpdateMask 
  
 = 
  
 FieldMasks 
 . 
 AllSetFieldsOf 
 ( 
 campaign 
 ) 
  
 } 
 }; 
 // Send all mutate operations in a single Mutate request. 
 List<MutateOperation> 
  
 mutateOperations 
  
 = 
  
 new 
  
 List<MutateOperation> 
 { 
  
 experimentOperation 
 , 
  
 controlArmOperation 
 , 
  
 treatmentArmOperation 
 , 
  
 campaignOperation 
 }; 
 MutateGoogleAdsResponse 
  
 response 
  
 = 
  
 googleAdsService 
 . 
 Mutate 
 ( 
  
 customerId 
 . 
 ToString 
 (), 
  
 mutateOperations 
 ); 
  
  

PHP

This example is not yet available in PHP; you can take a look at the other languages.

Python

 # Create the experiment resource name using a temporary ID. 
 experiment_resource_name 
 = 
 googleads_service 
 . 
 experiment_path 
 ( 
 customer_id 
 , 
 "-1" 
 ) 
 # Create the experiment. 
 experiment_operation 
 = 
 client 
 . 
 get_type 
 ( 
 "MutateOperation" 
 ) 
 experiment 
 = 
 experiment_operation 
 . 
 experiment_operation 
 . 
 create 
 experiment 
 . 
 resource_name 
 = 
 experiment_resource_name 
 experiment 
 . 
 name 
 = 
 f 
 "ADOPT_AI_MAX Experiment # 
 { 
 uuid4 
 () 
 } 
 " 
 experiment 
 . 
 type_ 
 = 
 client 
 . 
 enums 
 . 
 ExperimentTypeEnum 
 . 
 ADOPT_AI_MAX 
 # Create the control arm. Both arms in an intra-campaign experiment 
 # reference the same base campaign. 
 control_arm_operation 
 = 
 client 
 . 
 get_type 
 ( 
 "MutateOperation" 
 ) 
 control_arm 
 = 
 control_arm_operation 
 . 
 experiment_arm_operation 
 . 
 create 
 control_arm 
 . 
 experiment 
 = 
 experiment_resource_name 
 control_arm 
 . 
 name 
 = 
 "Control Arm" 
 control_arm 
 . 
 control 
 = 
 True 
 control_arm 
 . 
 traffic_split 
 = 
 50 
 control_arm 
 . 
 campaigns 
 . 
 append 
 ( 
 googleads_service 
 . 
 campaign_path 
 ( 
 customer_id 
 , 
 campaign_id 
 ) 
 ) 
 # Create the treatment arm. 
 treatment_arm_operation 
 = 
 client 
 . 
 get_type 
 ( 
 "MutateOperation" 
 ) 
 treatment_arm 
 = 
 treatment_arm_operation 
 . 
 experiment_arm_operation 
 . 
 create 
 treatment_arm 
 . 
 experiment 
 = 
 experiment_resource_name 
 treatment_arm 
 . 
 name 
 = 
 "Treatment Arm" 
 treatment_arm 
 . 
 control 
 = 
 False 
 treatment_arm 
 . 
 traffic_split 
 = 
 50 
 treatment_arm 
 . 
 campaigns 
 . 
 append 
 ( 
 googleads_service 
 . 
 campaign_path 
 ( 
 customer_id 
 , 
 campaign_id 
 ) 
 ) 
 # Create a campaign operation with an update mask to enable AI Max and 
 # configure asset automation settings. 
 # Note: For intra-campaign experiments, these settings are applied to the 
 # base campaign but are only active for the treatment traffic split. 
 campaign_operation 
 = 
 client 
 . 
 get_type 
 ( 
 "MutateOperation" 
 ) 
 campaign 
 = 
 campaign_operation 
 . 
 campaign_operation 
 . 
 update 
 campaign 
 . 
 resource_name 
 = 
 googleads_service 
 . 
 campaign_path 
 ( 
 customer_id 
 , 
 campaign_id 
 ) 
 campaign 
 . 
 ai_max_setting 
 . 
 enable_ai_max 
 = 
 True 
 for 
 asset_automation_type_enum 
 in 
 [ 
 client 
 . 
 enums 
 . 
 AssetAutomationTypeEnum 
 . 
 TEXT_ASSET_AUTOMATION 
 , 
 client 
 . 
 enums 
 . 
 AssetAutomationTypeEnum 
 . 
 FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION 
 , 
 ]: 
 asset_automation_setting 
 = 
 client 
 . 
 get_type 
 ( 
 "Campaign" 
 ) 
 . 
 AssetAutomationSetting 
 () 
 asset_automation_setting 
 . 
 asset_automation_type 
 = 
 ( 
 asset_automation_type_enum 
 ) 
 asset_automation_setting 
 . 
 asset_automation_status 
 = 
 ( 
 client 
 . 
 enums 
 . 
 AssetAutomationStatusEnum 
 . 
 OPTED_IN 
 ) 
 campaign 
 . 
 asset_automation_settings 
 . 
 append 
 ( 
 asset_automation_setting 
 ) 
 client 
 . 
 copy_from 
 ( 
 campaign_operation 
 . 
 campaign_operation 
 . 
 update_mask 
 , 
 protobuf_helpers 
 . 
 field_mask 
 ( 
 None 
 , 
 campaign 
 . 
 _pb 
 ), 
 ) 
 # Send all mutate operations in a single Mutate request. 
 mutate_operations 
 = 
 [ 
 experiment_operation 
 , 
 control_arm_operation 
 , 
 treatment_arm_operation 
 , 
 campaign_operation 
 , 
 ] 
 response 
 = 
 googleads_service 
 . 
 mutate 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 mutate_operations 
 = 
 mutate_operations 
 , 
 ) 
  

Ruby

This example is not yet available in Ruby; you can take a look at the other languages.

Perl

This example is not yet available in Perl; you can take a look at the other languages.

curl

Report on the experiment

Because control and treatment traffic are mixed within a single campaign, you must use direct experiment reporting to compare metrics between the control and treatment groups. Standard campaign-level reporting only shows aggregated metrics for the entire campaign and cannot distinguish between the two groups.

The following GAQL query can be used to retrieve click stats for an ADOPT_AI_MAX intra-campaign experiment.

  SELECT 
  
 experiment 
 . 
 resource_name 
 , 
  
 experiment 
 . 
 name 
 , 
  
 metrics 
 . 
 clicks 
 , 
  
 metrics 
 . 
 control_clicks 
 , 
  
 metrics 
 . 
 clicks_point_estimate 
 , 
  
 metrics 
 . 
 clicks_p_value 
 FROM 
  
 experiment 
 WHERE 
  
 experiment 
 . 
 type 
  
 = 
  
 'ADOPT_AI_MAX' 
 

Promote or end the experiment

After evaluating the results, you can either end or promote the experiment using ExperimentService .

  • End: If you are not satisfied with the results, use EndExperiment . The feature will be disabled, and the campaign will revert to serving all traffic without the experimental feature. This is a synchronous operation.
  • Promote: If you are satisfied with the results, use PromoteExperiment . This applies the experimental change as the new permanent state of the campaign. This is an asynchronous operation; see Asynchronous errors for details.

The graduateoperation is not supported for intra-campaign experiments because there is no separate treatment campaign to graduate.

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