Build or update a Google Ads Intent Map from search terms, campaign data, and account context. Pulls live data via MCP or works with manual exports.
Library skill — the default version is maintained in GitHub; edits you make live in your own clone.
Read first:
- google-ads/references/operator-thesis.md
- google-ads/references/intent-map.md
- google-ads/references/query-patterns.md
- google-ads/references/deliverable-templates.md
Read workspace if available:
- workspace/ads/account.md
- workspace/ads/goals.md
- workspace/ads/intent-map.md
- workspace/ads/queries.md
- workspace/ads/winners.md
- workspace/ads/learnings.md
Pull via the search tool on google-ads-mcp:
Primary: All search terms for clustering — last 30 days:
SELECT
search_term_view.search_term,
campaign.name,
campaign.advertising_channel_type,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions,
metrics.conversions_value,
metrics.all_conversions
FROM search_term_view
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
LIMIT 1000
Retrieval ladder — if the primary query returns no rows, follow the shared retrieval ladder in data/search-term-retrieval.md. In pmax-fallback mode, use rows for clustering but note that performance metrics are unavailable for intent-class profiling. In limited mode, clustering is blocked — request a UI export.
Supplementary: Campaign and ad group structure (for routing analysis):
SELECT
campaign.name,
campaign.advertising_channel_type,
ad_group.name,
ad_group.status,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM ad_group
WHERE campaign.status = 'ENABLED'
AND ad_group.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS
ORDER BY campaign.name, ad_group.name
See data/gaql-recipes.md for additional queries.
If LAST_30_DAYS returns too few terms for meaningful clustering (<20 terms), fall back to LAST_90_DAYS, then all-time. Intent mapping benefits from volume — more search terms means better clustering. Always state the date range used.
Ask the user for: - Search Terms report: last 30 days, all terms (not just top spenders) - Include: Search term, Campaign, Ad group, Impressions, Clicks, Cost, Conversions, Conv. value - Campaign names are essential for routing analysis
See data/export-formats.md for recommended format.
data/search-term-retrieval.md). Report retrieval_mode in the output header.pmax-fallback, use rows for clustering but note that performance profiling is unavailable. If limited, clustering is blocked — request a UI export.workspace/ads/intent-map.md if it exists.workspace/ads/intent-map.md.Trigger: Two or more distinct intent classes are sharing a single campaign or ad group, AND the performance gap between them is significant (e.g., 2x+ CPA difference, or one class converts and the other doesn't).
Create a draft using drafts/templates/structure-draft.md:
- Write to workspace/ads/drafts/YYYY-MM-DD-[account-slug]-structure.md
- Specify exactly which intent classes to separate, which campaigns/ad groups to split
- Include keyword lists or patterns that should route to each new bucket
- Update workspace/ads/drafts/_index.md
Trigger: Intent Map reveals a clear junk class that should be excluded account-wide.
Create using drafts/templates/negative-draft.md if the junk class is better solved by exclusion than by structure.
workspace/ads/intent-map.md — the primary deliverable. Rebuild or update the map.workspace/ads/queries.md — notable clustersworkspace/ads/findings.md — strategic observations about intent routing