Performance Max reporting

As with other campaign types, you can use GoogleAdsService.SearchStream to retrieve attributes and performance metrics for Performance Max campaigns. See the Google Ads API reporting guide to learn about reporting more generally with the Google Ads API. The following table outlines the options for reporting on Performance Max campaigns organized by objective.

Measurement objective Associated resources Examples
Campaign level performance and placements
Asset group level performance asset_group
Asset performance
Retail campaign performance
Campaign criterion performance location_view Location criterion performance

Campaign level performance

Viewing Performance Max campaign performance is similar to viewing the performance for any other campaign type. However, you must add a filter to include only campaigns with an advertising_channel_type equal to PERFORMANCE_MAX.

All Performance Max campaign performance

For example, the following query returns the performance for all Performance Max campaigns over the last 30 days. You can also limit the results to a single campaign by filtering on campaign.id or campaign.resource_name. This corresponds to the Performance Max channel asset Reporting in the Google Ads UI.

SELECT
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros
FROM campaign
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
  AND segments.date DURING LAST_30_DAYS

Performance Max campaign placements

The performance_max_placement_view exposes placement impression metrics for Performance Max campaigns to gain insights into where a campaign's ads were shown. The following query demonstrates how to retrieve impressions by placement for a specific Performance Max campaign during the last 30 days.

SELECT
  performance_max_placement_view.display_name,
  performance_max_placement_view.placement,
  performance_max_placement_view.placement_type,
  performance_max_placement_view.target_url,
  metrics.impressions,
  campaign.id
FROM performance_max_placement_view
WHERE
  campaign.id = CAMPAIGN_ID
  AND segments.date DURING LAST_30_DAYS

Asset group level performance

In addition to campaign reporting, reporting is available for asset_group resources linked to your Performance Max campaigns.

Asset group ad strength

Because Performance Max campaigns dynamically generate ads for each asset group using the assets attached to that asset group, it's not possible to view individual ad performance. However, the Google Ads API exposes the asset_group.ad_strength field to evaluate how well the associated asset_group entities are set up for optimal ad performance. Learn more about Performance Max ad strength.

The following query demonstrates how to view the ad strength of all asset groups. You can further filter this query on asset_group.id or asset_group.resource_name to view the ad strength of one or more specific asset groups. Alternatively, you can add a campaign filter as described previously, to compare the ad strength of different asset groups within a specified campaign.

SELECT
  asset_group.id,
  asset_group.ad_strength
FROM asset_group
WHERE asset_group.status = 'ENABLED'

Recommendations to improve asset group strength

The Google Ads API provides a recommendation type, IMPROVE_PERFORMANCE_MAX_AD_STRENGTH, which highlights asset groups that should be improved to reach an "Excellent" strength rating. This feature is especially useful for third-party advertisers that enable users to create and manage asset groups.

For more information, visit the Optimization score and recommendations guide.

Asset group performance

The asset_group resource exposes a variety of metrics to measure individual asset group performance. This sample query demonstrates how to retrieve the performance metrics for each asset_group in a specified campaign during the last 7 days.

SELECT
  asset_group.id,
  asset_group.name,
  asset_group.primary_status,
  metrics.conversions,
  metrics.conversions_value,
  metrics.cost_micros,
  metrics.clicks,
  metrics.impressions
FROM asset_group
WHERE campaign.id = CAMPAIGN_ID
  AND segments.date DURING LAST_7_DAYS

Asset performance

It's possible to obtain asset level performance by using the asset_group_asset resource.

Asset performance with asset_group_asset

On the asset_group_asset resource, the performance_label field ranks the asset against other assets of the same type. For more details, see About asset reporting in Performance Max.

SELECT
  asset_group_asset.asset,
  asset_group_asset.performance_label,
  asset_group_asset.status
FROM asset_group_asset
WHERE asset_group.id = ASSET_GROUP_ID
  AND asset_group_asset.status != 'REMOVED'

Top asset combinations

