Tests innerhalb von Kampagnen

Mit kampagneninternen Tests wird eine bestimmte Funktion innerhalb einer einzelnen Kampagne getestet. Im Gegensatz zu systemverwalteten Tests, bei denen der Traffic zwischen Kontroll- und Testkampagnen aufgeteilt wird, wird er bei kampagneninternen Tests innerhalb der Kampagne aufgeteilt, je nachdem, ob die Funktion aktiviert ist oder nicht.

Dieser Workflow wird für die folgenden ExperimentType-Werte unterstützt:

ADOPT_AI_MAX
Testet die Auswirkungen von AI Max-Funktionen auf Suchkampagnen.
ADOPT_BROAD_MATCH_KEYWORDS
Testet die Auswirkungen von weitgehend passenden Keywords auf Suchkampagnen.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION
Wird speziell zum Testen von Performance Max-Kampagnen-Funktionen verwendet: Textanpassung und Erweiterung der finalen URL. Ermöglicht es Google AI, Traffic an relevante Landingpages weiterzuleiten und Text-Assets zu generieren, die besser zu Suchanfragen passen.

Einrichtung

  1. Definieren Sie Experiment (mit status auf ENABLED festgelegt) und geben Sie einen Testtyp, eine Kontrollgruppe ExperimentArm und eine Testgruppe ExperimentArm an:
    • Sowohl die Kontroll- als auch die Testgruppe müssen für ADOPT_AI_MAX und ADOPT_BROAD_MATCH_KEYWORDS auf dieselbe Kampagne in campaigns verweisen.
    • Bei PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION wird die Performance Max-Kampagne nur in der Testgruppe in campaigns angegeben. Lassen Sie campaigns in der Kontrollgruppe leer.
  2. Erstellen Sie für ADOPT_AI_MAX ein CampaignOperation-Update mit einer Feldmaske, um ai_max_setting.enable_ai_max zu aktivieren und asset_automation_settings zu konfigurieren.

  3. Senden Sie eine GoogleAdsService.Mutate-Anfrage, die Mutate-Vorgänge zum Erstellen des Tests und der Testgruppen enthält und (für ADOPT_AI_MAX) die Testfunktion für die Kampagne aktiviert.

Bei ADOPT_AI_MAX und ADOPT_BROAD_MATCH_KEYWORDS muss der Traffic in der Kampagne gleichmäßig (50/50) aufgeteilt werden, sodass 50% des Traffics der aktivierten Funktion (der Testgruppe) und 50% nicht (der Kontrollgruppe) ausgesetzt sind. PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION unterstützt benutzerdefinierte Traffic-Aufteilungen, deren Summe 100 ergibt.

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

Bericht zum Test

Da der Traffic von Kontroll- und Testgruppe in einer einzelnen Kampagne kombiniert wird, müssen Sie direkte Testberichte verwenden, um Messwerte zwischen den beiden Gruppen zu vergleichen. In Standardberichten auf Kampagnenebene werden nur zusammengefasste Messwerte für die gesamte Kampagne angezeigt. Es kann nicht zwischen den beiden Gruppen unterschieden werden.

Mit der folgenden GAQL-Abfrage werden Klickstatistiken für einen ADOPT_AI_MAX-Kampagnentest der letzten 30 Tage abgerufen:

SELECT
  experiment.resource_name,
  experiment.name,
  metrics.clicks,
  metrics.control_clicks,
  metrics.clicks_point_estimate,
  metrics.clicks_p_value
FROM experiment
WHERE segments.date DURING LAST_30_DAYS
  AND experiment.type = 'ADOPT_AI_MAX'

Test bewerben, abschließen oder beenden

Nachdem Sie die Ergebnisse ausgewertet haben, können Sie den Test mit ExperimentService abschließen:

  • Beenden: Wenn Sie mit den Ergebnissen nicht zufrieden sind, verwenden Sie EndExperiment. Die Funktion wird deaktiviert und die Kampagne wird wieder für den gesamten Traffic ohne die experimentelle Funktion ausgeliefert. Dies ist ein synchroner Vorgang.
  • Bewerben (ADOPT_AI_MAX und ADOPT_BROAD_MATCH_KEYWORDS): Wenn Sie mit den Ergebnissen eines Suchkampagnen-Tests zufrieden sind, verwenden Sie PromoteExperiment. Dadurch wird die Teständerung als neuer permanenter Status der Kampagne übernommen. Dies ist ein asynchroner Vorgang. Weitere Informationen finden Sie unter Asynchrone Fehler.
  • Abschluss (PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION): PromoteExperiment wird für PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION nicht unterstützt. Verwenden Sie stattdessen GraduateExperiment, um die Einstellungen für die Textanpassung und die Erweiterung der finalen URL der Testgruppe direkt auf die vorhandene Performance Max-Kampagne anzuwenden. Fügen Sie in campaign_budget_mappings einen Eintrag für CampaignBudgetMapping ein, in dem die Kampagne (experiment_campaign) und das Budget (campaign_budget) der Testgruppe angegeben werden. Dies ist ein synchroner Vorgang. GraduateExperiment wird für ADOPT_AI_MAX oder ADOPT_BROAD_MATCH_KEYWORDS nicht unterstützt, da es keine separate Testkampagne gibt, die abgeschlossen werden kann.