GAQL has dozens of resources. For the work in this course, a dozen is plenty. This lesson is the map: which table answers each question, with the fields that matter and the trap in each one.
Structure and basic performance
| Resource | Answers | Key fields | Trap |
|---|---|---|---|
campaign |
Performance and settings per campaign | campaign.id, name, status, advertising_channel_type, bidding_strategy_type, campaign_budget.amount_micros, metrics.*, metrics.search_*_impression_share |
IS metrics only on Search/Shopping; PMax with limitations |
ad_group |
The same, per ad group | ad_group.id, campaign.id, ad_group.status, metrics.* |
— |
campaign_budget |
Budgets (shared ones included) | campaign_budget.amount_micros, explicitly_shared, reference_count |
Shared budgets appear once and apply to several campaigns |
bidding_strategy |
Portfolios | bidding_strategy.id, type, target_cpa.target_cpa_micros, target_roas.target_roas, campaign_count |
Campaign-level (non-portfolio) strategies live in campaign.* |
Keywords and quality
| Resource | Answers | Key fields | Trap |
|---|---|---|---|
keyword_view |
Keywords with performance and Quality Score | ad_group_criterion.keyword.text, match_type, ad_group_criterion.quality_info.quality_score, creative_quality_score, post_click_quality_score, search_predicted_ctr, metrics.* |
QS has no history: store it yourself every day |
search_term_view |
Search terms with their keyword | search_term_view.search_term, status, segments.keyword.info.text, segments.keyword.info.match_type, segments.search_term_match_type, metrics.* |
Privacy threshold: low-volume terms do not appear; PMax has its own report |
campaign_search_term_insight (PMax) |
PMax search term categories | campaign_search_term_insight.category_label, metrics.* |
Aggregated by category; no term-by-term view of the long tail |
Ads and assets
| Resource | Answers | Key fields | Trap |
|---|---|---|---|
ad_group_ad |
Ads with their Ad strength | ad_group_ad.ad.id, ad.responsive_search_ad.headlines, descriptions, ad_group_ad.ad_strength, status, metrics.* |
Headlines come back as a list of texts; per-asset performance labels are not here |
ad_group_ad_asset_view |
RSA assets with their label | asset.text_asset.text, ad_group_ad_asset_view.field_type, performance_label, pinned_field, metrics.impressions |
Impressions only per asset; the labels need volume |
asset_group / asset_group_asset (PMax) |
Asset groups and their assets | asset_group.name, ad_strength, asset_group_asset.performance_label |
No performance by channel |
Shopping and the feed
| Resource | Answers | Key fields | Trap |
|---|---|---|---|
shopping_performance_view |
Performance per product | segments.product_item_id, product_title, product_brand, product_type_l1..l5, product_custom_attribute0..4, metrics.* |
Every product segment multiplies the rows; ask only for the ones you use |
product_group_view |
Product groups in standard Shopping | ad_group_criterion.listing_group.*, metrics.* |
A tree: the "everything else" branch shows up too |
Placements (Display, video, PMax)
| Resource | Answers | Key fields | Trap |
|---|---|---|---|
detail_placement_view |
Domains, apps and channels where the ad ran | detail_placement_view.display_name, placement, placement_type, group_placement_target_url, metrics.* |
Display and video; PMax appears with limitations and trimmed metrics |
group_placement_view |
Grouped placements (domain) | group_placement_view.display_name, target_url, metrics.* |
Aggregated by domain |
performance_max_placement_view |
PMax placements | placement, display_name, placement_type, metrics.impressions |
Impressions only: no cost and no clicks per placement |
Measurement and changes
| Resource | Answers | Key fields | Trap |
|---|---|---|---|
conversion_action |
Conversion actions and their settings | conversion_action.name, status, type, category, primary_for_goal, counting_type, click_through_lookback_window_days |
For auditing measurement from a script |
campaign + segments.conversion_action_name |
Conversions by action and campaign | segments.conversion_action_name, metrics.all_conversions, all_conversions_value |
The rule: the segment in the SELECT, and in the WHERE if you filter |
change_event |
Change history (who, what, when) | change_event.change_date_time, user_email, client_type, change_resource_type, changed_fields, old_resource, new_resource |
Last 30 days; a row limit per query |
customer |
Account data | customer.id, descriptive_name, currency_code, time_zone |
The currency: read it at the start (module 4) |
How to use the map
For every question in this course there is a row here. "Which search
terms convert and are not keywords?" → search_term_view with
status != 'ADDED' and conversions > 0. "Which RSA assets are rated Low
with volume?" → ad_group_ad_asset_view with performance_label = 'LOW' and impressions > N. "Which new domains showed up yesterday in
Display/PMax?" → detail_placement_view and
performance_max_placement_view for yesterday, against the census. "Who
changed the budget?" → change_event.
💡 Ninja trick: every script in the Suite lives in two or three of these tables: QS Analyzer in
keyword_view(storing QS and its components every day to build the history Google does not give you), SQONS insearch_term_view, RSA Optimizer inad_group_ad_asset_view, Shopping Ninja inshopping_performance_view, Ninja Shield in the placement views (PMax included, with its impressions-only limit — which is why it scores the domain rather than its spend), and the Agent inconversion_action,change_eventandcustomer.
What you should remember
- Twelve tables cover this course: campaign/ad_group/budget/strategy, keyword_view (QS), search_term_view, ad_group_ad_asset_view (assets), shopping_performance_view (product), the placement views (PMax impressions only), conversion_action, change_event, customer (currency).
- Each with its own trap: the privacy threshold, no history, segments that multiply rows, PMax limits.
- For every question in this course there is a table; the script queries it every night and stores what Google does not store.