Track ad placement and performance

The Google Ads API offers several views to analyze where your ads have appeared and how they are performing: managed_placement_view, group_placement_view, detail_placement_view, and performance_max_placement_view. Each view provides a different lens on your placement data. For ready-to-run Google Ads Query Language (GAQL) and curl queries that replicate placement screens in the Google Ads UI, see the Query cookbook.

Managed placement view

  • What it shows: The managed_placement_view resource provides performance data aggregated by the positive placement criteria that you target in your ad groups. This view includes all five criterion types managed under Content > Placements in the Google Ads UI: websites, YouTube channels, YouTube videos, mobile apps, and mobile app categories.
  • UI Equivalent: Content > Placements
  • Query Builder: Explore in Query Builder

Targeted placement criterion types

Each row in the managed_placement_view resource populates the AdGroupCriterion field that matches its ad_group_criterion.type value and leaves the other placement fields unset:

UI placement type ad_group_criterion.type value Criterion details fields Notes
Websites PLACEMENT ad_group_criterion.placement.url Target website or domain URL.
YouTube channels YOUTUBE_CHANNEL ad_group_criterion.youtube_channel.channel_id YouTube channel ID. The ad_group_criterion.display_name field returns the channel name.
YouTube videos YOUTUBE_VIDEO ad_group_criterion.youtube_video.video_id YouTube video ID. The ad_group_criterion.display_name field returns the video title.
Apps MOBILE_APPLICATION ad_group_criterion.mobile_application.app_id, ad_group_criterion.mobile_application.name App ID in {platform}-{platform_native_id} format (1- for iOS, 2- for Android) and app name.
App categories MOBILE_APP_CATEGORY ad_group_criterion.mobile_app_category.mobile_app_category_constant Resource name in mobileAppCategoryConstants/{mobile_app_category_id} format. See Mobile app category names and hierarchy.

Example query

To fetch performance metrics across all targeted placement types over the last 30 days, select the ad_group_criterion.type field alongside the type-specific fields:

SELECT
  campaign.id,
  ad_group.id,
  managed_placement_view.resource_name,
  ad_group_criterion.criterion_id,
  ad_group_criterion.type,
  ad_group_criterion.display_name,
  ad_group_criterion.placement.url,
  ad_group_criterion.youtube_channel.channel_id,
  ad_group_criterion.youtube_video.video_id,
  ad_group_criterion.mobile_application.app_id,
  ad_group_criterion.mobile_application.name,
  ad_group_criterion.mobile_app_category.mobile_app_category_constant,
  metrics.impressions,
  metrics.clicks,
  metrics.cost_micros
FROM managed_placement_view
WHERE segments.date DURING LAST_30_DAYS

Mobile app category names and hierarchy

In the Google Ads UI, targeted mobile app categories display their full store path, such as App categories > Apple App Store > Education. When querying the Google Ads API, keep the following behaviors in mind:

  • Attributing mobile app category constants: The mobile_app_category_constant resource isn't an attributed resource of the managed_placement_view resource. Select the ad_group_criterion.mobile_app_category.mobile_app_category_constant field instead (for example, mobileAppCategoryConstants/60503), or query the ad_group_criterion resource when you don't need metrics.
  • Leaf-only display names: Both the ad_group_criterion.display_name and mobile_app_category_constant.name fields return only the leaf category name, such as "Education" or "Games". Neither field includes the parent app store path.
  • Resolving the app store path: Google Play and the Apple App Store share leaf category names across distinct criterion IDs. For example, criterion IDs 60005 (/All Apps/Google Play/Education), 60060 (/All Apps/Google Play/Family/Education), and 60503 (/All Apps/Apple App Store/Education) all return "Education" in the name and display_name fields. Extract the {mobile_app_category_id} suffix from the resource name and look up its full hierarchy path in the Mobile app categories table or CSV file.

Group placement view

  • What it shows: The group_placement_view resource shows where your ads actually served on the Display Network and YouTube, regardless of whether the placements were explicitly targeted or discovered automatically by Google's system. This can include websites, YouTube channels or videos, and apps.
  • UI Equivalent: Content > Where ads showed
  • Query Builder: Explore in Query Builder

Example query

The following query fetches performance metrics for domains, mobile apps, and YouTube channels where ads showed over the last 30 days:

SELECT
  campaign.id,
  ad_group.id,
  group_placement_view.display_name,
  group_placement_view.target_url,
  group_placement_view.placement_type,
  metrics.impressions,
  metrics.clicks,
  metrics.cost_micros
FROM group_placement_view
WHERE segments.date DURING LAST_30_DAYS

"Total: Other" row

To speed up report generation, the group_placement_view and detail_placement_view resources exclude individual placements that don't meet a minimum activity threshold of impressions or interactions.

  • In the Google Ads UI: The UI aggregates placements that don't meet this activity threshold into a summary row labeled Total: Other.
  • In the Google Ads API: The API omits placements that don't meet the activity threshold from report results and doesn't return a summary row where the group_placement_view.placement or detail_placement_view.placement field has the value "Other".

As a result, the sum of individual placement rows in the group_placement_view and detail_placement_view resources might be lower than the total metrics for the ad group or campaign. For more information, see About the "Where ads showed" report. For details on how thresholds and missing metadata affect cross-view comparisons, see Metric differences between placement views and Rows with unavailable placement details.

Placement targeting settings

The behavior and utility of the group_placement_view are influenced by the TargetingSetting for the PLACEMENT dimension at the ad group level. This setting contains a list of target_restrictions, each with a bid_only boolean field that dictates whether your ads show only on targeted placements or on other placements as well. See About "Targeting" and "Observation" settings.

  • bid_only = false: This value corresponds to Targeting in the Google Ads UI for placements. If your ad group is set to "Targeting", your ads only show on the placements you've explicitly added as criteria. You can choose to apply bid adjustments to these placements. In this scenario, group_placement_view largely mirrors managed_placement_view, but is still subject to minimum activity thresholds.
  • bid_only = true: This value corresponds to Observation in the Google Ads UI for placements. If your ad group is set to "Observation", your ads can show on any eligible placement on the Display Network and YouTube. You can also apply bid adjustments to any placements you have targeted. In this case, group_placement_view is crucial for discovering new placements where your ads are showing, which you might then choose to add as managed placements or exclusions.

Detail placement view

  • What it shows: The detail_placement_view resource provides a more granular breakdown of placements, offering details beyond the domain or channel level. For example, it can show specific URLs or YouTube video IDs where your ads appeared.
  • UI Equivalent: Equivalent to selecting rows in Content > Where ads showed, then clicking View details.
  • Query Builder: Explore in Query Builder
  • Important Considerations: Similar to the group_placement_view resource, this view omits low-activity placements that don't meet minimum activity thresholds (see the "Total: Other" row section).

Example query

To limit result volume, the following query fetches URL-level and video-level placement metrics over a 7-day window. For large accounts, filter further by the campaign.id or ad_group.id field:

SELECT
  campaign.id,
  ad_group.id,
  detail_placement_view.display_name,
  detail_placement_view.target_url,
  detail_placement_view.group_placement_target_url,
  detail_placement_view.placement_type,
  metrics.impressions,
  metrics.clicks,
  metrics.cost_micros
FROM detail_placement_view
WHERE segments.date DURING LAST_7_DAYS

To exclude rows where placement metadata is unavailable, add AND detail_placement_view.target_url IS NOT NULL (see Rows with unavailable placement details). When you don't need returned resource_name fields, append the PARAMETERS omit_unselected_resource_names = true clause.

Metric differences between placement views

The minimum activity threshold is evaluated independently at each level of granularity:

  • The group_placement_view resource evaluates the threshold across the aggregated domain, mobile app, or YouTube channel.
  • The detail_placement_view resource evaluates the threshold separately for each individual page URL or YouTube video.

The detail_placement_view resource omits individual page URLs or YouTube videos that don't meet the threshold. As a result, summing detail_placement_view rows for a domain or YouTube channel (filtered by the detail_placement_view.group_placement_target_url field) can return fewer impressions than the corresponding group_placement_view row.

Rows with unavailable placement details

A query against the group_placement_view or detail_placement_view resource can return multiple rows in the same ad group with unset placement, display_name, and target_url fields and an identical resource_name value (for example, ending in ~MTRf).

This behavior occurs for the following reasons:

  • Internal placement grouping: Both views group performance metrics by a unique internal placement identifier rather than by the resource_name or placement string fields.
  • Unavailable placement metadata: In the Google Ads UI, placements without metadata in backend lookup tables appear as Unknown, Channel no longer available, or Video no longer available. In the API, each distinct placement identifier still returns a metrics row, with the placement, display_name, and target_url fields unset.
  • Synthesized resource names: The {base64_placement} suffix in the resource_name field is Base64-encoded from {type_id}_{placement}, where {type_id} is an internal placement type identifier rather than the PlacementType enum number. When the placement_type field is WEBSITE (internal ID 14) and the placement field is unset, the string "14_" encodes to MTRf (similarly, MOBILE_APPLICATION encodes "55_" to NTVf, YOUTUBE_VIDEO encodes "89_" to ODlf, and YOUTUBE_CHANNEL encodes "90_" to OTBf). Multiple placements of the same type with unavailable metadata in the same ad group therefore share the same resource_name value while reporting separate metrics rows.

When processing group_placement_view or detail_placement_view results in client code, don't deduplicate rows solely by the resource_name field, because doing so can overwrite metrics across distinct placements with unavailable metadata. To exclude rows with unavailable metadata in GAQL, filter on the target_url or display_name field, because the placement and resource_name fields aren't filterable. For example, use WHERE group_placement_view.target_url IS NOT NULL or WHERE detail_placement_view.target_url IS NOT NULL.

Performance Max placement view

  • What it shows: The performance_max_placement_view resource provides impression data (metrics.impressions) for placements where Performance Max ads served. In v24 and later, you can segment performance_max_placement_view by segments.ad_network_type (not supported in v23).
  • UI Equivalent: Insights and reports > Report editor > Performance Max campaigns placement
  • Query Builder: Explore in Query Builder

Example query

The following query fetches placement impressions segmented by ad network type for Performance Max campaigns over the last 30 days:

SELECT
  campaign.id,
  performance_max_placement_view.display_name,
  performance_max_placement_view.target_url,
  performance_max_placement_view.placement_type,
  segments.ad_network_type,
  metrics.impressions
FROM performance_max_placement_view
WHERE segments.date DURING LAST_30_DAYS

Choose a placement view

  • Use managed_placement_view to assess the performance of placements you are actively targeting and bidding on.
  • Use group_placement_view to understand the full scope of where your ads are appearing, especially when using the "Observation" setting, to discover new targeting opportunities or exclusions.
  • Use detail_placement_view to get the most granular details about specific URLs or videos where your ads showed, often used after identifying a domain or channel of interest in the group_placement_view.
  • Use performance_max_placement_view to inspect placement impressions for Performance Max campaigns.