Vertical ads provide specialized features for AI Max for Search campaigns-enabled Search campaigns that are linked to a vertical feed, such as hotels. You can control which vertical ad formats are served at the ad group level, and you can control which feed entities are targeted using vertical ads item group rules.
Overview
This guide covers two main features for managing vertical ads:
- Format controls: Opt in or opt out of specific ad formats (text ads, booking links, and vertical promotion ads) at the ad group level.
- Vertical ads items management: Filter and target specific inventory from
your linked vertical (formerly called travel) feed using a rule-based system
that involves
SharedSetandSharedCriterion.
Prerequisites
Before you implement these features, make sure your campaign meets the following requirements:
- Campaign type: Must be a Search campaign.
- Vertical feed: An active vertical data feed must be linked at the customer or campaign level. Reference Link vertical data feeds at the campaign level to link a feed at the campaign level. Linking a vertical data feed activates Travel Feeds in Search Ads (TFSA) and enables vertical ads controls for the campaign.
- AI Max for Search campaigns: The AI Max for Search campaigns setting must be enabled on the campaign.
Link vertical data feeds at the campaign level
To activate Travel Feeds in Search Ads (TFSA) and enable vertical ads controls within your campaign, you can link your vertical data feed asset set at the campaign level using the following steps. Alternatively, to enable these features for all campaigns in your account, you can link the feed at the customer level by following the customer-level linking instructions in the Travel Feeds in Search Ads guide.
- Create a
CampaignAssetSetobject, settingasset_setto the resource name of your vertical feed asset set andcampaignto the resource name of your campaign. - Create a
CampaignAssetSetOperationwithcreateset to theCampaignAssetSet. - Submit the operation using
CampaignAssetSetService.MutateCampaignAssetSets.
For more details on managing travel feeds at scale, refer to the Travel Feeds in Search Ads documentation.
Ad group format controls
You can configure which vertical ad formats are active for a specific ad
group. This is managed through the
vertical_ads_format_setting
(VerticalAdsFormatSetting) field on the
AdGroup resource.
Available formats
- Text ads (
disable_text_ads): Enabled by default. Can be disabled. - Booking links (
enable_booking_links): Opt-in required. - Vertical promotion ads
(
enable_vertical_promotion_ads): Opt-in required.
Validation rules
- You cannot opt out of all three formats simultaneously for a single ad group.
- These settings only apply to
SEARCH_STANDARDandSEARCH_DYNAMIC_ADSad group types.
Example: Update format settings
The following Java example demonstrates how to disable text ads and enable vertical promotion ads for an existing ad group:
// Assuming 'adGroup' is an existing AdGroup object.
// Example resource name: "customers/{customer_id}/adGroups/{ad_group_id}"
AdGroup adGroupToUpdate = AdGroup.newBuilder()
.setResourceName(adGroup.getResourceName())
.setVerticalAdsFormatSetting(
VerticalAdsFormatSetting.newBuilder()
.setDisableTextAds(true)
.setEnableBookingLinks(false)
.setEnableVerticalPromotionAds(true)
)
.build();
AdGroupOperation operation = AdGroupOperation.newBuilder()
.setUpdate(adGroupToUpdate)
.setUpdateMask(FieldMasks.allSetFieldsOf(adGroupToUpdate))
.build();
// Submit the operation using AdGroupService...
Vertical ads items management
To target a specific subset of your feed inventory, such as "Hotels in Boston" or "Exclude 1-star hotels", you must use vertical ads item group rules.
How the data model works
The data model uses a shared criteria approach:
SharedSet: Create aSharedSetwith typeVERTICAL_ADS_ITEM_GROUP_RULE_LIST.SharedCriterion: Add rules (criteria) to this set. Each rule specifies a dimension, such as City or Hotel Class, and a value. You can also create negative criteria to exclude items.AdGroupCriterion: Link theSharedSetto yourAdGroupusing anAdGroupCriterion(vertical_ads_item_group_rule_list).
Supported dimensions
You can filter entities based on the following dimensions in
SharedCriterion
(VerticalAdsItemGroupRuleInfo):
item_code: Specific listing ID.city_criterion_id,region_criterion_id,country_criterion_id: Geo Target Constant resource names (geoTargetConstants/{id}).hotel_class: Star rating (1-5).user_rating,venue,event_participant_display_name(starting inv24): Event and vertical listing rating, venue, and participant name filters.
Code example: Create and link rules
This Python example creates a rule to include items in "Boston" or "San Francisco" and exclude "1-star" and "2-star" hotels:
# 1. Create the SharedSet
shared_set_operation = client.get_type("SharedSetOperation")
shared_set = shared_set_operation.create
shared_set.name = "Boston/SF Premium Hotels"
shared_set.type_ = (
client.enums.SharedSetTypeEnum.VERTICAL_ADS_ITEM_GROUP_RULE_LIST
)
shared_set.vertical_ads_item_vertical_type = (
client.enums.VerticalAdsItemVerticalTypeEnum.HOTELS
)
shared_set_service = client.get_service("SharedSetService")
shared_set_response = shared_set_service.mutate_shared_sets(
customer_id=customer_id, operations=[shared_set_operation]
)
shared_set_resource_name = shared_set_response.results[0].resource_name
# 2. Add Criteria (Rules) to the SharedSet
shared_criteria_operations = []
# Rule A: Include Boston and SF
geo_target_constant_service = client.get_service("GeoTargetConstantService")
included_city_ids = [1006543, 1014221] # Geo Target Constant IDs
for city_id in included_city_ids:
op = client.get_type("SharedCriterionOperation")
criterion = op.create
criterion.shared_set = shared_set_resource_name
criterion.vertical_ads_item_group_rule.city_criterion_id = (
geo_target_constant_service.geo_target_constant_path(city_id)
)
shared_criteria_operations.append(op)
# Rule B: Exclude 1 and 2 Star Hotels
excluded_stars = [1, 2]
for star_rating in excluded_stars:
op = client.get_type("SharedCriterionOperation")
criterion = op.create
criterion.shared_set = shared_set_resource_name
criterion.vertical_ads_item_group_rule.hotel_class = star_rating
criterion.negative = True # Mark as exclusion
shared_criteria_operations.append(op)
# Submit SharedCriterionOperations...
# 3. Link to AdGroup
ad_group_service = client.get_service("AdGroupService")
ad_group_resource_name = ad_group_service.ad_group_path(
customer_id, ad_group_id
)
agc_operation = client.get_type("AdGroupCriterionOperation")
agc = agc_operation.create
agc.ad_group = ad_group_resource_name
agc.status = client.enums.AdGroupCriterionStatusEnum.ENABLED
agc.vertical_ads_item_group_rule_list.shared_set = shared_set_resource_name
# Submit AdGroupCriterionOperation...
Performance reports
You can retrieve performance metrics for vertical ads using the
GoogleAdsService.SearchStream or GoogleAdsService.Search methods.
Vertical ads segments
segments.vertical_ads_hotel_class: Integer value (1 to 5 stars) specifying the class rating for a hotel listing.segments.vertical_ads_listing: Identifier for a specific vertical ad listing.segments.vertical_ads_listing_brand: Brand associated with a vertical ad listing.segments.vertical_ads_listing_city: The city associated with the listing.segments.vertical_ads_listing_country: The country associated with the listing.segments.vertical_ads_listing_region: The region associated with the listing.segments.vertical_ads_partner_account: The partner account within a Partner Center (for example, Hotel Center) that supplies inventory feed data.segments.vertical_ads_vertical: The vertical type, such as hotel or rental car.segments.vertical_ads_event_participant_display_names(starting inv24): The display names of participants in an event listing, such as performers, speakers, or teams.segments.vertical_ads_listing_user_rating(starting inv24): Integer value (1 to 5) specifying the user rating of the vertical ads listing.segments.vertical_ads_listing_venue(starting inv24): The name of the venue for the vertical ads listing (for example, a concert venue).segments.vertical_ads_price_tier(starting inv25): Relative price competitiveness bucket for hotel listings.segments.vertical_ads_rate_rule_id(starting inv25): String identifier corresponding to private or conditional rate rules applied to the bid or impression.segments.vertical_ads_rate_type(starting inv25): Categorization of the public, private, or conditional rate type.
Itinerary dimension segments
Starting in v25, for vertical ads linked to travel and accommodation
feeds, you can segment performance reports using itinerary dimensions:
segments.advance_booking_window: The advance booking window for the itinerary in days.segments.length_of_booking: The length of booking for the itinerary in days.segments.start_date: The start date of the booking formatted asyyyy-MM-dd.segments.start_day_of_week: The start day of week of the booking.segments.user_set_dates: Indicates whether user-specified dates were selected (USER_SELECTEDorDEFAULT_SELECTION).
Vertical ads metrics
Starting in v25, you can retrieve the following vertical ads metrics:
metrics.vertical_ads_potential_impressions: Potential impressions representing the total view-capped eligible impressions available across the query context.metrics.vertical_ads_average_booking_value_micros: Click-weighted average daily rate in micros, including taxes and fees, over the total length of stay.metrics.vertical_ads_price_difference_percentage: Percentage delta comparing the advertiser's offered price against the lowest competing price for the same property.
Sample GAQL query
SELECT
campaign.id,
ad_group.id,
segments.vertical_ads_listing_city,
segments.advance_booking_window,
segments.length_of_booking,
segments.start_date,
metrics.impressions,
metrics.vertical_ads_potential_impressions,
metrics.clicks,
metrics.all_conversions_value,
metrics.vertical_ads_average_booking_value_micros,
metrics.vertical_ads_price_difference_percentage
FROM
ad_group
WHERE
segments.date DURING LAST_30_DAYS
Error handling
These are common errors you may encounter when configuring vertical ads:
| Error code | Cause | Recommended action |
|---|---|---|
AdGroupError.INVALID_VERTICAL_ADS_FORMAT_SETTING |
All three ad formats (text, booking link, promotion ads) were disabled simultaneously. | Ensure at least one format is enabled in
VerticalAdsFormatSetting. |
AdGroupError.VERTICAL_ADS_FORMAT_SETTING_NOT_SUPPORTED_FOR_CAMPAIGNS_WITHOUT_AI_MAX |
The campaign does not have AI Max for Search campaigns enabled. | Enable AI Max for Search campaigns in campaign settings. |
AdGroupError.VERTICAL_ADS_FORMAT_SETTING_NOT_SUPPORTED_FOR_CAMPAIGNS_WITHOUT_ENABLED_TRAVEL_FEED |
The campaign lacks an active vertical data feed. | Ensure a valid vertical feed is linked at the customer or campaign level. |
CriterionError.VERTICAL_ADS_ITEM_GROUP_RULE_LIST_DOES_NOT_EXIST |
The SharedSet resource name provided in the
AdGroupCriterion does not exist. |
Verify the shared_set resource name matches a created
set. |
CriterionError.VERTICAL_ADS_ITEM_GROUP_RULE_NOT_SUPPORTED_FOR_THE_VERTICAL_TYPE |
The criterion dimension used is not supported for the specific vertical, such as hotel class for car rentals. | Check that the vertical_ads_item_group_rule dimension
matches your vertical type. |