Performance Max for travel goals

Performance Max for travel goals campaigns let you create ads for hotel properties that serve across Google channels such as Search, Display, Video, and Discover. Benefits also include automatic budget allocation across channels, final URL expansion, increased ad coverage on Search, and suggestions for assets to be created as an asset group for each hotel property.

Unlike Hotel Ads , you don't need to have access to a Hotel Center account in order to use Performance Max for travel goals.

Create a Performance Max for travel goals campaign

The steps for creating a Performance Max for travel goals campaign are as follows:

  1. Create an asset set, assets for all your hotel properties, and asset set assets to link the created asset set and assets .
  2. (Recommended) Get suggested assets that you can use to create an asset group .
  3. Create a Performance Max campaign using the asset set and the suggested assets .

Create asset entities for your hotel properties

  1. Create a hotel property asset set of type HOTEL_PROPERTY by setting AssetSet.type to AssetSetType.HOTEL_PROPERTY . You'll use the resource name of the created asset set in the later steps.

    Java

     private 
      
     String 
      
     createHotelAssetSet 
     ( 
     GoogleAdsClient 
      
     googleAdsClient 
     , 
      
     long 
      
     customerId 
     ) 
      
     { 
      
     // Creates an asset set operation for a hotel property asset set. 
      
     AssetSetOperation 
      
     assetSetOperation 
      
     = 
      
     AssetSetOperation 
     . 
     newBuilder 
     () 
      
     . 
     setCreate 
     ( 
      
     AssetSet 
     . 
     newBuilder 
     () 
      
     . 
     setName 
     ( 
      
     "My Hotel propery asset set #" 
      
     + 
      
     CodeSampleHelper 
     . 
     getPrintableDateTime 
     ()) 
      
     . 
     setType 
     ( 
     AssetSetType 
     . 
     HOTEL_PROPERTY 
     )) 
      
     . 
     build 
     (); 
      
     try 
      
     ( 
     AssetSetServiceClient 
      
     assetSetServiceClient 
      
     = 
      
     googleAdsClient 
     . 
     getLatestVersion 
     (). 
     createAssetSetServiceClient 
     ()) 
      
     { 
      
     MutateAssetSetsResponse 
      
     mutateAssetSetsResponse 
      
     = 
      
     assetSetServiceClient 
     . 
     mutateAssetSets 
     ( 
      
     Long 
     . 
     toString 
     ( 
     customerId 
     ), 
      
     ImmutableList 
     . 
     of 
     ( 
     assetSetOperation 
     )); 
      
     String 
      
     assetSetResourceName 
      
     = 
      
     mutateAssetSetsResponse 
     . 
     getResults 
     ( 
     0 
     ). 
     getResourceName 
     (); 
      
     System 
     . 
     out 
     . 
     printf 
     ( 
     "Created an asset set with resource name: '%s'%n" 
     , 
      
     assetSetResourceName 
     ); 
      
     return 
      
     assetSetResourceName 
     ; 
      
     } 
     } 
      
      
    

    C#

     private 
      
     string 
      
     CreateHotelAssetSet 
     ( 
     GoogleAdsClient 
      
     client 
     , 
      
     long 
      
     customerId 
     ) 
     { 
      
     AssetSetOperation 
      
     operation 
      
     = 
      
     new 
      
     AssetSetOperation 
     () 
      
     { 
      
     Create 
      
     = 
      
     new 
      
     AssetSet 
      
     { 
      
     Name 
      
     = 
      
     "My Hotel property asset set #" 
      
     + 
      
     ExampleUtilities 
     . 
     GetRandomString 
     (), 
      
     Type 
      
     = 
      
     AssetSetType 
     . 
     HotelProperty 
      
     } 
      
     }; 
      
     AssetSetServiceClient 
      
     assetSetService 
      
     = 
      
     client 
     . 
     GetService 
     ( 
     Services 
     . 
     V21 
     . 
     AssetSetService 
     ); 
      
     MutateAssetSetsResponse 
      
     response 
      
     = 
      
     assetSetService 
     . 
     MutateAssetSets 
     ( 
      
     customerId 
     . 
     ToString 
     (), 
      
     new 
      
     List<AssetSetOperation> 
      
     { 
      
     operation 
      
     } 
      
     ); 
      
     string 
      
     assetResourceName 
      
     = 
      
     response 
     . 
     Results 
     [ 
     0 
     ]. 
     ResourceName 
     ; 
      
     Console 
     . 
     WriteLine 
     ( 
     $"Created an asset set with resource name: {assetResourceName}" 
     ); 
      
     return 
      
     assetResourceName 
     ; 
     } 
      
      
    

    PHP

     private static function createHotelAssetSet( 
     GoogleAdsClient $googleAdsClient, 
     int $customerId 
     ): string { 
     // Creates an asset set operation for a hotel property asset set. 
     $assetSetOperation = new AssetSetOperation([ 
     // Creates a hotel property asset set. 
     'create' => new AssetSet([ 
     'name' => 'My Hotel propery asset set #' . Helper::getPrintableDatetime(), 
     'type' => AssetSetType::HOTEL_PROPERTY 
     ]) 
     ]); 
     // Issues a mutate request to add a hotel asset set and prints its information. 
     $assetSetServiceClient = $googleAdsClient->getAssetSetServiceClient(); 
     $response = $assetSetServiceClient->mutateAssetSets( 
     MutateAssetSetsRequest::build($customerId, [$assetSetOperation]) 
     ); 
     $assetSetResourceName = $response->getResults()[0]->getResourceName(); 
     printf("Created an asset set with resource name: '%s'.%s", $assetSetResourceName, PHP_EOL); 
     return $assetSetResourceName; 
     }  
     
    

