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_MAXADOPT_BROAD_MATCH_KEYWORDS
Setup
- Define the
Experiment, providing an experiment type, a controlExperimentArm, and a treatmentExperimentArm. Each arm should reference the same campaign. - Enable the test feature for the experiment by using a field mask. This is
not necessary for
ADOPT_BROAD_MATCH_KEYWORDS; instead, the broad match campaign setting will be enabled automatically upon experiment creation. - Send a
GoogleAdsService.Mutaterequest 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
This example is not yet available in Java; you can take a look at the other languages.
C#
This example is not yet available in C#; you can take a look at the other languages.
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 experiment.status = client.enums.ExperimentStatusEnum.SETUP # 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. 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 graduate operation is not supported for intra-campaign experiments because there is no separate treatment campaign to graduate.