The asset_group_top_combination_view resource can be used to query the top performing combinations of assets in asset groups. This corresponds to the Combinations report in the Google Ads UI. For example, the following query produces a list of the top asset combinations in a specified asset_group. Each row in the response contains a list of asset_group_top_combination_view.asset_group_top_combinations messages of type AssetGroupAssetCombinationData. Each item in that list contains a list of the assets in the respective combination represented as an AssetUsage message.

SELECT asset_group_top_combination_view.asset_group_top_combinations
FROM asset_group_top_combination_view
WHERE asset_group.id = ASSET_GROUP_ID

Taking this a step further, you can adjust this query to generate insights that help with asset selection and better optimize Performance Max campaign performance. The query below produces the top asset combinations by asset group in a single campaign but limits the results to asset groups that have an asset_group.ad_strength of GOOD or EXCELLENT. The resulting asset combinations represent the top asset combinations in the best performing asset groups in the campaign.

SELECT
  asset_group_top_combination_view.asset_group_top_combinations,
  asset_group.ad_strength,
  asset_group.id
FROM asset_group_top_combination_view
WHERE asset_group.ad_strength IN ('GOOD', 'EXCELLENT')
  AND campaign.id = CAMPAIGN_ID

Retail campaign performance

There are a variety of ways to measure Performance Max retail campaigns based on your reporting objectives.

All retail campaigns performance

The most basic example is retrieving the performance of all Performance Max retail campaigns using the methodology of the All Performance Max campaign performance example. To create a Performance Max retail campaign, you must populate the shopping_setting field in your campaign with the merchant_id of your Merchant Center account. Adding the condition campaign.shopping_setting.merchant_id IS NOT NULL to the WHERE clause then filters the result set to include only retail campaigns.

SELECT
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros
FROM campaign
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
  AND campaign.shopping_setting.merchant_id IS NOT NULL
  AND segments.date DURING LAST_30_DAYS

Campaign performance for a feed_label

The campaign.shopping_setting.feed_label field can be used to target specific product feeds in your Merchant Center account. You can filter on this field to get reporting metrics for all campaigns associated with a specific product feed. For example, the following query demonstrates how to retrieve metrics for all Performance Max campaigns that target products intended to be promoted during the winter season.

SELECT
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros
FROM campaign
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
  AND campaign.shopping_setting.merchant_id IS NOT NULL
  AND campaign.shopping_setting.feed_label = 'WINTER-PRODUCTS'
  AND segments.date DURING LAST_30_DAYS

Product performance

You can use the shopping_performance_view to retrieve product-level metrics across all of your Performance Max retail campaigns, as shown in the query below. Filtering on campaign.advertising_channel_type limits the results to Performance Max campaigns, and including segments.product_item_id automatically filters those results to include only retail campaigns because non-retail campaigns don't have any associated products.

SELECT
  segments.product_item_id,
  metrics.clicks,
  metrics.cost_micros,
  metrics.impressions,
  metrics.conversions,
  metrics.all_conversions,
  campaign.advertising_channel_type
FROM shopping_performance_view
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
  AND segments.date DURING LAST_30_DAYS
  AND metrics.clicks > 0
ORDER BY
  metrics.all_conversions DESC,
  metrics.conversions DESC,
  metrics.clicks DESC,
  metrics.cost_micros DESC,
  metrics.impressions DESC

Product performance with cart data

Retail advertisers can access relevant sales and profit metrics such as Revenue, Gross Profit, Gross Profit Margin, and Units sold. These metrics are available to all advertisers who implement Conversions with cart data across Performance Max campaigns and are compatible with the following reports.

The following cart data metrics can be used in reports, such as the shopping_performance_view, for Performance Max for retail campaigns.

The following example demonstrates how these cart data metrics can be used to understand product level performance for Performance Max campaigns in the last 30 days.

SELECT
  segments.product_item_id,
  segments.product_title,
  metrics.average_cart_size,
  metrics.average_order_value_micros,
  metrics.conversions,
  metrics.conversions_value,
  metrics.gross_profit_micros,
  metrics.gross_profit_margin,
  metrics.revenue_micros,
  metrics.units_sold,
  campaign.advertising_channel_type