Python

 def 
  
 create_hotel_asset_set 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 ) 
 - 
> str 
 : 
  
 """Creates a hotel property asset set. 
 Args: 
 client: an initialized GoogleAdsClient instance. 
 customer_id: a client customer ID. 
 Returns: 
 the created hotel property asset set's resource name. 
 """ 
 # Creates an asset set operation for a hotel property asset set. 
 operation 
 : 
 AssetSetOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "AssetSetOperation" 
 ) 
 # Creates a hotel property asset set. 
 asset_set 
 : 
 AssetSet 
 = 
 operation 
 . 
 create 
 asset_set 
 . 
 name 
 = 
 f 
 "My hotel property asset set # 
 { 
 get_printable_datetime 
 () 
 } 
 " 
 asset_set 
 . 
 type_ 
 = 
 client 
 . 
 enums 
 . 
 AssetSetTypeEnum 
 . 
 HOTEL_PROPERTY 
 # Issues a mutate request to add a hotel asset set. 
 asset_set_service 
 : 
 AssetSetServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "AssetSetService" 
 ) 
 response 
 : 
 MutateAssetSetsResponse 
 = 
 asset_set_service 
 . 
 mutate_asset_sets 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 operation 
 ] 
 ) 
 resource_name 
 : 
 str 
 = 
 response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 print 
 ( 
 f 
 "Created an asset set with resource name: ' 
 { 
 resource_name 
 } 
 '" 
 ) 
 return 
 resource_name  
 
 . 
 py 

Ruby

 # Creates a hotel property asset set. 
 def 
  
 create_hotel_asset_set 
 ( 
 client 
 , 
  
 customer_id 
 ) 
  
 operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 create_resource 
 . 
 asset_set 
  
 do 
  
 | 
 asset_set 
 | 
  
 asset_set 
 . 
 name 
  
 = 
  
 "My Hotel propery asset set 
 #{ 
 Time 
 . 
 now 
 } 
 " 
  
 asset_set 
 . 
 type 
  
 = 
  
 :HOTEL_PROPERTY 
  
 end 
  
 # Sends the mutate request. 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 asset_set 
 . 
 mutate_asset_sets 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 operations 
 : 
  
 [ 
 operation 
 ] 
  
 ) 
  
 # Prints some information about the response. 
  
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 end  
 
 . 
 rb 
  

