旅行関連の目標に基づく P-MAX

旅行関連の目標達成のための P-MAX キャンペーンでは、検索、ディスプレイ、動画、Discover などの Google チャネルで配信されるホテル施設の広告を作成できます。また、チャネル間での予算の自動配分、最終ページ URL の拡張、検索広告の掲載範囲の拡大、各ホテル施設のアセット グループとして作成するアセットの候補の表示などのメリットもあります。

旅行関連の目標達成のための P-MAX を使用するには、Campaign.hotel_property_asset_set を介してホテル施設のアセットセットをリンクするために、Google 広告アカウントに関連付けられた有効な Hotel Center アカウント リンクが必要です。Google 広告の管理画面で Hotel Center アカウントを Google 広告にリンクするか、ProductLinkInvitationService を使用してリンクの招待を管理できます(ホテル広告の前提条件を参照)。

旅行関連の目標達成のための P-MAX キャンペーンを作成する

旅行関連の目標達成のための P-MAX キャンペーンを作成する手順は次のとおりです。

  1. リンクされた Hotel Center アカウントから同期されたホテル物件のアセットセットとホテル物件のアセットを取得します。
  2. (推奨)アセット グループの作成に使用できるアセットの候補を取得します。
  3. アセットセットと推奨アセットを使用して P-MAX キャンペーンを作成する。

ホテル物件のアセット エンティティを取得する

Hotel Center アカウントを Google 広告にリンクすると、Google 広告はホテル施設の広告アセット エンティティを自動的にプロビジョニングして同期します。

サードパーティの宿泊料金のサポート終了に伴い、アカウントがリンクされると、HOTEL_PROPERTY アセットセットが Hotel Center フィード シンカーによって自動的に入力されます。AssetSetService.MutateAssetSets を使用して HOTEL_PROPERTY アセットセットを直接作成することは、許可リストに登録された内部同期プロセスに制限されており、MutateError.MUTATE_NOT_ALLOWED エラーが返されます。

  1. asset_set をクエリして、リンクされた Hotel Center アカウントの同期された HOTEL_PROPERTY アセットセットのリソース名を取得します。このリソース名は、以降の手順で使用します。

    SELECT
      asset_set.resource_name,
      asset_set.name,
      asset_set.hotel_property_data.hotel_center_id,
      asset_set.hotel_property_data.partner_name
    FROM asset_set
    WHERE asset_set.type = 'HOTEL_PROPERTY'
      AND asset_set.status = 'ENABLED'
    
  2. asset_set_asset をクエリして、HOTEL_PROPERTY アセットセットにリンクされている同期済みの HotelPropertyAsset エンティティのリソース名を取得します。

    SELECT
      asset_set_asset.asset_set,
      asset_set_asset.asset,
      asset.hotel_property_asset.place_id,
      asset.hotel_property_asset.hotel_name
    FROM asset_set_asset
    WHERE asset_set_asset.asset_set = '<ASSET_SET_RESOURCE_NAME>'
      AND asset_set_asset.status = 'ENABLED'
    

    HotelPropertyAsset エンティティを追加で作成し(Asset.hotel_property_asset とその place_id を設定)、AssetSetAsset を使用してホテル物件アセットセットにリンクする必要がある場合は、次の例をご覧ください。

    Java

    private String createHotelAsset(
        GoogleAdsClient googleAdsClient,
        long customerId,
        String placeId,
        String hotelPropertyAssetSetResourceName) {
      // Uses the GoogleAdService to create an asset and asset set asset in a single request.
      List<MutateOperation> mutateOperations = new ArrayList<>();
      String assetResourceName = ResourceNames.asset(customerId, ASSET_TEMPORARY_ID);
      // Creates a mutate operation for a hotel property asset.
      Asset hotelPropertyAsset =
          Asset.newBuilder()
              .setResourceName(assetResourceName)
              .setHotelPropertyAsset(HotelPropertyAsset.newBuilder().setPlaceId(placeId))
              .build();
      mutateOperations.add(
          MutateOperation.newBuilder()
              .setAssetOperation(AssetOperation.newBuilder().setCreate(hotelPropertyAsset))
              .build());
    
      // Creates a mutate operation for an asset set asset.
      AssetSetAsset assetSetAsset =
          AssetSetAsset.newBuilder()
              .setAsset(assetResourceName)
              .setAssetSet(hotelPropertyAssetSetResourceName)
              .build();
      mutateOperations.add(
          MutateOperation.newBuilder()
              .setAssetSetAssetOperation(AssetSetAssetOperation.newBuilder().setCreate(assetSetAsset))
              .build());
      // Issues a mutate request to create all entities.
      try (GoogleAdsServiceClient googleAdsServiceClient =
          googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
        MutateGoogleAdsResponse mutateGoogleAdsResponse =
            googleAdsServiceClient.mutate(Long.toString(customerId), mutateOperations);
        System.out.println("Created the following entities for the hotel asset:");
        printResponseDetails(mutateGoogleAdsResponse);
        // Returns the created asset resource name, which will be used later to create an asset
        // group. Other resource names are not used later.
        return mutateGoogleAdsResponse
            .getMutateOperationResponses(0)
            .getAssetResult()
            .getResourceName();
      }
    }
          

    C#

    private string CreateHotelAsset(
        GoogleAdsClient client, long customerId, string placeId,
        string hotelPropertyAssetSetResourceName)
    {
        // Uses the GoogleAdService to create an asset and asset set asset in a single request.
        List<MutateOperation> mutateOperations = new List<MutateOperation>();
        string assetResourceName = ResourceNames.Asset(customerId, ASSET_TEMPORARY_ID);
    
        // Creates a mutate operation for a hotel property asset.
        Asset hotelPropertyAsset = new Asset()
        {
            ResourceName = assetResourceName,
            HotelPropertyAsset = new HotelPropertyAsset
            {
                PlaceId = placeId
            }
        };
        mutateOperations.Add(new MutateOperation
        {
            AssetOperation = new AssetOperation
            {
               Create = hotelPropertyAsset
            }
        });
    
        // Creates a mutate operation for an asset set asset.
        AssetSetAsset assetSetAsset = new AssetSetAsset
        {
            Asset = assetResourceName,
            AssetSet = hotelPropertyAssetSetResourceName
        };
        mutateOperations.Add(new MutateOperation
        {
            AssetSetAssetOperation = new AssetSetAssetOperation
            {
                Create = assetSetAsset
            }
        });
    
        // Issues a mutate request to create all entities.
        GoogleAdsServiceClient googleAdsServiceClient =
            client.GetService(Services.V26.GoogleAdsService);
    
        MutateGoogleAdsResponse response =
            googleAdsServiceClient.Mutate(customerId.ToString(), mutateOperations);
        Console.WriteLine("Created the following entities for the hotel asset:");
        PrintResponseDetails(response);
    
        return response.MutateOperationResponses[0].AssetResult.ResourceName;
    }
          

    PHP

        private static function createHotelAsset(
            GoogleAdsClient $googleAdsClient,
            int $customerId,
            string $placeId,
            string $assetSetResourceName
        ): string {
            // We use the GoogleAdService to create an asset and asset set asset in a single
            // request.
            $operations = [];
            $assetResourceName =
                ResourceNames::forAsset($customerId, self::ASSET_TEMPORARY_ID);
            // Creates a mutate operation for a hotel property asset.
            $operations[] = new MutateOperation(
                [
                'asset_operation' => new AssetOperation(
                    [
                    // Creates a hotel property asset.
                    'create' => new Asset(
                        [
                        'resource_name' => $assetResourceName,
                        // Creates a hotel property asset for the place ID.
                        'hotel_property_asset' => new HotelPropertyAsset(['place_id' => $placeId]),
                        ]
                    )
                    ]
                )
                ]
            );
            // Creates a mutate operation for an asset set asset.
            $operations[] = new MutateOperation(
                [
                'asset_set_asset_operation' => new AssetSetAssetOperation(
                    [
                    // Creates an asset set asset.
                    'create' => new AssetSetAsset(
                        [
                        'asset' => $assetResourceName,
                        'asset_set' => $assetSetResourceName
                        ]
                    )
                    ]
                )
                ]
            );
    
            // Issues a mutate request to create all entities.
            $googleAdsService = $googleAdsClient->getGoogleAdsServiceClient();
            /**
     * @var MutateGoogleAdsResponse $mutateGoogleAdsResponse
    */
            $mutateGoogleAdsResponse =
                $googleAdsService->mutate(MutateGoogleAdsRequest::build($customerId, $operations));
            print "Created the following entities for the hotel asset:" . PHP_EOL;
            self::printResponseDetails($mutateGoogleAdsResponse);
    
            // Returns the created asset resource name, which will be used later to create an asset
            // group. Other resource names are not used later.
            return $mutateGoogleAdsResponse->getMutateOperationResponses()[0]->getAssetResult()
                ->getResourceName();
        }
          

    Python

    def create_hotel_asset(
        client: GoogleAdsClient,
        customer_id: str,
        place_id: str,
        asset_set_resource_name: str,
    ) -> str:
        """Creates a hotel property asset using the specified place ID.
    
        The place ID must belong to a hotel property. Then, links it to the
        specified asset set.
    
        Args:
            client: an initialized GoogleAdsClient instance.
            customer_id: a client customer ID.
            place_id: a place ID identifying a place in the Google Places database.
            asset_set_resource_name: an asset set resource name
    
        Returns:
            the created hotel property asset's resource name.
        """
        googleads_service: GoogleAdsServiceClient = client.get_service(
            "GoogleAdsService"
        )
        # We use the GoogleAdService to create an asset and asset set asset in a
        # single request.
    
        asset_resource_name: str = googleads_service.asset_path(
            customer_id, ASSET_TEMPORARY_ID
        )
    
        # Creates a mutate operation for a hotel property asset.
        asset_mutate_operation: MutateOperation = client.get_type("MutateOperation")
        # Creates a hotel property asset.
        asset: Asset = asset_mutate_operation.asset_operation.create
        asset.resource_name = asset_resource_name
        # Creates a hotel property asset for the place ID.
        asset.hotel_property_asset.place_id = place_id
    
        # Creates a mutate operation for an asset set asset.
        asset_set_asset_mutate_operation: MutateOperation = client.get_type(
            "MutateOperation"
        )
        # Creates an asset set asset.
    
        asset_set_asset: AssetSetAsset = (
            asset_set_asset_mutate_operation.asset_set_asset_operation.create
        )
        asset_set_asset.asset = asset_resource_name
        asset_set_asset.asset_set = asset_set_resource_name
    
        # Issues a mutate request to create all entities.
        response: MutateGoogleAdsResponse = googleads_service.mutate(
            customer_id=customer_id,
            mutate_operations=[
                asset_mutate_operation,
                asset_set_asset_mutate_operation,
            ],
        )
        print("Created the following entities for the hotel asset:")
        print_response_details(response)
    
        return response.mutate_operation_responses[0].asset_result.resource_name
          

    Ruby

    # Creates a hotel property asset using the specified place ID.
    # The place ID must belong to a hotel property. Then, links it to the
    # specified asset set.
    # See https://developers.google.com/places/web-service/place-id to search for a
    # hotel place ID.
    def create_hotel_asset(
      client,
      customer_id,
      place_id,
      hotel_property_asset_set_resource_name
    )
      asset_operation =
        client.operation.create_resource.asset do |asset|
          asset.name = 'Ad Media Bundle'
          asset.hotel_property_asset =
            client.resource.hotel_property_asset do |hotel_asset|
              hotel_asset.place_id = place_id
            end
        end
    
      # Send the mutate request.
      response =
        client.service.asset.mutate_assets(
          customer_id: customer_id,
          operations: [asset_operation]
        )
    
      asset_resource_name = response.results.first.resource_name
    
      # Creates a mutate operation for an asset set asset.
      asset_set_asset_operation =
        client.operation.create_resource.asset_set_asset do |asa|
          asa.asset = asset_resource_name
          asa.asset_set = hotel_property_asset_set_resource_name
        end
    
      # Sends the mutate request.
      response =
        client.service.asset_set_asset.mutate_asset_set_assets(
          customer_id: customer_id,
          operations: [asset_set_asset_operation]
        )
    
      asset_resource_name
    end
          

    Perl

    sub create_hotel_asset {
      my ($api_client, $customer_id, $place_id, $asset_set_resource_name) = @_;
    
      # We use the GoogleAdService to create an asset and asset set asset in a single request.
      my $operations = [];
      my $asset_resource_name =
        Google::Ads::GoogleAds::V26::Utils::ResourceNames::asset($customer_id,
        ASSET_TEMPORARY_ID);
    
      # Create a mutate operation for a hotel property asset.
      push @$operations,
        Google::Ads::GoogleAds::V26::Services::GoogleAdsService::MutateOperation->
        new({
          assetOperation =>
            Google::Ads::GoogleAds::V26::Services::AssetService::AssetOperation->
            new({
              create => Google::Ads::GoogleAds::V26::Resources::Asset->new({
                  resourceName       => $asset_resource_name,
                  hotelPropertyAsset =>
                    Google::Ads::GoogleAds::V26::Common::HotelPropertyAsset->new({
                      placeId => $place_id
                    })})})});
    
      # Create a mutate operation for an asset set asset.
      push @$operations,
        Google::Ads::GoogleAds::V26::Services::GoogleAdsService::MutateOperation->
        new({
          assetSetAssetOperation =>
            Google::Ads::GoogleAds::V26::Services::AssetSetAssetService::AssetSetAssetOperation
            ->new({
              create => Google::Ads::GoogleAds::V26::Resources::AssetSetAsset->new({
                  asset    => $asset_resource_name,
                  assetSet => $asset_set_resource_name
                })})});
    
      # Issue a mutate request to create all entities.
      my $mutate_google_ads_response = $api_client->GoogleAdsService()->mutate({
        customerId       => $customer_id,
        mutateOperations => $operations
      });
    
      printf "Created the following entities for the hotel asset:\n";
      print_response_details($mutate_google_ads_response);
    
      # Return the created asset resource name, which will be used later to create an asset
      # group. Other resource names are not used later.
      return $mutate_google_ads_response->{mutateOperationResponses}[0]
        {assetResult}{resourceName};
    }
          

    curl

アセット グループの作成に使用できるアセットの候補を取得する

TravelAssetSuggestionService.SuggestTravelAssets を使用すると、ホテル施設の候補アセットを取得できます。候補を取得したら、次のステップでアセット グループにアセットを作成するために使用できます。

Java

private HotelAssetSuggestion getHotelAssetSuggestion(
    GoogleAdsClient googleAdsClient, long customerId, String placeId) {

  try (TravelAssetSuggestionServiceClient travelAssetSuggestionServiceClient =
      googleAdsClient.getLatestVersion().createTravelAssetSuggestionServiceClient()) {
    // Sends a request to suggest assets to be created as an asset group for the Performance Max
    // for travel goals campaign.
    SuggestTravelAssetsResponse suggestTravelAssetsResponse =
        travelAssetSuggestionServiceClient.suggestTravelAssets(
            SuggestTravelAssetsRequest.newBuilder()
                .setCustomerId(Long.toString(customerId))
                // Uses 'en-US' as an example. It can be any language specifications in BCP 47
                // format.
                .setLanguageOption("en-US")
                // The service accepts several place IDs. We use only one here for demonstration.
                .addPlaceIds(placeId)
                .build());
    System.out.printf("Fetched a hotel asset suggestion for the place ID '%s'.%n", placeId);
    return suggestTravelAssetsResponse.getHotelAssetSuggestions(0);
  }
}
      

C#

private HotelAssetSuggestion GetHotelAssetSuggestion(GoogleAdsClient client,
    long customerId, string placeId)
{
    // Get the TravelAssetSuggestionService client.
    TravelAssetSuggestionServiceClient travelAssetSuggestionService =
        client.GetService(Services.V26.TravelAssetSuggestionService);

    SuggestTravelAssetsRequest request = new SuggestTravelAssetsRequest
    {
        CustomerId = customerId.ToString(),
        LanguageOption = "en-US",
    };

    request.PlaceIds.Add(placeId);

    SuggestTravelAssetsResponse response = travelAssetSuggestionService.SuggestTravelAssets(
        request
    );

    Console.WriteLine($"Fetched a hotel asset suggestion for the place ID {placeId}");
    return response.HotelAssetSuggestions[0];
}
      

PHP

private static function getHotelAssetSuggestion(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $placeId
): HotelAssetSuggestion {
    // Send a request to suggest assets to be created as an asset group for the Performance Max
    // for travel goals campaign.
    $travelAssetSuggestionServiceClient =
        $googleAdsClient->getTravelAssetSuggestionServiceClient();
    // Uses 'en-US' as an example. It can be any language specifications in BCP 47 format.
    $request = SuggestTravelAssetsRequest::build($customerId, 'en-US');
    // The service accepts several place IDs. We use only one here for demonstration.
    $request->setPlaceIds([$placeId]);
    $response = $travelAssetSuggestionServiceClient->suggestTravelAssets($request);
    printf("Fetched a hotel asset suggestion for the place ID '%s'.%s", $placeId, PHP_EOL);
    return $response->getHotelAssetSuggestions()[0];
}
      

Python

def get_hotel_asset_suggestion(
    client: GoogleAdsClient, customer_id: str, place_id: str
) -> HotelAssetSuggestion:
    """Returns hotel asset suggestion from TravelAssetsSuggestionService.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.
        place_id: a place ID identifying a place in the Google Places database.

    Returns:
        A HotelAssetSuggestion instance.
    """
    request: SuggestTravelAssetsRequest = client.get_type(
        "SuggestTravelAssetsRequest"
    )
    request.customer_id = customer_id
    # Uses 'en-US' as an example. It can be any language specifications in
    # BCP 47 format.
    request.language_option = "en-US"
    # In this example we only use a single place ID for the purpose of
    # demonstration, but it's possible to append more than one here if needed.
    request.place_ids.append(place_id)
    travel_asset_suggestion_service: TravelAssetSuggestionServiceClient = (
        client.get_service("TravelAssetSuggestionService")
    )
    response: SuggestTravelAssetsResponse = (
        travel_asset_suggestion_service.suggest_travel_assets(request=request)
    )
    print(f"Fetched a hotel asset suggestion for the place ID: '{place_id}'.")

    # Since we sent a single operation in the request, it's guaranteed that
    # there will only be a single item in the response.
    return response.hotel_asset_suggestions[0]
      

Ruby

def get_hotel_asset_suggestion(client, customer_id, place_id)
  response =
    client.service.travel_asset_suggestion.suggest_travel_assets(
      customer_id: customer_id,
      language_option: 'en-US',
      place_ids: [place_id]
    )

  response.hotel_asset_suggestions.first
end
      

Perl

sub get_hotel_asset_suggestion {
  my ($api_client, $customer_id, $place_id) = @_;

  # Send a request to suggest assets to be created as an asset group for the Performance Max
  # for travel goals campaign.
  my $suggest_travel_assets_response =
    $api_client->TravelAssetSuggestionService()->suggest_travel_assets({
      customerId => $customer_id,
      # Uses 'en-US' as an example. It can be any language specifications in BCP 47 format.
      languageOption => 'en-US',
      # The service accepts several place IDs. We use only one here for demonstration.
      placeIds => [$place_id],
    });

  printf "Fetched a hotel asset suggestion for the place ID '%s'.\n", $place_id;
  return $suggest_travel_assets_response->{hotelAssetSuggestions}[0];
}
      

curl

注意点

  • このメソッドはベスト エフォート型で動作するため、候補が返されない場合があります。
  • サービスが、アセット グループの作成に必要な必須アセットをすべて返さない場合があります。その場合は、要件を満たす独自のアセットを作成します。

アセットセットと推奨アセットを使用して P-MAX キャンペーンを作成する

これは P-MAX キャンペーンのサブタイプであるため、アセットの最小要件や、キャンペーンの予算を共有できないという要件など、P-MAX の基本的な要件と制限が適用されます。