FROM shopping_performance_view
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
  AND segments.date DURING LAST_30_DAYS
  AND metrics.conversions > 0
ORDER BY
  metrics.gross_profit_margin DESC,
  metrics.revenue_micros DESC,
  metrics.conversions_value DESC

Campaign performance with cart data

Cart data metrics can be used at the campaign level and can be combined with other performance metrics such as impressions, clicks, and cost.

SELECT
  campaign.id,
  campaign.name,
  campaign.advertising_channel_type,
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros,
  metrics.average_order_value_micros,
  metrics.gross_profit_micros,
  metrics.gross_profit_margin
FROM campaign
WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX'
  AND campaign.shopping_setting.merchant_id IS NOT NULL
  AND segments.date DURING LAST_30_DAYS
ORDER BY
  metrics.gross_profit_margin DESC,
  metrics.average_order_value_micros DESC,
  metrics.cost_micros DESC,
  metrics.conversions DESC,
  metrics.clicks DESC,
  metrics.impressions DESC

Campaign performance by asset group and product group

The following example demonstrates how asset_group_product_group_view can be used to retrieve performance metrics by asset_group and asset_group_listing_group_filter. The example segments the results by product partition tree node for each asset_group in the specified campaign.

SELECT
  asset_group.id,
  asset_group_listing_group_filter.id,
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros
FROM asset_group_product_group_view
WHERE campaign.id = CAMPAIGN_ID
  AND segments.date DURING LAST_30_DAYS

Asset group performance by product group

Alternatively, you can use the asset_group_product_group_view to get performance metrics by asset_group_listing_group_filter but limit the results to a single asset_group by adding an asset_group filtering condition to the WHERE clause.

SELECT
  asset_group_listing_group_filter.id,
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros
FROM asset_group_product_group_view
WHERE asset_group.id = ASSET_GROUP_ID
  AND segments.date DURING LAST_30_DAYS

Listing group filter dimension performance

Taking the previous example a step further, you can segment performance metrics by the asset_group_listing_group_filter dimension. The following example demonstrates how to retrieve performance metrics by product brand, which is done by adding asset_group_listing_group_filter.case_value.product_brand.value to the SELECT clause, which also automatically filters the results to only include asset_group_listing_group_filter entities with a product brand dimension.

You can perform a similar analysis by replacing asset_group_listing_group_filter.case_value.product_brand with a different dimension, such as asset_group_listing_group_filter.case_value.product_condition.condition.

SELECT
  asset_group_listing_group_filter.case_value.product_brand.value,
  metrics.impressions,
  metrics.clicks,
  metrics.conversions,
  metrics.cost_micros
FROM asset_group_product_group_view
WHERE asset_group.id = ASSET_GROUP_ID
  AND segments.date DURING LAST_30_DAYS

Campaign criterion performance

Campaign criterion reports are only populated for supported criterion types, which you can find in the create campaign criteria guide.

Location criterion performance

Here is an example of querying Performance Max location criteria data from the location_view report:

SELECT
  campaign.id,
  campaign.name,
  metrics.clicks,
  metrics.impressions,
  campaign_criterion.location.geo_target_constant
FROM location_view
WHERE campaign.status != 'REMOVED'

Identify market opportunities

One of the main use cases for Performance Max reporting is to identify market opportunities which you can use to the benefit of your ad campaigns and your business. Watch the following video for some examples and guidance around PMax reporting to identify market opportunities.

Best practices

We recommend these best practices when reporting on your Performance Max campaigns in the Google Ads API. These include:

  • Using the API efficiently.

  • Using Recommendations to optimize your campaigns.

  • Looking at real-time data and not just historic reporting data.

  • Adding as many assets as possible up to the limit for each asset type, and then waiting and letting Google Ads optimize for you.

Watch the following video for more detail about each of these best practices.