**Important:** This feature is available to allowlisted accounts only. Contact your Google representative if you need access to the feature.

<br />

Campaign Mix experiments are used for complex testing scenarios that involve
comparing multiple variables across one or more campaigns (supporting up to 5
experiment arms). This workflow supports a mix of campaign types within the same
experiment.

This workflow is supported for the following
[`ExperimentType`](https://developers.google.com/google-ads/api/reference/rpc/v26/ExperimentTypeEnum.ExperimentType) value:

- `COMPARE_CAMPAIGNS`

## Overview

The `COMPARE_CAMPAIGNS` experiment type maps to **Custom mixed campaign types**
in the Google Ads UI (which also encompasses **Custom Performance Max**
experiments). Its flexible design supports experiments that don't fit with the
system-managed or intra-campaign workflows.

Campaign Mix experiments let you compare multiple variables across one or more
campaigns by selecting existing campaigns and assigning them to different
experiment arms (up to 5 total). This lets you test different campaign types
(Search, Performance Max, Shopping, Demand Gen, Video, and App) within a single
experiment to optimize budget allocation, evaluate account structures, test
campaign consolidation, and compare various campaign settings.

> [!NOTE]
> **Note:** For testing specific individual features, like Broad Match, use the dedicated feature experiment if it exists (see [Intra-campaign
> experiments](https://developers.google.com/google-ads/api/docs/experiments/intra-campaign)) instead of Campaign Mix experiments. For more details, consult the [Google Ads Help
> Center](https://support.google.com/google-ads/answer/16009098).

### Before you begin

- Campaign Mix experiments let you create up to 5 experiment arms.
- You can add any number of campaigns per arm.
- It is available for all campaign types except Hotel campaigns.
- It supports custom and even traffic splits across arms. The minimum traffic split is 1%, traffic split percentages cannot have decimals, and the sum of `traffic_split` across all arms must equal 100 (100%).
- The same campaign can be added to multiple experiment arms, and the traffic is split according to the percentage chosen. No two experiment arms can have the exact same set of campaigns.
- We recommend having a plan or intent of what you want to experiment with before starting. For example, you should aim to have the same budget amounts per experiment arm, unless budget is what you are specifically testing.

## Setup

Campaign Mix experiments and their experiment arms must be created together in a
single [`GoogleAdsService.Mutate`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsService/Mutate) request using
[temporary resource names](https://developers.google.com/google-ads/api/docs/mutating/best-practices#temporary-resource-names):

1. Create an [`Experiment`](https://developers.google.com/google-ads/api/reference/rpc/v26/Experiment) with a temporary resource name (for example, `customers/CUSTOMER_ID/experiments/-1`), `type` set to `COMPARE_CAMPAIGNS`, and `status` set to `ENABLED`.
2. Create [`ExperimentArm`](https://developers.google.com/google-ads/api/reference/rpc/v26/ExperimentArm) resources referencing the temporary experiment resource name (one control arm with `control = true` and up to four treatment arms with `control = false`), setting `traffic_split` on each arm so that the total equals `100`.
3. Assign existing campaign resource names (`customers/CUSTOMER_ID/campaigns/CAMPAIGN_ID`) to the `campaigns` field on each `ExperimentArm`. Unlike standard system-managed experiments where treatment campaigns are automatically generated in `in_design_campaigns`, Campaign Mix experiments require you to assign existing campaigns directly to each arm.
4. Send the `Experiment` and `ExperimentArm` create operations in a single [`GoogleAdsService.Mutate`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsService/Mutate) request. Because the experiment is created directly with `status = ENABLED`, you do not need to call `ExperimentService.ScheduleExperiment`.

## Report on the experiment

Once the experiment is running, you can query for metrics to compare
performance. See the [Reporting guide](https://developers.google.com/google-ads/api/docs/experiments/reporting) for details.

## Graduate or end

After evaluating the results, you can either end or graduate the experiment
using [`ExperimentService`](https://developers.google.com/google-ads/api/reference/rpc/v26/ExperimentService).

- **End** : If you are not satisfied with the results from any of the treatment arms, use [`EndExperiment`](https://developers.google.com/google-ads/api/reference/rpc/v26/ExperimentService/EndExperiment). This is a synchronous operation.
- **Graduate** : If you prefer the performance of a specific treatment arm, use [`GraduateExperiment`](https://developers.google.com/google-ads/api/reference/rpc/v26/ExperimentService/GraduateExperiment) to graduate that arm. As part of this process, the campaigns associated with other arms (including the control arm) are paused, and the campaigns associated with the graduated treatment arm are converted to independent, non-experimental campaigns. This is a synchronous operation.