Stay organized with collectionsSave and categorize content based on your preferences.
Performance Max for travel goalscampaigns 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 anasset
groupfor each hotel property.
UnlikeHotel Ads, you don't need to
have access to aHotel Center
accountin 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:
Create a hotel property asset set of typeHOTEL_PROPERTYby settingAssetSet.typetoAssetSetType.HOTEL_PROPERTY.
You'll use the resource name of the created asset set in the later steps.
defcreate_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.createasset_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_nameprint(f"Created an asset set with resource name: '{resource_name}'")returnresource_name
# Creates a hotel property asset set.defcreate_hotel_asset_set(client,customer_id)operation=client.operation.create_resource.asset_setdo|asset_set|asset_set.name="My Hotel propery asset set#{Time.now}"asset_set.type=:HOTEL_PROPERTYend# 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_nameend
subcreate_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 simplicity, our code example creates only one hotel property asset.
Setplace_idof the
createdHotelPropertyAssetobject 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 theplace ID finder.
Create an asset set asset to link the above asset set with the asset by
creating a newAssetSetAssetand
setting itsasset_setto the resource name of the created asset set
andassetto the resource name of the created hotel property asset.
defcreate_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 thespecified 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 nameReturns: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.createasset.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_nameasset_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)returnresponse.mutate_operation_responses[0].asset_result.resource_name
# 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.defcreate_hotel_asset(client,customer_id,place_id,hotel_property_asset_set_resource_name)asset_operation=client.operation.create_resource.assetdo|asset|asset.name='Ad Media Bundle'asset.hotel_property_asset=client.resource.hotel_property_assetdo|hotel_asset|hotel_asset.place_id=place_idendend# 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_assetdo|asa|asa.asset=asset_resource_nameasa.asset_set=hotel_property_asset_set_resource_nameend# 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_nameend
subcreate_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 useTravelAssetSugestionService.SuggestTravelAssetsto 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.
defget_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.returnresponse.hotel_asset_suggestions[0]
subget_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];}
defcreate_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 travelgoals 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 bereferenced 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 hotelproperty 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.createcampaign.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_ADVERTISINGcampaign.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.5returnoperation
# 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.defcreate_performance_max_campaign_operation(client,customer_id,hotel_property_asset_set_resource_name)client.operation.mutatedo|m|m.campaign_operation=client.operation.create_resource.campaigndo|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_setc.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_VALUEc.maximize_conversion_value=client.resource.maximize_conversion_valuedo|mcv|mcv.target_roas=3.5end# 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)endendend
subcreate_campaign_operation{my($customer_id,$hotel_property_asset_set_resource_name)=@_;# Create a mutate operation that creates a campaign operation.returnGoogle::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})})})});}
You need to link all thehotel property assetsto the
asset group you create to experience Performance Max for travel goals.
Without these links, the campaign will be a regular Performance Max
campaign.
# 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_nameasset_group_asset_hotel.asset_group=asset_group_resource_nameasset_group_asset_hotel.field_type=(client.enums.AssetFieldTypeEnum.HOTEL_PROPERTY)operations.append(asset_group_asset_mutate_operation)
# 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.mutatedo|m|m.asset_group_asset_operation=client.operation.create_resource.asset_group_assetdo|aga|aga.field_type=:HOTEL_PROPERTYaga.asset_group=client.path.asset_group(customer_id,ASSET_GROUP_TEMPORARY_ID)aga.asset=hotel_property_asset_resource_nameendend
# 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})})});
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-03 UTC."],[[["\u003cp\u003ePerformance Max for Travel Goals campaigns allow hotel property ads to be displayed across Google's network (Search, Display, Video, Discover).\u003c/p\u003e\n"],["\u003cp\u003eThese campaigns leverage automatic budget allocation, URL expansion, and broader search coverage, eliminating the need for a Hotel Center account.\u003c/p\u003e\n"],["\u003cp\u003eSetting up involves creating hotel property asset entities, optionally using asset suggestions, and building the Performance Max campaign with these elements.\u003c/p\u003e\n"],["\u003cp\u003eTravel Asset Suggestion Service can be used to generate asset ideas for asset group creation but requires allowlist access.\u003c/p\u003e\n"],["\u003cp\u003eThe provided code snippets demonstrate campaign setup, asset linking, and interaction with the Google Ads API for travel-focused Performance Max campaigns across various programming languages.\u003c/p\u003e\n"]]],[],null,[]]