Perl

 sub 
  
 create_hotel_asset_set 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 my 
  
 $asset_set_operation 
  
 = 
  
 Google::Ads::GoogleAds::V21::Services::AssetSetService:: 
 AssetSetOperation 
 - 
>  
 new 
 ({ 
  
 # Creates a hotel property asset set. 
  
 create 
  
 = 
>  
 Google::Ads::GoogleAds::V21::Resources:: 
 AssetSet 
 - 
> new 
 ({ 
  
 name 
  
 = 
>  
 'My Hotel propery asset set #' 
  
 . 
  
 uniqid 
 (), 
  
 type 
  
 = 
>  
 HOTEL_PROPERTY 
  
 })}); 
  
 # Issues a mutate request to add a hotel asset set and prints its information. 
  
 my 
  
 $response 
  
 = 
  
 $api_client 
 - 
> AssetSetService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $asset_set_operation 
 ]}); 
  
 my 
  
 $asset_set_resource_name 
  
 = 
  
 $response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
  
 printf 
  
 "Created an asset set with resource name: '%s'.\n" 
 , 
  
 $asset_set_resource_name 
 ; 
  
 return 
  
 $asset_set_resource_name 
 ; 
 } 
  
  
  • For each of your hotel properties, do the following:

    1. Create an asset by setting Asset.hotel_property_asset to an object of HotelPropertyAsset .

      For simplicity, our code example creates only one hotel property asset.

    2. Set place_id of the created HotelPropertyAsset object to the place ID of the hotel property. The place ID is a unique ID that identifies a place on Google Maps. You can look up your property with the place ID finder .

    3. Create an asset set asset to link the above asset set with the asset by creating a new AssetSetAsset and setting its asset_set to the resource name of the created asset set and asset to the resource name of the created hotel property asset.

    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 
     . 
     V21 
     . 
     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  
     
     . 
     py 
    

    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  
     
     . 
     rb 
      
    

    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::V21::Utils::ResourceNames:: 
     asset 
     ( 
     $customer_id 
     , 
      
     ASSET_TEMPORARY_ID 
     ); 
      
     # Create a mutate operation for a hotel property asset. 
      
     push 
      
     @$operations 
     , 
      
     Google::Ads::GoogleAds::V21::Services::GoogleAdsService:: 
     MutateOperation 
     - 
    >  
     new 
     ({ 
      
     assetOperation 
      
     = 
    >  
     Google::Ads::GoogleAds::V21::Services::AssetService:: 
     AssetOperation 
     - 
    >  
     new 
     ({ 
      
     create 
      
     = 
    >  
     Google::Ads::GoogleAds::V21::Resources:: 
     Asset 
     - 
    > new 
     ({ 
      
     resourceName 
      
     = 
    >  
     $asset_resource_name 
     , 
      
     hotelPropertyAsset 
      
     = 
    >  
     Google::Ads::GoogleAds::V21::Common:: 
     HotelPropertyAsset 
     - 
    > new 
     ({ 
      
     placeId 
      
     = 
    >  
     $place_id 
      
     })})})}); 
      
     # Create a mutate operation for an asset set asset. 
      
     push 
      
     @$operations 
     , 
      
     Google::Ads::GoogleAds::V21::Services::GoogleAdsService:: 
     MutateOperation 
     - 
    >  
     new 
     ({ 
      
     assetSetAssetOperation 
      
     = 
    >  
     Google::Ads::GoogleAds::V21::Services::AssetSetAssetService:: 
     AssetSetAssetOperation 
      
     - 
    > new 
     ({ 
      
     create 
      
     = 
    >  
     Google::Ads::GoogleAds::V21::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 
     }; 
     } 
      
      
    

    Get suggested assets that you can use to create an asset group

    You can use TravelAssetSugestionService.SuggestTravelAssets to get suggested assets for your hotel properties. Once you get the suggestions, you can use them to create assets in the asset group in the next step.

    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 
     . 
     V21 
     . 
     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  
     
     . 
     rb 
      
    

    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 
     ]; 
     } 
      
      
    

    Caveats

    • This method works on a best-effort basis, so you might not get any suggestions.
    • The service might not return all the required assets you need to create an asset group. In that case, create your own assets to fulfill the requirements.

    Create a Performance Max campaign using the asset set and the suggested assets

    Since this is a subtype of a Performance Max campaign, it has basic Performance Max requirements and restrictions, such as minimum asset requirements and the requirement that its campaign budget cannot be shared .

    In general, you can follow most of the steps to create a Performance Max campaign . The differences worth noting are the following:

    • When creating a campaign, you need to also specify the Campaign.hotel_property_asset_set to the resource name of the asset set created in the first step .

      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. 
        
       . 
       setStartDate 
       ( 
       new 
        
       DateTime 
       (). 
       plusDays 
       ( 
       1 
       ). 
       toString 
       ( 
       "yyyyMMdd" 
       )) 
        
       . 
       setEndDate 
       ( 
       new 
        
       DateTime 
       (). 
       plusDays 
       ( 
       365 
       ). 
       toString 
       ( 
       "yyyyMMdd" 
       )) 
        
       . 
       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  
       
       . 
       py 
      

      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  
       
       . 
       rb 
        
      

      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::V21::Services::GoogleAdsService:: 
       MutateOperation 
       - 
      >  
       new 
       ({ 
        
       campaignOperation 
        
       = 
      >  
       Google::Ads::GoogleAds::V21::Services::CampaignService:: 
       CampaignOperation 
        
       - 
      > new 
       ({ 
        
       create 
        
       = 
      >  
       Google::Ads::GoogleAds::V21::Resources:: 
       Campaign 
       - 
      > new 
       ({ 
        
       # Assign the resource name with a temporary ID. 
        
       resourceName 
        
       = 
      >  
       Google::Ads::GoogleAds::V21::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::V21::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::V21::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::V21::Common:: 
       MaximizeConversionValue 
       - 
      >  
       new 
       ({ 
        
       targetRoas 
        
       = 
      >  
       3.5 
        
       })})})}); 
       } 
        
        
      
    • Instead of creating an asset group from scratch, you can now use the suggestion from TravelAssetSugestionService.SuggestTravelAssets when creating the asset group. You need to add more assets to fulfill the minimum asset requirements of Performance Max if the suggested assets are not enough.

    • You need to link all the hotel property assets to the asset group you create to experience Performance Max for travel goals. Without these links, the campaign will be a regular Performance Max campaign.

      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  
       
       . 
       rb 
        
      

      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::V21::Services::GoogleAdsService:: 
       MutateOperation 
       - 
      >  
       new 
       ({ 
        
       assetGroupAssetOperation 
        
       = 
      >  
       Google::Ads::GoogleAds::V21::Services::AssetGroupAssetService:: 
       AssetGroupAssetOperation 
        
       - 
      > new 
       ({ 
        
       create 
        
       = 
      >  
       Google::Ads::GoogleAds::V21::Resources:: 
       AssetGroupAsset 
       - 
      > new 
       ({ 
        
       asset 
        
       = 
      >  
       $hotel_property_asset_resource_name 
       , 
        
       assetGroup 
        
       = 
      >  
       $asset_group_resource_name 
       , 
        
       fieldType 
        
       = 
      >  
       HOTEL_PROPERTY 
        
       })})}); 
        
        
      
    Design a Mobile Site
    View Site in Mobile | Classic
    Share by: