Google Ads Query Language (GAQL) Reference
Complete reference for GAQL syntax, resource types, fields, operators, date macros, and common query patterns for Google Ads reporting and optimization.
Full docs: https://cogny.com/docs/gaql-reference
Usage
/gaql-reference # Show full syntax overview
/gaql-reference search terms # Search terms report pattern
/gaql-reference quality score # Quality Score analysis query
/gaql-reference impression share # Budget & impression share query
/gaql-reference geographic # Geographic performance query
/gaql-reference change history # Change history audit query
Instructions
You are a Google Ads Query Language (GAQL) expert. Use this reference to help users write correct GAQL queries, understand resource types, choose the right fields, and avoid common pitfalls.
When the user asks a question, find the relevant section below and provide precise, actionable answers with ready-to-use GAQL examples.
If the user provides a specific topic as an argument, focus on that area. Otherwise, provide an overview of the GAQL syntax and available resources.
When the user has Cogny MCP tools available, prefer using mcp__cogny__google_ads__tool_execute_gaql to run queries directly and mcp__cogny__google_ads__tool_get_gaql_doc or mcp__cogny__google_ads__tool_get_reporting_view_doc for API documentation lookups.
Syntax
Formal Grammar
query = SELECT field_list FROM resource_name
[ WHERE condition_list ]
[ ORDER BY field_name [ ASC | DESC ] ]
[ LIMIT positive_integer ]
[ PARAMETERS param_list ]
field_list = field_name { , field_name }
condition_list = condition { AND condition }
condition = field_name operator value
param_list = param_name = param_value { , param_name = param_value }
Clauses
| Clause |
Required |
Description |
SELECT |
Yes |
Fields to return (resource fields, metrics, segments) |
FROM |
Yes |
Single resource type to query |
WHERE |
No |
Filter conditions joined by AND (no OR support) |
ORDER BY |
No |
Sort by one field, ASC or DESC |
LIMIT |
No |
Maximum number of rows to return |
PARAMETERS |
No |
Query-level parameters (e.g., include_drafts = true) |
Example
SELECT
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.cost_micros
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
LIMIT 50
Resource Types (FROM Clause)
Campaign Management
| Resource |
Description |
campaign |
Campaign settings, status, bidding, budget |
campaign_budget |
Shared and campaign-level budgets |
campaign_criterion |
Campaign-level targeting criteria |
campaign_bid_modifier |
Bid adjustments at campaign level |
bidding_strategy |
Portfolio bidding strategies |
Ad Groups & Ads
| Resource |
Description |
ad_group |
Ad group settings, status, targeting |
ad_group_ad |
Ads within ad groups (RSA, ETA, etc.) |
ad_group_ad_asset_view |
Asset-level performance for responsive ads |
ad_group_criterion |
Keywords, audiences, and other criteria |
ad_group_bid_modifier |
Bid adjustments at ad group level |
Performance Views
| Resource |
Description |
keyword_view |
Keyword-level performance metrics |
search_term_view |
Actual search queries that triggered ads |
landing_page_view |
Landing page performance |
geographic_view |
Performance by geographic location |
location_view |
Performance by targeted/excluded location |
age_range_view |
Performance by age range demographic |
gender_view |
Performance by gender demographic |
user_location_view |
Performance by user's physical location |
display_keyword_view |
Display network keyword performance |
topic_view |
Display/video topic targeting performance |
managed_placement_view |
Managed placement performance |
Conversion & Attribution
| Resource |
Description |
conversion_action |
Conversion action configuration |
customer_conversion_goal |
Conversion goals and optimization settings |
Account & Extensions
| Resource |
Description |
customer |
Account-level settings |
asset |
Account assets (sitelinks, callouts, images) |
asset_group |
Performance Max asset groups |
asset_group_asset |
Assets within asset groups |
Change History
| Resource |
Description |
change_status |
Recent changes to account entities |
change_event |
Detailed change history with old/new values |
Common Fields
Campaign Fields
| Field |
Type |
Description |
campaign.id |
INT64 |
Unique campaign ID |
campaign.name |
STRING |
Campaign name |
campaign.status |
ENUM |
ENABLED, PAUSED, REMOVED |
campaign.advertising_channel_type |
ENUM |
SEARCH, DISPLAY, SHOPPING, VIDEO, PERFORMANCE_MAX |
campaign.bidding_strategy_type |
ENUM |
TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSIONS, MANUAL_CPC, etc. |
campaign.campaign_budget |
RESOURCE |
Budget resource name |
campaign.start_date |
DATE |
Campaign start date |
campaign.end_date |
DATE |
Campaign end date |
campaign.serving_status |
ENUM |
SERVING, NONE, ENDED, PENDING, SUSPENDED |
campaign.target_cpa.target_cpa_micros |
INT64 |
Target CPA in micros |
campaign.target_roas.target_roas |
DOUBLE |
Target ROAS as a ratio |
Ad Group Fields
| Field |
Type |
Description |
ad_group.id |
INT64 |
Unique ad group ID |
ad_group.name |
STRING |
Ad group name |
ad_group.status |
ENUM |
ENABLED, PAUSED, REMOVED |
ad_group.type |
ENUM |
SEARCH_STANDARD, DISPLAY_STANDARD, SHOPPING_PRODUCT_ADS, etc. |
ad_group.cpc_bid_micros |
INT64 |
Default CPC bid in micros |
ad_group.target_cpa_micros |
INT64 |
Ad group-level target CPA |
Ad Fields
| Field |
Type |
Description |
ad_group_ad.ad.id |
INT64 |
Unique ad ID |
ad_group_ad.ad.type |
ENUM |
RESPONSIVE_SEARCH_AD, EXPANDED_TEXT_AD, etc. |
ad_group_ad.ad.final_urls |
STRING (repeated) |
Landing page URLs |
ad_group_ad.status |
ENUM |
ENABLED, PAUSED, REMOVED |
ad_group_ad.ad.responsive_search_ad.headlines |
MESSAGE (repeated) |
RSA headline assets |
ad_group_ad.ad.responsive_search_ad.descriptions |
MESSAGE (repeated) |
RSA description assets |
ad_group_ad.policy_summary.approval_status |
ENUM |
APPROVED, DISAPPROVED, etc. |
Keyword & Criterion Fields
| Field |
Type |
Description |
ad_group_criterion.criterion_id |
INT64 |
Criterion ID |
ad_group_criterion.keyword.text |
STRING |
Keyword text |
ad_group_criterion.keyword.match_type |
ENUM |
BROAD, PHRASE, EXACT |
ad_group_criterion.status |
ENUM |
ENABLED, PAUSED, REMOVED |
ad_group_criterion.quality_info.quality_score |
INT32 |
Quality Score (1-10) |
ad_group_criterion.quality_info.creative_quality_score |
ENUM |
BELOW_AVERAGE, AVERAGE, ABOVE_AVERAGE |
ad_group_criterion.quality_info.post_click_quality_score |
ENUM |
Landing page experience |
ad_group_criterion.quality_info.search_predicted_ctr |
ENUM |
Expected CTR |
ad_group_criterion.effective_cpc_bid_micros |
INT64 |
Effective CPC bid |
ad_group_criterion.position_estimates.first_page_cpc_micros |
INT64 |
Estimated first page CPC |
Search Term Fields
| Field |
Type |
Description |
search_term_view.search_term |
STRING |
Actual user search query |
search_term_view.status |
ENUM |
ADDED, EXCLUDED, ADDED_EXCLUDED, NONE |
Metrics
| Field |
Type |
Description |
metrics.impressions |
INT64 |
Number of impressions |
metrics.clicks |
INT64 |
Number of clicks |
metrics.cost_micros |
INT64 |
Cost in micros (divide by 1,000,000) |
metrics.ctr |
DOUBLE |
Click-through rate |
metrics.average_cpc |
DOUBLE |
Average CPC in micros |
metrics.average_cpm |
DOUBLE |
Average CPM in micros |
metrics.conversions |
DOUBLE |
Conversions |
metrics.conversions_value |
DOUBLE |
Total conversion value |
metrics.cost_per_conversion |
DOUBLE |
Cost per conversion in micros |
metrics.all_conversions |
DOUBLE |
All conversions (including cross-device) |
metrics.all_conversions_value |
DOUBLE |
All conversions value |
metrics.view_through_conversions |
INT64 |
View-through conversions |
metrics.search_impression_share |
DOUBLE |
Search impression share (0.0-1.0) |
metrics.search_top_impression_share |
DOUBLE |
Top impression share |
metrics.search_absolute_top_impression_share |
DOUBLE |
Absolute top impression share |
metrics.search_budget_lost_impression_share |
DOUBLE |
IS lost to budget |
metrics.search_rank_lost_impression_share |
DOUBLE |
IS lost to rank |
metrics.interaction_rate |
DOUBLE |
Interaction rate |
metrics.interactions |
INT64 |
Interactions |
metrics.video_views |
INT64 |
Video views |
metrics.video_view_rate |
DOUBLE |
Video view rate |
metrics.invalid_clicks |
INT64 |
Invalid clicks filtered by Google |
Segments
| Field |
Type |
Description |
segments.date |
DATE |
Date (YYYY-MM-DD) |
segments.day_of_week |
ENUM |
MONDAY through SUNDAY |
segments.month |
DATE |
First day of the month |
segments.quarter |
DATE |
First day of the quarter |
segments.year |
INT32 |
Year |
segments.hour |
INT32 |
Hour of day (0-23) |
segments.device |
ENUM |
DESKTOP, MOBILE, TABLET, OTHER |
segments.ad_network_type |
ENUM |
SEARCH, SEARCH_PARTNERS, CONTENT, YOUTUBE_SEARCH, YOUTUBE_WATCH |
segments.slot |
ENUM |
TOP, OTHER |
segments.conversion_action |
RESOURCE |
Conversion action resource name |
segments.conversion_action_name |
STRING |
Conversion action name |
segments.conversion_action_category |
ENUM |
Conversion action category |
segments.click_type |
ENUM |
URL_CLICKS, CALLS, SITELINKS, etc. |
segments.keyword.info.text |
STRING |
Keyword text (in search_term_view) |
segments.keyword.info.match_type |
ENUM |
Keyword match type |
WHERE Clause Operators
Comparison Operators
| Operator |
Example |
= |
campaign.status = 'ENABLED' |
!= |
campaign.status != 'REMOVED' |
> |
metrics.impressions > 100 |
< |
metrics.ctr < 0.02 |
>= |
metrics.clicks >= 10 |
<= |
metrics.cost_micros <= 5000000 |
Set Operators
| Operator |
Example |
IN |
campaign.status IN ('ENABLED', 'PAUSED') |
NOT IN |
campaign.advertising_channel_type NOT IN ('VIDEO', 'DISPLAY') |
CONTAINS ANY |
campaign.labels CONTAINS ANY ('customers/123/labels/456') |
CONTAINS ALL |
campaign.labels CONTAINS ALL ('..label1..', '..label2..') |
CONTAINS NONE |
campaign.labels CONTAINS NONE ('customers/123/labels/456') |
String Operators
| Operator |
Example |
LIKE |
campaign.name LIKE '%Brand%' |
NOT LIKE |
campaign.name NOT LIKE '%Test%' |
Null Checks
| Operator |
Example |
IS NULL |
ad_group_criterion.quality_info.quality_score IS NULL |
IS NOT NULL |
ad_group_criterion.quality_info.quality_score IS NOT NULL |
Range Operators
| Operator |
Example |
BETWEEN |
segments.date BETWEEN '2025-01-01' AND '2025-01-31' |
DURING |
segments.date DURING LAST_30_DAYS |
Date Macros (DURING)
| Macro |
Description |
TODAY |
Today only |
YESTERDAY |
Yesterday only |
LAST_7_DAYS |
Last 7 days (not including today) |
LAST_14_DAYS |
Last 14 days |
LAST_30_DAYS |
Last 30 days |
LAST_BUSINESS_WEEK |
Monday-Friday of previous week |
THIS_WEEK_MON_TODAY |
Monday of this week through today |
THIS_WEEK_SUN_TODAY |
Sunday of this week through today |
THIS_MONTH |
First day of this month through today |
LAST_MONTH |
Entire previous month |
Common Query Patterns
Campaign Performance Report
SELECT
campaign.id,
campaign.name,
campaign.status,
campaign.advertising_channel_type,
campaign.bidding_strategy_type,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value,
metrics.cost_per_conversion
FROM campaign
WHERE campaign.status != 'REMOVED'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC
Search Terms Report (Negative Keyword Identification)
SELECT
search_term_view.search_term,
search_term_view.status,
segments.keyword.info.text,
segments.keyword.info.match_type,
campaign.name,
ad_group.name,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion
FROM search_term_view
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.impressions > 10
ORDER BY metrics.cost_micros DESC
LIMIT 1000
Filter for high-cost, zero-conversion terms to build negative keyword lists.
Quality Score Analysis
SELECT
campaign.name,
ad_group.name,
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.quality_info.quality_score,
ad_group_criterion.quality_info.creative_quality_score,
ad_group_criterion.quality_info.post_click_quality_score,
ad_group_criterion.quality_info.search_predicted_ctr,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group_criterion.status = 'ENABLED'
AND ad_group_criterion.quality_info.quality_score IS NOT NULL
AND segments.date DURING LAST_30_DAYS
ORDER BY ad_group_criterion.quality_info.quality_score ASC
Landing Page Performance
SELECT
landing_page_view.unexpanded_final_url,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion
FROM landing_page_view
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.clicks > 0
ORDER BY metrics.clicks DESC
LIMIT 100
Device Breakdown
SELECT
campaign.name,
segments.device,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.cost_per_conversion
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY campaign.name, segments.device
Geographic Performance
SELECT
geographic_view.country_criterion_id,
geographic_view.location_type,
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value,
metrics.cost_per_conversion
FROM geographic_view
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
LIMIT 200
Ad Copy Performance (RSA Asset-Level)
SELECT
campaign.name,
ad_group.name,
ad_group_ad.ad.id,
ad_group_ad.ad.responsive_search_ad.headlines,
ad_group_ad.ad.responsive_search_ad.descriptions,
ad_group_ad.ad.final_urls,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions
FROM ad_group_ad
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND ad_group_ad.status = 'ENABLED'
AND ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
Asset-level performance:
SELECT
campaign.name,
ad_group.name,
ad_group_ad_asset_view.field_type,
ad_group_ad_asset_view.performance_label,
asset.text_asset.text,
metrics.impressions,
metrics.clicks,
metrics.ctr,
metrics.cost_micros,
metrics.conversions
FROM ad_group_ad_asset_view
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY ad_group_ad_asset_view.performance_label DESC, metrics.impressions DESC
Budget Utilization / Impression Share
SELECT
campaign.name,
campaign.campaign_budget,
campaign_budget.amount_micros,
campaign.bidding_strategy_type,
metrics.impressions,
metrics.cost_micros,
metrics.search_impression_share,
metrics.search_top_impression_share,
metrics.search_absolute_top_impression_share,
metrics.search_budget_lost_impression_share,
metrics.search_rank_lost_impression_share
FROM campaign
WHERE campaign.status = 'ENABLED'
AND campaign.advertising_channel_type = 'SEARCH'
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.search_budget_lost_impression_share DESC
Conversion Action Breakdown
SELECT
campaign.name,
segments.conversion_action_name,
segments.conversion_action_category,
metrics.conversions,
metrics.conversions_value,
metrics.all_conversions,
metrics.all_conversions_value,
metrics.cost_per_conversion
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
AND metrics.conversions > 0
ORDER BY metrics.conversions DESC
Change History Audit
SELECT
change_event.change_date_time,
change_event.change_resource_type,
change_event.change_resource_name,
change_event.resource_change_operation,
change_event.changed_fields,
change_event.old_resource,
change_event.new_resource,
change_event.user_email
FROM change_event
WHERE change_event.change_date_time DURING LAST_14_DAYS
AND change_event.change_resource_type IN (
'CAMPAIGN', 'AD_GROUP', 'AD_GROUP_AD',
'AD_GROUP_CRITERION', 'CAMPAIGN_BUDGET'
)
ORDER BY change_event.change_date_time DESC
LIMIT 500
Gotchas and Important Notes
cost_micros Requires Division
All cost fields are in micros (1/1,000,000 of the currency unit):
Actual cost = metrics.cost_micros / 1,000,000
Actual CPC = metrics.average_cpc / 1,000,000
Example: cost_micros = 5430000 means $5.43.
Segment + Metric Compatibility
segments.conversion_action — impressions/clicks repeat across each conversion action row. Do not sum them.
segments.click_type — clicks and impressions fragment by click type. Summing overcounts.
segments.slot — only compatible with search campaigns.
segments.hour — cannot be combined with segments.date for some resources.
- Check the Google Ads API field compatibility matrix when in doubt.
Date Range Requirements
- Queries with
metrics.* fields require a date range (segments.date DURING ... or BETWEEN).
- Resource-only queries (no metrics) do not need a date range.
Enum Values
Enum fields must use string constant names:
- CampaignStatus:
ENABLED, PAUSED, REMOVED
- AdGroupStatus:
ENABLED, PAUSED, REMOVED
- AdvertisingChannelType:
SEARCH, DISPLAY, SHOPPING, VIDEO, PERFORMANCE_MAX, MULTI_CHANNEL, LOCAL, SMART, HOTEL, DISCOVERY
- KeywordMatchType:
BROAD, PHRASE, EXACT
- BiddingStrategyType:
TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, MANUAL_CPC, ENHANCED_CPC, TARGET_IMPRESSION_SHARE
- Device:
DESKTOP, MOBILE, TABLET, CONNECTED_TV, OTHER
- QualityScoreBucket:
BELOW_AVERAGE, AVERAGE, ABOVE_AVERAGE
Rate Limits
- Standard access: 15,000 requests/day, 1,600 operations/minute.
- Basic access: 10,000 requests/day.
- Use
SearchStream for large result sets (one operation regardless of size).
Other Pitfalls
- No
OR: All WHERE conditions are AND-joined. Use IN or separate queries.
- No joins: GAQL queries operate on a single resource.
- No
GROUP BY: Aggregation is implicit by selected fields + segments.
- No aliases: Cannot use
AS in GAQL.
- No arithmetic: Calculate
cost_micros / 1000000 client-side.
- Segment auto-grouping: Adding a segment splits rows by that dimension.
- Removed resources: Excluded by default. Filter explicitly to include them.
- PARAMETERS clause:
include_drafts = true for drafts, omit_unselected_resource_names = true to reduce response size.
Resources
1---2name: gaql-reference3description: Google Ads Query Language (GAQL) Reference — complete syntax, resource types, fields, operators, date macros, and ready-to-use query patterns4---56# Google Ads Query Language (GAQL) Reference78Complete reference for GAQL syntax, resource types, fields, operators, date macros, and common query patterns for Google Ads reporting and optimization.910Full docs: https://cogny.com/docs/gaql-reference1112## Usage1314```15/gaql-reference # Show full syntax overview16/gaql-reference search terms # Search terms report pattern17/gaql-reference quality score # Quality Score analysis query18/gaql-reference impression share # Budget & impression share query19/gaql-reference geographic # Geographic performance query20/gaql-reference change history # Change history audit query21```2223## Instructions2425You are a Google Ads Query Language (GAQL) expert. Use this reference to help users write correct GAQL queries, understand resource types, choose the right fields, and avoid common pitfalls.2627When the user asks a question, find the relevant section below and provide precise, actionable answers with ready-to-use GAQL examples.2829If the user provides a specific topic as an argument, focus on that area. Otherwise, provide an overview of the GAQL syntax and available resources.3031When the user has Cogny MCP tools available, prefer using `mcp__cogny__google_ads__tool_execute_gaql` to run queries directly and `mcp__cogny__google_ads__tool_get_gaql_doc` or `mcp__cogny__google_ads__tool_get_reporting_view_doc` for API documentation lookups.3233---3435## Syntax3637### Formal Grammar3839```40query = SELECT field_list FROM resource_name41 [ WHERE condition_list ]42 [ ORDER BY field_name [ ASC | DESC ] ]43 [ LIMIT positive_integer ]44 [ PARAMETERS param_list ]4546field_list = field_name { , field_name }47condition_list = condition { AND condition }48condition = field_name operator value49param_list = param_name = param_value { , param_name = param_value }50```5152### Clauses5354| Clause | Required | Description |55|--------|----------|-------------|56| `SELECT` | Yes | Fields to return (resource fields, metrics, segments) |57| `FROM` | Yes | Single resource type to query |58| `WHERE` | No | Filter conditions joined by `AND` (no `OR` support) |59| `ORDER BY` | No | Sort by one field, `ASC` or `DESC` |60| `LIMIT` | No | Maximum number of rows to return |61| `PARAMETERS` | No | Query-level parameters (e.g., `include_drafts = true`) |6263### Example6465```sql66SELECT67 campaign.name,68 metrics.impressions,69 metrics.clicks,70 metrics.cost_micros71FROM campaign72WHERE campaign.status = 'ENABLED'73 AND segments.date DURING LAST_30_DAYS74ORDER BY metrics.impressions DESC75LIMIT 5076```7778## Resource Types (FROM Clause)7980### Campaign Management8182| Resource | Description |83|----------|-------------|84| `campaign` | Campaign settings, status, bidding, budget |85| `campaign_budget` | Shared and campaign-level budgets |86| `campaign_criterion` | Campaign-level targeting criteria |87| `campaign_bid_modifier` | Bid adjustments at campaign level |88| `bidding_strategy` | Portfolio bidding strategies |8990### Ad Groups & Ads9192| Resource | Description |93|----------|-------------|94| `ad_group` | Ad group settings, status, targeting |95| `ad_group_ad` | Ads within ad groups (RSA, ETA, etc.) |96| `ad_group_ad_asset_view` | Asset-level performance for responsive ads |97| `ad_group_criterion` | Keywords, audiences, and other criteria |98| `ad_group_bid_modifier` | Bid adjustments at ad group level |99100### Performance Views101102| Resource | Description |103|----------|-------------|104| `keyword_view` | Keyword-level performance metrics |105| `search_term_view` | Actual search queries that triggered ads |106| `landing_page_view` | Landing page performance |107| `geographic_view` | Performance by geographic location |108| `location_view` | Performance by targeted/excluded location |109| `age_range_view` | Performance by age range demographic |110| `gender_view` | Performance by gender demographic |111| `user_location_view` | Performance by user's physical location |112| `display_keyword_view` | Display network keyword performance |113| `topic_view` | Display/video topic targeting performance |114| `managed_placement_view` | Managed placement performance |115116### Conversion & Attribution117118| Resource | Description |119|----------|-------------|120| `conversion_action` | Conversion action configuration |121| `customer_conversion_goal` | Conversion goals and optimization settings |122123### Account & Extensions124125| Resource | Description |126|----------|-------------|127| `customer` | Account-level settings |128| `asset` | Account assets (sitelinks, callouts, images) |129| `asset_group` | Performance Max asset groups |130| `asset_group_asset` | Assets within asset groups |131132### Change History133134| Resource | Description |135|----------|-------------|136| `change_status` | Recent changes to account entities |137| `change_event` | Detailed change history with old/new values |138139## Common Fields140141### Campaign Fields142143| Field | Type | Description |144|-------|------|-------------|145| `campaign.id` | INT64 | Unique campaign ID |146| `campaign.name` | STRING | Campaign name |147| `campaign.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |148| `campaign.advertising_channel_type` | ENUM | `SEARCH`, `DISPLAY`, `SHOPPING`, `VIDEO`, `PERFORMANCE_MAX` |149| `campaign.bidding_strategy_type` | ENUM | `TARGET_CPA`, `TARGET_ROAS`, `MAXIMIZE_CONVERSIONS`, `MANUAL_CPC`, etc. |150| `campaign.campaign_budget` | RESOURCE | Budget resource name |151| `campaign.start_date` | DATE | Campaign start date |152| `campaign.end_date` | DATE | Campaign end date |153| `campaign.serving_status` | ENUM | `SERVING`, `NONE`, `ENDED`, `PENDING`, `SUSPENDED` |154| `campaign.target_cpa.target_cpa_micros` | INT64 | Target CPA in micros |155| `campaign.target_roas.target_roas` | DOUBLE | Target ROAS as a ratio |156157### Ad Group Fields158159| Field | Type | Description |160|-------|------|-------------|161| `ad_group.id` | INT64 | Unique ad group ID |162| `ad_group.name` | STRING | Ad group name |163| `ad_group.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |164| `ad_group.type` | ENUM | `SEARCH_STANDARD`, `DISPLAY_STANDARD`, `SHOPPING_PRODUCT_ADS`, etc. |165| `ad_group.cpc_bid_micros` | INT64 | Default CPC bid in micros |166| `ad_group.target_cpa_micros` | INT64 | Ad group-level target CPA |167168### Ad Fields169170| Field | Type | Description |171|-------|------|-------------|172| `ad_group_ad.ad.id` | INT64 | Unique ad ID |173| `ad_group_ad.ad.type` | ENUM | `RESPONSIVE_SEARCH_AD`, `EXPANDED_TEXT_AD`, etc. |174| `ad_group_ad.ad.final_urls` | STRING (repeated) | Landing page URLs |175| `ad_group_ad.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |176| `ad_group_ad.ad.responsive_search_ad.headlines` | MESSAGE (repeated) | RSA headline assets |177| `ad_group_ad.ad.responsive_search_ad.descriptions` | MESSAGE (repeated) | RSA description assets |178| `ad_group_ad.policy_summary.approval_status` | ENUM | `APPROVED`, `DISAPPROVED`, etc. |179180### Keyword & Criterion Fields181182| Field | Type | Description |183|-------|------|-------------|184| `ad_group_criterion.criterion_id` | INT64 | Criterion ID |185| `ad_group_criterion.keyword.text` | STRING | Keyword text |186| `ad_group_criterion.keyword.match_type` | ENUM | `BROAD`, `PHRASE`, `EXACT` |187| `ad_group_criterion.status` | ENUM | `ENABLED`, `PAUSED`, `REMOVED` |188| `ad_group_criterion.quality_info.quality_score` | INT32 | Quality Score (1-10) |189| `ad_group_criterion.quality_info.creative_quality_score` | ENUM | `BELOW_AVERAGE`, `AVERAGE`, `ABOVE_AVERAGE` |190| `ad_group_criterion.quality_info.post_click_quality_score` | ENUM | Landing page experience |191| `ad_group_criterion.quality_info.search_predicted_ctr` | ENUM | Expected CTR |192| `ad_group_criterion.effective_cpc_bid_micros` | INT64 | Effective CPC bid |193| `ad_group_criterion.position_estimates.first_page_cpc_micros` | INT64 | Estimated first page CPC |194195### Search Term Fields196197| Field | Type | Description |198|-------|------|-------------|199| `search_term_view.search_term` | STRING | Actual user search query |200| `search_term_view.status` | ENUM | `ADDED`, `EXCLUDED`, `ADDED_EXCLUDED`, `NONE` |201202### Metrics203204| Field | Type | Description |205|-------|------|-------------|206| `metrics.impressions` | INT64 | Number of impressions |207| `metrics.clicks` | INT64 | Number of clicks |208| `metrics.cost_micros` | INT64 | Cost in micros (divide by 1,000,000) |209| `metrics.ctr` | DOUBLE | Click-through rate |210| `metrics.average_cpc` | DOUBLE | Average CPC in micros |211| `metrics.average_cpm` | DOUBLE | Average CPM in micros |212| `metrics.conversions` | DOUBLE | Conversions |213| `metrics.conversions_value` | DOUBLE | Total conversion value |214| `metrics.cost_per_conversion` | DOUBLE | Cost per conversion in micros |215| `metrics.all_conversions` | DOUBLE | All conversions (including cross-device) |216| `metrics.all_conversions_value` | DOUBLE | All conversions value |217| `metrics.view_through_conversions` | INT64 | View-through conversions |218| `metrics.search_impression_share` | DOUBLE | Search impression share (0.0-1.0) |219| `metrics.search_top_impression_share` | DOUBLE | Top impression share |220| `metrics.search_absolute_top_impression_share` | DOUBLE | Absolute top impression share |221| `metrics.search_budget_lost_impression_share` | DOUBLE | IS lost to budget |222| `metrics.search_rank_lost_impression_share` | DOUBLE | IS lost to rank |223| `metrics.interaction_rate` | DOUBLE | Interaction rate |224| `metrics.interactions` | INT64 | Interactions |225| `metrics.video_views` | INT64 | Video views |226| `metrics.video_view_rate` | DOUBLE | Video view rate |227| `metrics.invalid_clicks` | INT64 | Invalid clicks filtered by Google |228229### Segments230231| Field | Type | Description |232|-------|------|-------------|233| `segments.date` | DATE | Date (YYYY-MM-DD) |234| `segments.day_of_week` | ENUM | `MONDAY` through `SUNDAY` |235| `segments.month` | DATE | First day of the month |236| `segments.quarter` | DATE | First day of the quarter |237| `segments.year` | INT32 | Year |238| `segments.hour` | INT32 | Hour of day (0-23) |239| `segments.device` | ENUM | `DESKTOP`, `MOBILE`, `TABLET`, `OTHER` |240| `segments.ad_network_type` | ENUM | `SEARCH`, `SEARCH_PARTNERS`, `CONTENT`, `YOUTUBE_SEARCH`, `YOUTUBE_WATCH` |241| `segments.slot` | ENUM | `TOP`, `OTHER` |242| `segments.conversion_action` | RESOURCE | Conversion action resource name |243| `segments.conversion_action_name` | STRING | Conversion action name |244| `segments.conversion_action_category` | ENUM | Conversion action category |245| `segments.click_type` | ENUM | `URL_CLICKS`, `CALLS`, `SITELINKS`, etc. |246| `segments.keyword.info.text` | STRING | Keyword text (in search_term_view) |247| `segments.keyword.info.match_type` | ENUM | Keyword match type |248249## WHERE Clause Operators250251### Comparison Operators252253| Operator | Example |254|----------|---------|255| `=` | `campaign.status = 'ENABLED'` |256| `!=` | `campaign.status != 'REMOVED'` |257| `>` | `metrics.impressions > 100` |258| `<` | `metrics.ctr < 0.02` |259| `>=` | `metrics.clicks >= 10` |260| `<=` | `metrics.cost_micros <= 5000000` |261262### Set Operators263264| Operator | Example |265|----------|---------|266| `IN` | `campaign.status IN ('ENABLED', 'PAUSED')` |267| `NOT IN` | `campaign.advertising_channel_type NOT IN ('VIDEO', 'DISPLAY')` |268| `CONTAINS ANY` | `campaign.labels CONTAINS ANY ('customers/123/labels/456')` |269| `CONTAINS ALL` | `campaign.labels CONTAINS ALL ('..label1..', '..label2..')` |270| `CONTAINS NONE` | `campaign.labels CONTAINS NONE ('customers/123/labels/456')` |271272### String Operators273274| Operator | Example |275|----------|---------|276| `LIKE` | `campaign.name LIKE '%Brand%'` |277| `NOT LIKE` | `campaign.name NOT LIKE '%Test%'` |278279### Null Checks280281| Operator | Example |282|----------|---------|283| `IS NULL` | `ad_group_criterion.quality_info.quality_score IS NULL` |284| `IS NOT NULL` | `ad_group_criterion.quality_info.quality_score IS NOT NULL` |285286### Range Operators287288| Operator | Example |289|----------|---------|290| `BETWEEN` | `segments.date BETWEEN '2025-01-01' AND '2025-01-31'` |291| `DURING` | `segments.date DURING LAST_30_DAYS` |292293### Date Macros (DURING)294295| Macro | Description |296|-------|-------------|297| `TODAY` | Today only |298| `YESTERDAY` | Yesterday only |299| `LAST_7_DAYS` | Last 7 days (not including today) |300| `LAST_14_DAYS` | Last 14 days |301| `LAST_30_DAYS` | Last 30 days |302| `LAST_BUSINESS_WEEK` | Monday-Friday of previous week |303| `THIS_WEEK_MON_TODAY` | Monday of this week through today |304| `THIS_WEEK_SUN_TODAY` | Sunday of this week through today |305| `THIS_MONTH` | First day of this month through today |306| `LAST_MONTH` | Entire previous month |307308## Common Query Patterns309310### Campaign Performance Report311312```sql313SELECT314 campaign.id,315 campaign.name,316 campaign.status,317 campaign.advertising_channel_type,318 campaign.bidding_strategy_type,319 metrics.impressions,320 metrics.clicks,321 metrics.ctr,322 metrics.cost_micros,323 metrics.conversions,324 metrics.conversions_value,325 metrics.cost_per_conversion326FROM campaign327WHERE campaign.status != 'REMOVED'328 AND segments.date DURING LAST_30_DAYS329ORDER BY metrics.cost_micros DESC330```331332### Search Terms Report (Negative Keyword Identification)333334```sql335SELECT336 search_term_view.search_term,337 search_term_view.status,338 segments.keyword.info.text,339 segments.keyword.info.match_type,340 campaign.name,341 ad_group.name,342 metrics.impressions,343 metrics.clicks,344 metrics.ctr,345 metrics.cost_micros,346 metrics.conversions,347 metrics.cost_per_conversion348FROM search_term_view349WHERE campaign.status = 'ENABLED'350 AND segments.date DURING LAST_30_DAYS351 AND metrics.impressions > 10352ORDER BY metrics.cost_micros DESC353LIMIT 1000354```355356Filter for high-cost, zero-conversion terms to build negative keyword lists.357358### Quality Score Analysis359360```sql361SELECT362 campaign.name,363 ad_group.name,364 ad_group_criterion.keyword.text,365 ad_group_criterion.keyword.match_type,366 ad_group_criterion.quality_info.quality_score,367 ad_group_criterion.quality_info.creative_quality_score,368 ad_group_criterion.quality_info.post_click_quality_score,369 ad_group_criterion.quality_info.search_predicted_ctr,370 metrics.impressions,371 metrics.clicks,372 metrics.cost_micros,373 metrics.conversions374FROM keyword_view375WHERE campaign.status = 'ENABLED'376 AND ad_group.status = 'ENABLED'377 AND ad_group_criterion.status = 'ENABLED'378 AND ad_group_criterion.quality_info.quality_score IS NOT NULL379 AND segments.date DURING LAST_30_DAYS380ORDER BY ad_group_criterion.quality_info.quality_score ASC381```382383### Landing Page Performance384385```sql386SELECT387 landing_page_view.unexpanded_final_url,388 metrics.impressions,389 metrics.clicks,390 metrics.ctr,391 metrics.cost_micros,392 metrics.conversions,393 metrics.cost_per_conversion394FROM landing_page_view395WHERE campaign.status = 'ENABLED'396 AND segments.date DURING LAST_30_DAYS397 AND metrics.clicks > 0398ORDER BY metrics.clicks DESC399LIMIT 100400```401402### Device Breakdown403404```sql405SELECT406 campaign.name,407 segments.device,408 metrics.impressions,409 metrics.clicks,410 metrics.ctr,411 metrics.cost_micros,412 metrics.conversions,413 metrics.cost_per_conversion414FROM campaign415WHERE campaign.status = 'ENABLED'416 AND segments.date DURING LAST_30_DAYS417ORDER BY campaign.name, segments.device418```419420### Geographic Performance421422```sql423SELECT424 geographic_view.country_criterion_id,425 geographic_view.location_type,426 campaign.name,427 metrics.impressions,428 metrics.clicks,429 metrics.ctr,430 metrics.cost_micros,431 metrics.conversions,432 metrics.conversions_value,433 metrics.cost_per_conversion434FROM geographic_view435WHERE campaign.status = 'ENABLED'436 AND segments.date DURING LAST_30_DAYS437 AND metrics.impressions > 0438ORDER BY metrics.cost_micros DESC439LIMIT 200440```441442### Ad Copy Performance (RSA Asset-Level)443444```sql445SELECT446 campaign.name,447 ad_group.name,448 ad_group_ad.ad.id,449 ad_group_ad.ad.responsive_search_ad.headlines,450 ad_group_ad.ad.responsive_search_ad.descriptions,451 ad_group_ad.ad.final_urls,452 metrics.impressions,453 metrics.clicks,454 metrics.ctr,455 metrics.cost_micros,456 metrics.conversions457FROM ad_group_ad458WHERE campaign.status = 'ENABLED'459 AND ad_group.status = 'ENABLED'460 AND ad_group_ad.status = 'ENABLED'461 AND ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD'462 AND segments.date DURING LAST_30_DAYS463ORDER BY metrics.impressions DESC464```465466Asset-level performance:467468```sql469SELECT470 campaign.name,471 ad_group.name,472 ad_group_ad_asset_view.field_type,473 ad_group_ad_asset_view.performance_label,474 asset.text_asset.text,475 metrics.impressions,476 metrics.clicks,477 metrics.ctr,478 metrics.cost_micros,479 metrics.conversions480FROM ad_group_ad_asset_view481WHERE campaign.status = 'ENABLED'482 AND ad_group.status = 'ENABLED'483 AND segments.date DURING LAST_30_DAYS484ORDER BY ad_group_ad_asset_view.performance_label DESC, metrics.impressions DESC485```486487### Budget Utilization / Impression Share488489```sql490SELECT491 campaign.name,492 campaign.campaign_budget,493 campaign_budget.amount_micros,494 campaign.bidding_strategy_type,495 metrics.impressions,496 metrics.cost_micros,497 metrics.search_impression_share,498 metrics.search_top_impression_share,499 metrics.search_absolute_top_impression_share,500 metrics.search_budget_lost_impression_share,501 metrics.search_rank_lost_impression_share502FROM campaign503WHERE campaign.status = 'ENABLED'504 AND campaign.advertising_channel_type = 'SEARCH'505 AND segments.date DURING LAST_30_DAYS506ORDER BY metrics.search_budget_lost_impression_share DESC507```508509### Conversion Action Breakdown510511```sql512SELECT513 campaign.name,514 segments.conversion_action_name,515 segments.conversion_action_category,516 metrics.conversions,517 metrics.conversions_value,518 metrics.all_conversions,519 metrics.all_conversions_value,520 metrics.cost_per_conversion521FROM campaign522WHERE campaign.status = 'ENABLED'523 AND segments.date DURING LAST_30_DAYS524 AND metrics.conversions > 0525ORDER BY metrics.conversions DESC526```527528### Change History Audit529530```sql531SELECT532 change_event.change_date_time,533 change_event.change_resource_type,534 change_event.change_resource_name,535 change_event.resource_change_operation,536 change_event.changed_fields,537 change_event.old_resource,538 change_event.new_resource,539 change_event.user_email540FROM change_event541WHERE change_event.change_date_time DURING LAST_14_DAYS542 AND change_event.change_resource_type IN (543 'CAMPAIGN', 'AD_GROUP', 'AD_GROUP_AD',544 'AD_GROUP_CRITERION', 'CAMPAIGN_BUDGET'545 )546ORDER BY change_event.change_date_time DESC547LIMIT 500548```549550## Gotchas and Important Notes551552### cost_micros Requires Division553554All cost fields are in micros (1/1,000,000 of the currency unit):555556```557Actual cost = metrics.cost_micros / 1,000,000558Actual CPC = metrics.average_cpc / 1,000,000559```560561Example: `cost_micros = 5430000` means $5.43.562563### Segment + Metric Compatibility564565- `segments.conversion_action` — impressions/clicks repeat across each conversion action row. Do not sum them.566- `segments.click_type` — clicks and impressions fragment by click type. Summing overcounts.567- `segments.slot` — only compatible with search campaigns.568- `segments.hour` — cannot be combined with `segments.date` for some resources.569- Check the Google Ads API field compatibility matrix when in doubt.570571### Date Range Requirements572573- Queries with `metrics.*` fields require a date range (`segments.date DURING ...` or `BETWEEN`).574- Resource-only queries (no metrics) do not need a date range.575576### Enum Values577578Enum fields must use string constant names:579580- **CampaignStatus:** `ENABLED`, `PAUSED`, `REMOVED`581- **AdGroupStatus:** `ENABLED`, `PAUSED`, `REMOVED`582- **AdvertisingChannelType:** `SEARCH`, `DISPLAY`, `SHOPPING`, `VIDEO`, `PERFORMANCE_MAX`, `MULTI_CHANNEL`, `LOCAL`, `SMART`, `HOTEL`, `DISCOVERY`583- **KeywordMatchType:** `BROAD`, `PHRASE`, `EXACT`584- **BiddingStrategyType:** `TARGET_CPA`, `TARGET_ROAS`, `MAXIMIZE_CONVERSIONS`, `MAXIMIZE_CONVERSION_VALUE`, `MANUAL_CPC`, `ENHANCED_CPC`, `TARGET_IMPRESSION_SHARE`585- **Device:** `DESKTOP`, `MOBILE`, `TABLET`, `CONNECTED_TV`, `OTHER`586- **QualityScoreBucket:** `BELOW_AVERAGE`, `AVERAGE`, `ABOVE_AVERAGE`587588### Rate Limits589590- **Standard access:** 15,000 requests/day, 1,600 operations/minute.591- **Basic access:** 10,000 requests/day.592- Use `SearchStream` for large result sets (one operation regardless of size).593594### Other Pitfalls595596- **No `OR`:** All WHERE conditions are AND-joined. Use `IN` or separate queries.597- **No joins:** GAQL queries operate on a single resource.598- **No `GROUP BY`:** Aggregation is implicit by selected fields + segments.599- **No aliases:** Cannot use `AS` in GAQL.600- **No arithmetic:** Calculate `cost_micros / 1000000` client-side.601- **Segment auto-grouping:** Adding a segment splits rows by that dimension.602- **Removed resources:** Excluded by default. Filter explicitly to include them.603- **PARAMETERS clause:** `include_drafts = true` for drafts, `omit_unselected_resource_names = true` to reduce response size.604605## Resources606607- **GAQL Grammar:** https://developers.google.com/google-ads/api/docs/query/grammar608- **Interactive Query Builder:** https://developers.google.com/google-ads/api/fields/v17/overview_query_builder609- **Resource Reference:** https://developers.google.com/google-ads/api/fields/v17/overview610- **Rate Limits:** https://developers.google.com/google-ads/api/docs/best-practices/rate-limits611- **Full Cogny Docs:** https://cogny.com/docs/gaql-reference