# GAQL Reference Card
## Basic Syntax
```
SELECT [fields] FROM [resource] WHERE [conditions] ORDER BY [field]
```
## Common Resources
### Campaign Resources
- `campaign` - Campaign settings
- `campaign_budget` - Budget info
- `campaign_criterion` - Campaign targeting (keywords, locations, etc)
### Ad Group Resources
- `ad_group` - Ad group settings
- `ad_group_ad` - Ads in ad groups
- `ad_group_criterion` - Keywords, placements, audiences in ad groups
### Query Resources
- `customer` - Account info
- `asset` - Ad assets (sitelinks, callouts, etc)
- `audience` - Audience lists
- `label` - Custom labels
- `accessible_bidding_strategy` - Bidding strategies
### Performance Data
All resources support `metrics.*` fields when recent data exists:
- `metrics.impressions`
- `metrics.clicks`
- `metrics.conversions`
- `metrics.cost_micros`
- `metrics.ctr`
- `metrics.conversion_rate`
- `metrics.quality_score` (keywords only)
### Segments
Available for breakdowns:
- `segments.date`
- `segments.device`
- `segments.geo_target_country`
- `segments.geo_target_city`
- `segments.age_range`
- `segments.gender`
- `segments.day_of_week`
- `segments.hour_of_day`
## Common Queries
### Active Campaigns
```sql
SELECT campaign.id, campaign.name
FROM campaign
WHERE campaign.status = 'ENABLED'
```
### Campaign Performance (Last 30 Days)
```sql
SELECT campaign.id, campaign.name, metrics.impressions, metrics.clicks,
metrics.conversions, metrics.cost_micros, metrics.ctr
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC
```
### Keywords by Quality Score
```sql
SELECT ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type,
metrics.quality_score, metrics.impressions, metrics.clicks
FROM ad_group_criterion
WHERE ad_group_criterion.type = 'KEYWORD'
ORDER BY metrics.quality_score ASC
```
### Ad Group Performance by Device
```sql
SELECT ad_group.id, ad_group.name, segments.device,
metrics.impressions, metrics.clicks, metrics.conversions
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
```
### Shopping Campaign ROI
```sql
SELECT campaign.id, campaign.name,
metrics.conversions, metrics.cost_micros,
metrics.impressions, metrics.clicks
FROM campaign
WHERE campaign.advertising_channel_type = 'SHOPPING'
AND segments.date DURING LAST_30_DAYS
```
### Display Placements Performance
```sql
SELECT ad_group_criterion.placement.url,
metrics.impressions, metrics.clicks, metrics.conversions
FROM ad_group_criterion
WHERE ad_group_criterion.type = 'PLACEMENT'
AND segments.date DURING LAST_7_DAYS
```
### YouTube Video Targeting
```sql
SELECT ad_group_criterion.youtube_video.video_id,
metrics.impressions, metrics.views, metrics.cost_micros
FROM ad_group_criterion
WHERE ad_group_criterion.type = 'YOUTUBE_VIDEO'
```
### High-Cost Low-Converting Keywords
```sql
SELECT ad_group_criterion.keyword.text,
metrics.cost_micros, metrics.conversions, metrics.impressions
FROM ad_group_criterion
WHERE ad_group_criterion.type = 'KEYWORD'
AND metrics.cost_micros > 1000000
AND metrics.conversions = 0
```
### Paused Items to Review
```sql
SELECT campaign.id, campaign.name, ad_group.id, ad_group.name
FROM ad_group
WHERE ad_group.status = 'PAUSED'
AND campaign.status = 'ENABLED'
```
### Performance by Geography
```sql
SELECT segments.geo_target_country,
metrics.impressions, metrics.clicks, metrics.conversions
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
GROUP BY segments.geo_target_country
```
## Operators & Filters
### Comparison Operators
- `=` Equal
- `!=` Not equal
- `>` Greater than
- `<` Less than
- `>=` Greater than or equal
- `<=` Less than or equal
### String Operators
- `LIKE '%pattern%'` - Contains pattern
- `STARTS_WITH 'prefix'` - Starts with prefix
- `IN ('value1', 'value2')` - In list
### Date Operators
- `DURING LAST_7_DAYS`
- `DURING LAST_30_DAYS`
- `DURING LAST_90_DAYS`
- `DURING THIS_MONTH`
- `DURING LAST_MONTH`
- `DURING LAST_QUARTER`
- `DURING LAST_YEAR`
### Logical Operators
- `AND` Both conditions true
- `OR` Either condition true
- Use parentheses for complex logic: `WHERE (condition1 OR condition2) AND condition3`
## Status Values
### Campaign Status
- `ENABLED` - Active
- `PAUSED` - Paused
- `REMOVED` - Removed/deleted
### Ad Group Status
- `ENABLED` - Active
- `PAUSED` - Paused
### Criterion Status (Keywords, Placements, etc)
- `ENABLED` - Active
- `PAUSED` - Paused
- `REMOVED` - Deleted
## Cost Conversion
Google Ads returns costs in **micros** (millionths of currency):
```
Actual cost = cost_micros / 1,000,000
```
Example:
```
cost_micros = 2500000
Actual cost = 2500000 / 1,000,000 = $2.50
```
## Common Metrics Calculations
### Click-Through Rate (CTR)
```
ctr = metrics.clicks / metrics.impressions
```
### Cost Per Click (CPC)
```
cpc = metrics.cost_micros / metrics.clicks / 1,000,000
```
### Conversion Rate
```
conversion_rate = metrics.conversions / metrics.clicks
```
### Cost Per Conversion (CPA)
```
cpa = metrics.cost_micros / metrics.conversions / 1,000,000
```
### Return on Ad Spend (ROAS) - for Shopping
```
roas = revenue / (metrics.cost_micros / 1,000,000)
```
## Examples with Multiple Conditions
### Complex Campaign Filter
```sql
SELECT campaign.id, campaign.name, metrics.conversions
FROM campaign
WHERE campaign.status = 'ENABLED'
AND campaign.advertising_channel_type = 'SEARCH'
AND metrics.conversions > 0
AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.conversions DESC
LIMIT 50
```
### Budget Analysis
```sql
SELECT campaign.id, campaign.name, campaign_budget.amount_micros
FROM campaign
WHERE campaign_budget.amount_micros > 5000000
AND campaign.status = 'ENABLED'
ORDER BY campaign_budget.amount_micros DESC
```
### Multi-Criteria Performance Report
```sql
SELECT campaign.name, ad_group.name,
metrics.impressions, metrics.clicks,
metrics.conversions, metrics.cost_micros
FROM ad_group
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND segments.date DURING LAST_7_DAYS
AND metrics.impressions > 100
ORDER BY metrics.cost_micros DESC
LIMIT 100
```