一般的に、P-MAX キャンペーンを作成する手順のほとんどに沿って作成できます。注目すべき違いは次のとおりです。

  • キャンペーンを作成するときに、Campaign.hotel_property_asset_set を、最初の手順で作成した HOTEL_PROPERTY アセットセットのリソース名に設定します。v26 以降、Campaign.hotel_property_asset_set を指定するには、有効な Hotel Center アカウントのリンクが必要です(Google 広告の管理画面で設定するか、ProductLinkInvitationService で招待を管理します)。この要件を満たしていない場合は、CampaignError.HOTEL_PROPERTY_ASSET_SET_HOTEL_CENTER_LINK_REQUIRED エラーが返されます。

    Java

    private MutateOperation createCampaignOperation(
        long customerId, String hotelPropertyAssetSetResourceName) {
      Campaign performanceMaxCampaign =
          Campaign.newBuilder()
              .setName("Performance Max for travel goals campaign #" + getPrintableDateTime())
              // Sets the campaign status as PAUSED. The campaign is the only entity in
              // the mutate request that should have its status set.
              .setStatus(CampaignStatus.PAUSED)
              // All Performance Max campaigns have an advertising_channel_type of
              // PERFORMANCE_MAX. The advertising_channel_sub_type should not be set.
              .setAdvertisingChannelType(AdvertisingChannelType.PERFORMANCE_MAX)
              // To create a Performance Max for travel goals campaign, you need to set
              // `hotel_property_asset_set`.
              .setHotelPropertyAssetSet(hotelPropertyAssetSetResourceName)
              // Bidding strategy must be set directly on the campaign.
              // Setting a portfolio bidding strategy by resource name is not supported.
              // Max Conversion and Maximize Conversion Value are the only strategies
              // supported for Performance Max campaigns.
              // An optional ROAS (Return on Advertising Spend) can be set for
              // maximize_conversion_value. The ROAS value must be specified as a ratio in
              // the API. It is calculated by dividing "total value" by "total spend".
              // For more information on Maximize Conversion Value, see the support
              // article: http://support.google.com/google-ads/answer/7684216.
              // A targetRoas of 3.5 corresponds to a 350% return on ad spend.
              .setMaximizeConversionValue(
                  MaximizeConversionValue.newBuilder().setTargetRoas(3.5).build())
              // Assigns the resource name with a temporary ID.
              .setResourceName(ResourceNames.campaign(customerId, CAMPAIGN_TEMPORARY_ID))
              // Sets the budget using the given budget resource name.
              .setCampaignBudget(ResourceNames.campaignBudget(customerId, BUDGET_TEMPORARY_ID))
              // Declares whether this campaign serves political ads targeting the EU.
              .setContainsEuPoliticalAdvertising(DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING)
              // Optional fields.
              .setStartDateTime(new DateTime().plusDays(1).toString("yyyy-MM-dd 00:00:00"))
              .setEndDateTime(new DateTime().plusDays(365).toString("yyyy-MM-dd 23:59:59"))
              .build();
    
      return MutateOperation.newBuilder()
          .setCampaignOperation(
              CampaignOperation.newBuilder().setCreate(performanceMaxCampaign).build())
          .build();
    }
          

    C#

    private MutateOperation CreateCampaignOperation(long customerId,
        string hotelPropertyAssetSetResourceName)
    {
        Campaign performanceMaxCampaign = new Campaign
        {
            Name = "Performance Max for travel goals campaign #" +
                ExampleUtilities.GetRandomString(),
            // Sets the campaign status as PAUSED. The campaign is the only entity in
            // the mutate request that should have its status set.
            Status = CampaignStatus.Paused,
            // All Performance Max campaigns have an advertising_channel_type of
            // PERFORMANCE_MAX. The advertising_channel_sub_type should not be set.
            AdvertisingChannelType = AdvertisingChannelType.PerformanceMax,
            // To create a Performance Max for travel goals campaign, you need to set
            // `hotel_property_asset_set`.
            HotelPropertyAssetSet = hotelPropertyAssetSetResourceName,
            // Bidding strategy must be set directly on the campaign.
            // Setting a portfolio bidding strategy by resource name is not supported.
            // Max Conversion and Maximize Conversion Value are the only strategies
            // supported for Performance Max campaigns.
            // An optional ROAS (Return on Advertising Spend) can be set for
            // maximize_conversion_value. The ROAS value must be specified as a ratio in
            // the API. It is calculated by dividing "total value" by "total spend".
            // For more information on Maximize Conversion Value, see the support
            // article: http://support.google.com/google-ads/answer/7684216.
            // A targetRoas of 3.5 corresponds to a 350% return on ad spend.
            MaximizeConversionValue = new MaximizeConversionValue
            {
                TargetRoas = 3.5
            },
            // Assigns the resource name with a temporary ID.
            ResourceName = ResourceNames.Campaign(customerId, CAMPAIGN_TEMPORARY_ID),
            // Sets the budget using the given budget resource name.
            CampaignBudget = ResourceNames.CampaignBudget(customerId, BUDGET_TEMPORARY_ID),
    
            // Declare whether or not this campaign contains political ads targeting the EU.
            ContainsEuPoliticalAdvertising = EuPoliticalAdvertisingStatus.DoesNotContainEuPoliticalAdvertising,
        };
    
        return new MutateOperation
        {
            CampaignOperation = new CampaignOperation
            {
                Create = performanceMaxCampaign
            }
        };
    }
          

    PHP

    private static function createCampaignOperation(
        int $customerId,
        string $hotelPropertyAssetSetResourceName
    ): MutateOperation {
        // Creates a mutate operation that creates a campaign.
        return new MutateOperation(
            [
            'campaign_operation' => new CampaignOperation(
                [
                'create' => new Campaign(
                    [
                    'name' => 'Performance Max for travel goals campaign #'
                        . Helper::getPrintableDatetime(),
                    // Assigns the resource name with a temporary ID.
                    'resource_name' => ResourceNames::forCampaign(
                        $customerId,
                        self::CAMPAIGN_TEMPORARY_ID
                    ),
                    // Sets the budget using the given budget resource name.
                    'campaign_budget' => ResourceNames::forCampaignBudget(
                        $customerId,
                        self::BUDGET_TEMPORARY_ID
                    ),
                    // The campaign is the only entity in the mutate request that should have its
                    // status set.
                    // Recommendation: Set the campaign to PAUSED when creating it to prevent
                    // the ads from immediately serving.
                    'status' => CampaignStatus::PAUSED,
                    // Performance Max campaigns have an advertising_channel_type of
                    // PERFORMANCE_MAX. The advertising_channel_sub_type should not be set.
                    'advertising_channel_type' => AdvertisingChannelType::PERFORMANCE_MAX,
    
                    // Declare whether or not this campaign serves political ads targeting the EU.
                    'contains_eu_political_advertising' =>
                        EuPoliticalAdvertisingStatus::DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING,
    
                    // To create a Performance Max for travel goals campaign, you need to set
                    // `hotel_property_asset_set`.
                    'hotel_property_asset_set' => $hotelPropertyAssetSetResourceName,
    
                    // Bidding strategy must be set directly on the campaign.
                    // Setting a portfolio bidding strategy by resource name is not supported.
                    // Max Conversion and Maximize Conversion Value are the only strategies
                    // supported for Performance Max campaigns.
                    // An optional ROAS (Return on Advertising Spend) can be set for
                    // maximize_conversion_value. The ROAS value must be specified as a ratio in
                    // the API. It is calculated by dividing "total value" by "total spend".
                    // For more information on Maximize Conversion Value, see the support
                    // article: https://support.google.com/google-ads/answer/7684216.
                    // A target_roas of 3.5 corresponds to a 350% return on ad spend.
                    'maximize_conversion_value' => new MaximizeConversionValue(
                        [
                        'target_roas' => 3.5
                        ]
                    )
                    ]
                )
                ]
            )
            ]
        );
    }
          

    Python

    def create_campaign_operation(
        client: GoogleAdsClient,
        customer_id: str,
        hotel_property_asset_set_resource_name: str,
    ) -> MutateOperation:
        """Creates a mutate operation that creates a new Performance Max for travel
        goals campaign.
    
        Links the specified hotel property asset set to this campaign.
    
        A temporary ID will be assigned to this campaign budget so that it can be
        referenced by other objects being created in the same mutate request.
    
        Args:
            client: an initialized GoogleAdsClient instance.
            customer_id: a client customer ID.
            hotel_property_asset_set_resource_name: the resource name for a hotel
                property asset set.
    
        Returns:
            a MutateOperation message that creates a new Performance Max campaign.
        """
        googleads_service: GoogleAdsServiceClient = client.get_service(
            "GoogleAdsService"
        )
        # Creates a mutate operation that creates a campaign.
        operation: MutateOperation = client.get_type("MutateOperation")
        campaign: Campaign = operation.campaign_operation.create
        campaign.name = (
            "Performance Max for travel goals campaign "
            f"#{get_printable_datetime()}"
        )
        # Assigns the resource name with a temporary ID.
        campaign.resource_name = googleads_service.campaign_path(
            customer_id, CAMPAIGN_TEMPORARY_ID
        )
        # Sets the budget using the given budget resource name.
        campaign.campaign_budget = googleads_service.campaign_budget_path(
            customer_id, BUDGET_TEMPORARY_ID
        )
        # The campaign is the only entity in the mutate request that should have its
        # status set.
        # Recommendation: Set the campaign to PAUSED when creating it to prevent
        # the ads from immediately serving.
        campaign.status = client.enums.CampaignStatusEnum.PAUSED
        # Performance Max campaigns have an advertising_channel_type of
        # PERFORMANCE_MAX. The advertising_channel_sub_type should not be set.
        campaign.advertising_channel_type = (
            client.enums.AdvertisingChannelTypeEnum.PERFORMANCE_MAX
        )
        # Declare whether or not this campaign serves political ads targeting the
        # EU. Valid values are:
        #   CONTAINS_EU_POLITICAL_ADVERTISING
        #   DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING
        campaign.contains_eu_political_advertising = (
            client.enums.EuPoliticalAdvertisingStatusEnum.DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING
        )
        # To create a Performance Max for travel goals campaign, you need to set
        # the `hotel_property_asset_set` field.
        campaign.hotel_property_asset_set = hotel_property_asset_set_resource_name
        # Bidding strategy must be set directly on the campaign.
        # Setting a portfolio bidding strategy by resource name is not supported.
        # Max Conversion and Maximize Conversion Value are the only strategies
        # supported for Performance Max campaigns.
        # An optional ROAS (Return on Advertising Spend) can be set for
        # maximize_conversion_value. The ROAS value must be specified as a ratio in
        # the API. It is calculated by dividing "total value" by "total spend".
        # For more information on Maximize Conversion Value, see the support
        # article: https://support.google.com/google-ads/answer/7684216.
        # A target_roas of 3.5 corresponds to a 350% return on ad spend.
        campaign.maximize_conversion_value.target_roas = 3.5
    
        return operation
          

    Ruby

    # Creates a MutateOperation that creates a new Performance Max campaign.
    #
    # A temporary ID will be assigned to this campaign so that it can
    # be referenced by other objects being created in the same Mutate request.
    def create_performance_max_campaign_operation(
      client,
      customer_id,
      hotel_property_asset_set_resource_name
    )
      client.operation.mutate do |m|
        m.campaign_operation =
          client.operation.create_resource.campaign do |c|
            c.name = "Performance Max for Travel Goals #{SecureRandom.uuid}"
    
            # Set the campaign status as PAUSED. The campaign is the only entity in
            # the mutate request that should have its status set.
            c.status = :PAUSED
    
            # All Performance Max campaigns have an advertising_channel_type of
            # PERFORMANCE_MAX. The advertising_channel_sub_type should not be set.
            c.advertising_channel_type = :PERFORMANCE_MAX
    
            # Declare whether or not this campaign serves political ads targeting the EU.
            # Valid values are CONTAINS_EU_POLITICAL_ADVERTISING and
            # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING.
            c.contains_eu_political_advertising = :DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING
    
            # To create a Performance Max for travel goals campaign, you need to set hotel_property_asset_set
            c.hotel_property_asset_set = hotel_property_asset_set_resource_name
    
            # Bidding strategy must be set directly on the campaign.
            # Setting a portfolio bidding strategy by resource name is not supported.
            # Max Conversion and Maximize Conversion Value are the only strategies
            # supported for Performance Max campaigns.
            # An optional ROAS (Return on Advertising Spend) can be set for
            # maximize_conversion_value. The ROAS value must be specified as a ratio
            # in the API. It is calculated by dividing "total value" by "total spend".
            # For more information on Maximize Conversion Value, see the support
            # article: http://support.google.com/google-ads/answer/7684216.
            # A target_roas of 3.5 corresponds to a 350% return on ad spend.
            c.bidding_strategy_type = :MAXIMIZE_CONVERSION_VALUE
            c.maximize_conversion_value =
              client.resource.maximize_conversion_value do |mcv|
                mcv.target_roas = 3.5
              end
    
            # Assign the resource name with a temporary ID.
            c.resource_name =
              client.path.campaign(
                customer_id,
                PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID
              )
    
            # Set the budget using the given budget resource name.
            c.campaign_budget =
              client.path.campaign_budget(customer_id, BUDGET_TEMPORARY_ID)
          end
      end
    end
          

    Perl

    sub create_campaign_operation {
      my ($customer_id, $hotel_property_asset_set_resource_name) = @_;
    
      # Create a mutate operation that creates a campaign operation.
      return
        Google::Ads::GoogleAds::V26::Services::GoogleAdsService::MutateOperation->
        new({
          campaignOperation =>
            Google::Ads::GoogleAds::V26::Services::CampaignService::CampaignOperation
            ->new({
              create => Google::Ads::GoogleAds::V26::Resources::Campaign->new({
                  # Assign the resource name with a temporary ID.
                  resourceName =>
                    Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
                    $customer_id, CAMPAIGN_TEMPORARY_ID
                    ),
                  name => "Performance Max for travel goals campaign #'" . uniqid(),
                  # Set the budget using the given budget resource name.
                  campaignBudget =>
                    Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign_budget(
                    $customer_id, BUDGET_TEMPORARY_ID
                    ),
                  # Set the campaign status as PAUSED. The campaign is the only entity in
                  # the mutate request that should have its status set.
                  status =>
                    Google::Ads::GoogleAds::V26::Enums::CampaignStatusEnum::PAUSED,
                  # All Performance Max campaigns have an advertisingChannelType of
                  # PERFORMANCE_MAX. The advertisingChannelSubType should not be set.
                  advertisingChannelType => PERFORMANCE_MAX,
    
                  # To create a Performance Max for travel goals campaign, you need to set
                  # `hotelPropertyAssetSet`.
                  hotelPropertyAssetSet => $hotel_property_asset_set_resource_name,
    
                  # Declare whether or not this campaign serves political ads targeting the EU.
                  # Valid values are CONTAINS_EU_POLITICAL_ADVERTISING and
                  # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING.
                  containsEuPoliticalAdvertising =>
                    DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING,
    
                  # Bidding strategy must be set directly on the campaign.
                  # Setting a portfolio bidding strategy by resource name is not supported.
                  # Max Conversion and Max Conversion Value are the only strategies
                  # supported for Performance Max campaigns.
                  # An optional ROAS (Return on Advertising Spend) can be set for
                  # maximizeConversionValue. The ROAS value must be specified as a ratio in
                  # the API. It is calculated by dividing "total value" by "total spend".
                  # For more information on Max Conversion Value, see the support article:
                  # http://support.google.com/google-ads/answer/7684216.
                  # A targetRoas of 3.5 corresponds to a 350% return on ad spend.
                  maximizeConversionValue =>
                    Google::Ads::GoogleAds::V26::Common::MaximizeConversionValue->
                    new({
                      targetRoas => 3.5
                    })})})});
    }
          

    curl

  • アセット グループを最初から作成する代わりに、アセット グループの作成時に TravelAssetSuggestionService.SuggestTravelAssets の候補を使用できるようになりました。提案されたアセットが十分でない場合は、P-MAX のアセットの最小要件を満たすために、さらにアセットを追加する必要があります。

  • 旅行関連の目標達成のための P-MAX を利用するには、作成したアセット グループにすべてのホテル施設アセットをリンクする必要があります。これらのリンクがない場合、キャンペーンは通常の P-MAX キャンペーンになります。

    Java

    // Link the previously created hotel property asset to the asset group. In the real-world
    // scenario, you'd need to do this step several times for each hotel property asset.
    AssetGroupAsset hotelProperyAssetGroupAsset =
        AssetGroupAsset.newBuilder()
            .setAsset(hotelPropertyAssetResourceName)
            .setAssetGroup(assetGroupResourceName)
            .setFieldType(AssetFieldType.HOTEL_PROPERTY)
            .build();
    // Adds an operation to link the hotel property asset to the asset group.
    mutateOperations.add(
        MutateOperation.newBuilder()
            .setAssetGroupAssetOperation(
                AssetGroupAssetOperation.newBuilder().setCreate(hotelProperyAssetGroupAsset))
            .build());
          

    C#

    // Link the previously created hotel property asset to the asset group. In the
    // real-world scenario, you'd need to do this step several times for each hotel property
    // asset.
    AssetGroupAsset hotelPropertyAssetGroupAsset = new AssetGroupAsset
    {
        Asset = hotelPropertyAssetResourceName,
        AssetGroup = assetGroupResourceName,
        FieldType = AssetFieldType.HotelProperty
    };
    
    // Adds an operation to link the hotel property asset to the asset group.
    mutateOperations.Add(new MutateOperation
    {
        AssetGroupAssetOperation = new AssetGroupAssetOperation
        {
            Create = hotelPropertyAssetGroupAsset
        }
    });
          

    PHP

    // Link the previously created hotel property asset to the asset group. In the real-world
    // scenario, you'd need to do this step several times for each hotel property asset.
    $operations[] = new MutateOperation(
        [
        'asset_group_asset_operation' => new AssetGroupAssetOperation(
            [
            'create' => new AssetGroupAsset(
                [
                'asset' => $hotelPropertyAssetResourceName,
                'asset_group' => $assetGroupResourceName,
                'field_type' => AssetFieldType::HOTEL_PROPERTY
                ]
            )
            ]
        )
        ]
    );
          

    Python

    # Link the previously created hotel property asset to the asset group. If
    # there are multiple assets, these steps to create a new operation need to
    # be performed for each asset.
    asset_group_asset_mutate_operation: MutateOperation = client.get_type(
        "MutateOperation"
    )
    asset_group_asset_hotel: AssetGroupAsset = (
        asset_group_asset_mutate_operation.asset_group_asset_operation.create
    )
    asset_group_asset_hotel.asset = hotel_property_asset_resource_name
    asset_group_asset_hotel.asset_group = asset_group_resource_name
    asset_group_asset_hotel.field_type = (
        client.enums.AssetFieldTypeEnum.HOTEL_PROPERTY
    )
    operations.append(asset_group_asset_mutate_operation)
          

    Ruby

    # Link the previously created hotel property asset to the asset group.
    # In the real-world scenario, you'd need to do this step several times for
    # each hotel property asset.
    operations << client.operation.mutate do |m|
      m.asset_group_asset_operation =
        client.operation.create_resource.asset_group_asset do |aga|
          aga.field_type = :HOTEL_PROPERTY
          aga.asset_group =
            client.path.asset_group(customer_id, ASSET_GROUP_TEMPORARY_ID)
          aga.asset = hotel_property_asset_resource_name
        end
    end
          

    Perl

    # Link the previously created hotel property asset to the asset group. In the real-world
    # scenario, you'd need to do this step several times for each hotel property asset.
    push @$operations,
      Google::Ads::GoogleAds::V26::Services::GoogleAdsService::MutateOperation->
      new({
        assetGroupAssetOperation =>
          Google::Ads::GoogleAds::V26::Services::AssetGroupAssetService::AssetGroupAssetOperation
          ->new({
            create =>
              Google::Ads::GoogleAds::V26::Resources::AssetGroupAsset->new({
                asset      => $hotel_property_asset_resource_name,
                assetGroup => $asset_group_resource_name,
                fieldType  => HOTEL_PROPERTY
              })})});
          

    curl