Tests dans une même campagne

Les tests intracampagne permettent de tester une fonctionnalité spécifique dans une seule campagne. Contrairement aux tests gérés par le système, où le trafic est réparti entre les campagnes de contrôle et de traitement, les tests intracampagne répartissent le trafic au sein de la campagne, selon que la fonctionnalité est activée ou non.

Ce workflow est compatible avec les valeurs ExperimentType suivantes :

ADOPT_AI_MAX
Teste l'impact des fonctionnalités AI Max sur les campagnes sur le Réseau de Recherche.
ADOPT_BROAD_MATCH_KEYWORDS
Teste l'impact des mots clés en requête large sur les campagnes sur le Réseau de Recherche.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION
 Utilisé spécifiquement pour tester les fonctionnalités Performance Max : adaptation du texte et extension d'URL finale. Permet à l'IA de Google de rediriger le trafic vers les pages de destination appropriées et de générer des composants Texte correspondant mieux aux requêtes de recherche.

Configuration

  1. Définissez Experiment (avec status défini sur ENABLED), en fournissant un type de test, un ExperimentArm de contrôle et un ExperimentArm de traitement :
    • Pour ADOPT_AI_MAX et ADOPT_BROAD_MATCH_KEYWORDS, le groupe de contrôle et le groupe de traitement doivent tous deux faire référence à la même campagne dans campaigns.
    • Pour PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION, seul le groupe de traitement spécifie la campagne Performance Max dans campaigns (laissez campaigns non défini dans le groupe de contrôle).
  2. Pour ADOPT_AI_MAX, créez une mise à jour CampaignOperation avec un masque de champ pour activer ai_max_setting.enable_ai_max et configurer asset_automation_settings.

  3. Envoyez une requête GoogleAdsService.Mutate incluant des opérations de mutation pour créer le test et les bras de test, et (pour ADOPT_AI_MAX) pour activer la fonctionnalité de test dans la campagne.

Pour ADOPT_AI_MAX et ADOPT_BROAD_MATCH_KEYWORDS, le trafic doit être réparti de manière égale (50/50) dans la campagne. Ainsi, 50% du trafic est exposé à la fonctionnalité activée (groupe de traitement) et 50% ne l'est pas (groupe de contrôle). PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION est compatible avec les répartitions de trafic personnalisées dont la somme est égale à 100.

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

Rapport sur le test

Étant donné que le trafic de contrôle et de traitement est mélangé dans une même campagne, vous devez utiliser les rapports directs sur les tests pour comparer les métriques entre les groupes de contrôle et de traitement. Les rapports standards au niveau de la campagne n'affichent que des métriques agrégées pour l'ensemble de la campagne et ne peuvent pas faire la distinction entre les deux groupes.

La requête GAQL suivante récupère les statistiques sur les clics pour un test ADOPT_AI_MAX intracampagne au cours des 30 derniers jours :

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'

Promouvoir, faire évoluer ou terminer le test

Après avoir évalué les résultats, vous pouvez terminer le test à l'aide de ExperimentService :

  • Fin : si vous n'êtes pas satisfait des résultats, utilisez EndExperiment. La fonctionnalité est désactivée et la campagne revient à la diffusion de tout le trafic sans la fonctionnalité expérimentale. Il s'agit d'une opération synchrone.
  • Promouvoir (ADOPT_AI_MAX et ADOPT_BROAD_MATCH_KEYWORDS) : si vous êtes satisfait des résultats d'un test intra-campagne sur le Réseau de Recherche, utilisez PromoteExperiment. Cela applique la modification expérimentale comme nouvel état permanent de la campagne. Il s'agit d'une opération asynchrone. Pour en savoir plus, consultez Erreurs asynchrones.
  • Terminer (PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION) : PromoteExperiment n'est pas compatible avec PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION. Utilisez plutôt GraduateExperiment pour appliquer les paramètres de personnalisation du texte et d'extension de l'URL finale du bras de traitement directement à la campagne Performance Max existante. Incluez une entrée CampaignBudgetMapping dans campaign_budget_mappings spécifiant la campagne du bras de traitement (experiment_campaign) et son budget (campaign_budget). Il s'agit d'une opération synchrone. (GraduateExperiment n'est pas compatible avec ADOPT_AI_MAX ni ADOPT_BROAD_MATCH_KEYWORDS, car il n'existe pas de campagne de traitement distincte à faire évoluer.)