calendar Last updated: 18 September 2026
google ads to claude windsor mcp
Data integration
Data Pipelines
Google Ads
How to's

How to Connect Google Ads to Claude in 60 Seconds (Analysis & Campaign Management)

Try It Free

Connect your data in 1 min. Free forever plan

Got insights from this post? Give it a boost by sharing with others!

Connect Google Ads to Claude in two steps: authorize your account at onboard.windsor.ai/app/google_ads, then add the Windsor.ai connector from the Claude directory (search Windsor, click Add). That’s it. Now open a new chat and ask about your campaigns in plain English.

Google also publishes its own open-source Google Ads MCP server, and Claude Code has its own setup. Both are compared with Windsor.ai on the Google Ads to Claude connector page: setup, Claude plans, reads, writes and cost, side by side.

Here’s the problem it solves: every Google Ads manager has dealt with a budget leak.

A handful of keywords convert at 0.2%.
A campaign with a target ROAS of 400% sits at 180% for three weeks while Smart Bidding “learns.”
One match type in an ad group takes the traffic the others were meant to win.

You know these problems exist. The job is to find them quickly and stop the wasted spend.

Google Ads reporting shows what happened: CPA increased, ROAS dropped, but understanding why usually means digging across campaigns, ad groups, keywords, match types, devices, and time segments. In practice, that often turns into CSV exports, pivot tables, and hours of analysis.

With Windsor MCP, your Google Ads data is streamed directly from the Google Ads API into Claude, automatically and with no code.

🚀 Automate your Google Ads analysis in Claude with Windsor MCP. Try it free.

Instead of exporting CSV reports or managing spreadsheets, you can automate the integration and start asking questions about campaign performance in natural language, like:

  • Which keywords are spending the most but generating no conversions?
  • Which campaigns are missing their ROAS targets?
  • Where is the budget being wasted?

Claude analyzes your Google Ads data instantly and surfaces the underlying issues, helping you connect ad spend to real results and identify clear optimization opportunities in just seconds.

It can also generate structured summaries, tables, and visual dashboards, turning analysis into actionable reporting.

What’s more, Windsor MCP doesn’t stop at analysis. Spot a campaign burning budget with zero conversions? Pause it directly inside Claude. Spot one outperforming its target? Shift more budget toward it, all without switching to Google Ads Manager.

google ads report in claude windsor

How to connect Google Ads data to Claude with Windsor MCP

Windsor MCP acts as the data layer between Google Ads and Claude, pulling structured campaign data directly from the Google Ads API and making it available for analysis inside your Claude conversations.

All you need to do is complete three simple steps.

📖 Full walkthrough: windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-claude/.

Prerequisites

Before you begin, make sure you have access to:

  • a Windsor.ai account (free or paid plan)
  • a Google Ads account (read-only or higher access level)
  • a Claude account

Then follow these steps to connect Google Ads to Claude:

1. Go to onboard.windsor.ai and select Google Ads as your data source.

2. Sign in with the Google account that has access to your Ads account and approve the connection. Select the account(s) that you’d like to connect to Claude.

Google Ads data source

3. In Claude, open Customize, then Connectors, search for Windsor and click Add. Sign in to your Windsor.ai account when prompted. You can also open the Windsor.ai listing in the Claude directory and click Connect.

windsor.ai connector claude

💡 Quick tip: Set permissions to “Always allow,” so your Ads data will be live in every Claude conversation from here on.

connect windsor.ai to claude

You’re all set. Your Google Ads data is now connected to Claude and ready to query.

Prompt ideas: What you can do with your Google Ads data in Claude

The use cases and prompts below help Google Ads PPC managers analyze their campaign data faster in Claude using Google Ads fields provided by Windsor.

🤖 For more advanced prompt ideas across Google Ads and other data sources, browse the full Windsor AI Prompt Library.

If you’re running B2B or lead generation campaigns

Your boss isn’t asking about ROAS. They’re asking which campaigns produce a qualified pipeline, and at what cost. The problem is that Google Ads only knows about form fills. The qualification happens downstream in your CRM. Here’s how to connect those dots.

The question every B2B marketer needs answered: which campaigns produce deals, not just leads.

Lead generation efficiency across channels

Connect Google Ads alongside your CRM (e.g., HubSpot or Salesforce) in Windsor. Then ask the following.

Prompt:

Join Google Ads campaign_name and ad_group_name with CRM deal data using the utm_campaign and utm_content fields. For each campaign, show: total cost, total leads (conversions), leads that reached SQL stage, SQL-to-deal conversion rate, and average deal value. Calculate cost per SQL and cost per closed deal. Rank campaigns by cost per closed deal, ascending.

This is the analysis most B2B teams do quarterly in a spreadsheet, if they do it at all. With Windsor connecting Google Ads and your CRM to Claude, it becomes a standing question you can ask any time.

CPA by keyword, segment by device and time of day

You know your target CPA. The question is which specific keywords and under which conditions are blowing past it.

Prompt:

Pull keyword_text, match_type, device, hour_of_day, cost, conversions, and cost_per_conversion for all search campaigns in the last 60 days. Find all keyword + device combinations where cost_per_conversion exceeds [your target CPA] by more than 50%. Then check: are any of these currently using max conversions bidding? If so, the algorithm may be prioritizing volume over efficiency. Flag those for bid strategy review.

Audience segment performance: are your in-market audiences cheaper to convert?

Prompt:

For my Search campaigns, break down cost, conversions, cost_per_conversion, and conversion_rate by audience_name (in-market, remarketing, similar and Customer Match audiences). Compare the CPA of each audience layer against the base (no audience) for the same campaign. Which audience segments justify a bid adjustment, and what adjustment would bring their effective CPA to target?

Quality score triage: where low QS is costing you on CPCs

Prompt:

Show me all keywords with quality_score of 4 or below, their campaign_name, ad_group_name, creative_quality_score, post_click_quality_score, search_predicted_ctr, average_cpc, and cost over the last 30 days. Prioritize by cost descending. For the top 20 by spend, what is the most common failing component: CTR, relevance, or landing page? Group them and suggest which issue to fix first for maximum CPC reduction.

If you’re managing Google Ads for clients (agency use)

Your problem isn’t just analysis. It’s doing analysis across 10 or 20 accounts without spending your whole week in spreadsheets, and then turning it into something a client can understand.

Here’s how Windsor MCP for Google Ads to Claude integration can take over the repetitive parts of your work.

Cross-account budget pacing and anomaly detection

Prompt:

For each client account, pull campaign_name, daily budget, cost for yesterday, cost month-to-date, and days remaining in the month. Calculate projected month-end spend at the current run rate. Flag any account where projected spend is more than 15% above or below the monthly budget. Also, flag any campaign where yesterday's cost was more than 3x its 7-day average daily spend. That's usually a bidding anomaly or accidental budget increase.

Client-ready performance narrative, not just a data dump

Prompt:

Using Google Ads data for [client name] for this month vs. last month: compare cost, impressions, clicks, ctr, conversions, cost_per_conversion, and conversion_value. Write a 3-paragraph client performance summary that: (1) leads with the headline result (better or worse ROI, and by how much), (2) explains the two biggest drivers of that change at the campaign or ad group level, (3) gives one specific recommendation for next month with the expected impact. Write it for a non-technical client who cares about results, not metrics.

Finding upsell opportunities within an existing client account

Prompt:

Analyze [client]'s current campaign structure. Which product categories or service lines have no active campaign but exist as search terms in the search_term report with more than 50 impressions and at least one conversion in the last 90 days? These are unmet demand signals. List them as potential new campaign opportunities with estimated monthly search volume based on impression data.

Google Ads + GA4: what happens after the click

Google Ads tells you someone converted. GA4 tells you what they did before that.

Prompt:

For my top 10 Google Ads campaigns by spend, pull the post-click GA4 behaviour: average session duration, pages per session, bounce rate, and micro-conversion rate (e.g. product page view or add-to-cart). Are there campaigns with strong Google Ads CTR but high GA4 bounce rate?

If you’re running e-commerce or D2C campaigns

Your core question is always some version of: which campaigns are making money, and which are spending it? Here’s how to get Claude to answer that properly.

Finding your true ROAS by campaign, net of discounts

Google Ads reports conversion_value against cost. But if you’re running promotions or have margin differences across product lines, blended ROAS hides the difference. Connect your Shopify or WooCommerce data alongside Google Ads in Windsor and ask the following.

Prompt:

Pull cost, conversion_value, and conversions for all Shopping and Performance Max campaigns for the last 30 days. Calculate ROAS as conversion_value / cost for each. Then cross-reference with Shopify order data to show actual gross margin per campaign. Flag any campaigns where reported ROAS is above 400% but margin-adjusted ROAS falls below 200%.

Performance Max: what is spending your budget

PMax campaigns are a black box by design. Google aggregates Shopping, Display, Search, and YouTube inventory into a single campaign. But Windsor can pull asset group performance and product-level data separately, giving Claude enough to work with.

Prompt:

For my Performance Max campaigns, break down cost and conversion_value by asset_group_name. Which asset groups have a ROAS below my account target of [X]%? Also, pull the top 10 product_id values by cost within PMax and flag any that have spent above $50 with zero conversions in the last 14 days.

Performance Max (PMax) insights

Google famously hides granular search term data within PMax campaigns, making it a “black box” for many merchants. Since Windsor.ai pulls raw campaign dimensions that the standard Google Ads UI often abstracts, you can ask Claude the following prompt (based on Shopify + Google Ads data blending).

Prompt:

Analyze my PMax search themes and cross-reference them with Shopify sales to see which 'unseen' search terms are driving my highest-margin orders.

Identifying cannibalizing search terms across match types

Broad match modified, phrase, and exact often bid on overlapping queries. Without a search term analysis, you’re paying for the same intent multiple times.

Prompt:

Pull search_term, match_type, campaign_name, ad_group_name, cost, conversions, and conversion_rate for the last 30 days. Find search terms that appear across more than one match type in the same or different ad groups. For each duplicate, which match type has the lower CPA? Flag cases where broad or phrase match is outspending exact match on the same query.

Budget allocation: where to shift spending before the end of the month

Prompt:

Show me campaign_name, cost, conversion_value, roas, impression_share_lost_budget, and impression_share_lost_rank for all active campaigns this month. Which campaigns have a ROAS above [target] but are losing impression share due to budget? How much incremental budget would be needed to capture that lost share, based on current CPCs?

How Windsor MCP works with Google Ads and Claude

Instead of exporting reports manually, Windsor connects directly to the Google Ads API and streams structured campaign data into your Claude conversations.

This means Claude can analyze the same metrics and dimensions you normally access through GAQL queries, but without writing queries or building dashboards.

The process works like this:

  1. Windsor connects to your Google Ads account through the API.
  2. It retrieves structured campaign data, including performance metrics, segmentation dimensions, and diagnostic fields.
  3. The Windsor MCP connector makes this data available inside Claude.
  4. Claude can then query, analyze, and manage campaigns using natural language prompts.

Because the data comes directly from the Google Ads API, every question you ask Claude is based on live campaign data, not static exports.

Core capabilities of Windsor MCP for Google Ads

  • Live campaign data

Windsor pulls campaign data directly from the Google Ads API, so Claude always analyzes the most recent performance metrics without repetitive exports every time you need fresh data.

  • Structured data for analysis

Windsor normalizes Google Ads fields and sends them to Claude in a structured format, making it easier to query performance across campaigns, ad groups, keywords, search terms, and audience segments.

  • Access to thousands of Google Ads fields

Claude can analyze more than 2,500 Google Ads metrics and dimensions, including campaign structure, performance metrics, and quality diagnostics.

  • Cross-source data analysis

Because Windsor connects to 350+ marketing and business data sources, you can combine Google Ads data with:

  • Advertising platforms (Facebook Ads, TikTok Ads, LinkedIn Ads)
  • E-commerce platforms (Shopify or WooCommerce)
  • CRMs (HubSpot or Salesforce)
  • GA4 post-click behaviour

This allows you to analyze ad spend alongside revenue and pipeline outcomes.

windsor mcp for trend analysis

  • Multi-account analysis

If you manage multiple Google Ads accounts through an MCC, Windsor allows Claude to analyze performance across accounts in a single conversation.

  • Write-enabled campaign management

Windsor.ai’s MCP carries 30+ Google Ads write actions: pause or enable campaigns, ad groups and ads, set budgets, switch bidding strategies and targets, push keywords and negative keywords, create campaigns, ad groups, responsive search ads and extensions, set geo, language and ad-schedule targeting, and build Customer Match lists. Every action runs on your instruction, and new campaigns, ad groups and ads are created paused. Among the teams using these actions through Claude, pushing negative keywords and keywords are the most common, and they go through on nearly every attempt. The action that fails most often is switching a bidding strategy, usually because the target CPA or target ROAS the new strategy needs was not given.

Key Google Ads data fields Windsor sends to Claude

Windsor gives Claude access to more than 2,500 Google Ads fields. The ones below are what teams request most through Claude, in roughly that order. The most common single pull is campaign, clicks, conversions, impressions and spend by date; search terms with spend and conversions come next.

Performance metrics you’ll use in almost every prompt

  • spend, cost: the same number under two names, the denominator in every efficiency calculation
  • clicks, impressions, ctr: funnel entry metrics; CTR at keyword level also feeds Quality Score
  • conversions, all_conversions, conversion_action_name: conversions counts the actions you set as primary, all_conversions includes the rest, and conversion_action_name splits either one by action (lead form, purchase, call), which is how teams separate leads from purchases
  • conversions_value, conversion_value: the revenue side of ROAS; both names return the value
  • cost_per_conversion, roas: CPA and return on ad spend, calculated by Windsor so the prompt does not have to
  • average_cpc, cpc: what a click cost; compare against the ad group’s bid to read auction pressure
  • search_impression_share, search_budget_lost_impression_share, search_rank_lost_impression_share: the ceiling on your reach, and whether budget or rank is what caps it

Segmentation dimensions for deeper cuts

  • campaign, campaign_name, campaign_id, ad_group_name: the structural dimensions for any campaign-level analysis
  • search_term, keyword_text, keyword_match_type: the query typed, the keyword that caught it, and the match type; the basis of search term and cannibalisation analysis
  • campaign_criterion_keyword_text, campaign_criterion_negative: the campaign’s negative keyword list, for auditing what is already blocked before pushing more
  • device: mobile, desktop and tablet; performance gaps here are almost always actionable
  • hour_of_day, day_of_week: time-of-day segmentation for dayparting decisions
  • audience_name: in-market, remarketing and Customer Match audiences, each with its own CPA profile
  • asset_group_name: Performance Max asset group breakdowns; the closest you get to PMax transparency

Quality and diagnostic fields

  • quality_score: 1 to 10 per keyword; correlates directly with CPCs
  • creative_quality_score, post_click_quality_score, search_predicted_ctr: the three Quality Score components (ad relevance, landing page experience, expected CTR); they tell you which lever to pull
  • bidding_strategy_type, budget_amount: the strategy driving the algorithm and the budget it runs on
  • campaign_status, ad_group_status, keyword_status: enabled, paused, removed; useful for auditing account hygiene

Google Ads is the hardest-worked data source on Windsor’s Claude connector, producing more data queries than any other platform. The full ranking of the best Claude connectors by real usage data shows how teams use it alongside Meta Ads, GA4, and Search Console.

Conclusion

Google Ads accounts reward the people who ask the most precise questions most often. The problem has always been that asking precise questions takes time: you need to download data, build pivot tables, cross-reference campaign structures, and extract insights.

Windsor MCP gives Claude live access to your Google Ads data. You still need to know which questions to ask; the difference is that getting insights and acting on them now takes seconds instead of days.

For e-commerce teams, that means tighter ROAS management and faster budget reallocation. For B2B teams, it means finally knowing which campaigns produce revenue, not just leads. For agencies, it means spending less time on reports and more time on strategy.

🚀 Connect Google Ads to Claude with Windsor MCP, start for free.


Available actions


Push Negative Keywords Add negative keywords to a Google Ads campaign or ad group. Set level to 'campaign' (with campaign_id) to block the terms across the whole campaign, or 'ad_group' (with ad_group_id) to block them only in that ad group. Each keyword has a match type (BROAD, PHRASE or EXACT, defaulting to BROAD). Keywords are pushed in one request; any that Google rejects (for example a duplicate, or a negative that already exists on the target) are skipped and reported, and the remaining valid keywords are still added. To read back the pushed negative keywords, query get_data with the campaign_criterion_keyword_text, campaign_criterion_keyword_match_type and campaign_criterion_negative fields (campaign level) or the ad_group_criterion_keyword_text, ad_group_criterion_keyword_match_type and ad_group_criterion_negative fields (ad group level).

Add negative keywords to a Google Ads campaign or ad group. Set level to 'campaign' (with campaign_id) to block the terms across the whole campaign, or 'ad_group' (with ad_group_id) to block them only in that ad group. Each keyword has a match type (BROAD, PHRASE or EXACT, defaulting to BROAD). Keywords are pushed in one request; any that Google rejects (for example a duplicate, or a negative that already exists on the target) are skipped and reported, and the remaining valid keywords are still added. To read back the pushed negative keywords, query get_data with the campaign_criterion_keyword_text, campaign_criterion_keyword_match_type and campaign_criterion_negative fields (campaign level) or the ad_group_criterion_keyword_text, ad_group_criterion_keyword_match_type and ad_group_criterion_negative fields (ad group level).

Parameters
levelstringRequiredcampaign_idstringad_group_idstringkeywordsarrayRequired
Push Keywords Add positive keywords to a Google Ads ad group (positive keywords live on the ad group, not the campaign). Each keyword has a match type (BROAD, PHRASE or EXACT, defaulting to BROAD) and an optional max CPC bid in micros. Status ('enabled' or 'paused') defaults to 'enabled' for the whole batch and can be overridden per keyword. Keywords are pushed in one request; any that Google rejects (for example a duplicate that already exists in the ad group) are skipped and reported, and the remaining valid keywords are still added.

Add positive keywords to a Google Ads ad group (positive keywords live on the ad group, not the campaign). Each keyword has a match type (BROAD, PHRASE or EXACT, defaulting to BROAD) and an optional max CPC bid in micros. Status ('enabled' or 'paused') defaults to 'enabled' for the whole batch and can be overridden per keyword. Keywords are pushed in one request; any that Google rejects (for example a duplicate that already exists in the ad group) are skipped and reported, and the remaining valid keywords are still added.

Parameters
ad_group_idstringRequiredstatusstringkeywordsarrayRequired
Create Responsive Search Ad Create a responsive search ad inside an existing Search ad group. Provide 3-15 headlines (max 30 characters each) and 2-4 descriptions (max 90 characters each); Google mixes them into ad combinations. final_url is the landing page. The optional path1 and path2 are display-URL segments (max 15 characters each; path2 requires path1). The ad is created paused by default so it does not start serving immediately.

Create a responsive search ad inside an existing Search ad group. Provide 3-15 headlines (max 30 characters each) and 2-4 descriptions (max 90 characters each); Google mixes them into ad combinations. final_url is the landing page. The optional path1 and path2 are display-URL segments (max 15 characters each; path2 requires path1). The ad is created paused by default so it does not start serving immediately.

Parameters
ad_group_idstringRequiredheadlinesarrayRequireddescriptionsarrayRequiredfinal_urlstringRequiredpath1stringpath2stringstatusstringnamestring
Create Ad Group Create a new ad group inside an existing Search or Display campaign. The ad group type is derived from the campaign's channel type. The optional cpc_bid_micros sets the default max CPC bid in micros of the account currency (1,000,000 micros = 1 unit). The ad group is created paused by default.

Create a new ad group inside an existing Search or Display campaign. The ad group type is derived from the campaign's channel type. The optional cpc_bid_micros sets the default max CPC bid in micros of the account currency (1,000,000 micros = 1 unit). The ad group is created paused by default.

Parameters
campaign_idstringRequirednamestringRequiredstatusstringcpc_bid_microsstring
Create Campaign Create a new Search or Display Google Ads campaign together with its daily budget in a single atomic request. The budget amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 50_000_000 means 50.00). The campaign is created paused by default so it does not start serving immediately. It is declared as not containing EU political advertising unless contains_eu_political_advertising is set to true. The maximize_conversions bidding strategy requires conversion tracking to be enabled on the account. Add ad groups to it with the create_ad_group action.

Create a new Search or Display Google Ads campaign together with its daily budget in a single atomic request. The budget amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 50_000_000 means 50.00). The campaign is created paused by default so it does not start serving immediately. It is declared as not containing EU political advertising unless contains_eu_political_advertising is set to true. The maximize_conversions bidding strategy requires conversion tracking to be enabled on the account. Add ad groups to it with the create_ad_group action.

Parameters
namestringRequiredbudget_amount_microsintegerRequiredchannel_typestringbidding_strategystringstatusstringbudget_namestringcontains_eu_political_advertisingboolean
Set Campaign Budget Set the daily or total (lifetime) budget of a Google Ads campaign. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 50_000_000 means 50.00). A lifetime budget only applies to campaigns with a fixed end date. If the budget is also used by other campaigns, the change is rejected unless apply_to_shared_budget is set to true, because it would affect every campaign that shares that budget.

Set the daily or total (lifetime) budget of a Google Ads campaign. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 50_000_000 means 50.00). A lifetime budget only applies to campaigns with a fixed end date. If the budget is also used by other campaigns, the change is rejected unless apply_to_shared_budget is set to true, because it would affect every campaign that shares that budget.

Parameters
campaign_idstringRequiredbudget_typestringRequiredamount_microsintegerRequiredapply_to_shared_budgetboolean
Create Ad Asset Create a Google Ads ad extension asset and link it to a campaign or ad group in one atomic request. Supported asset_type values: 'sitelink' (extra links under the ad; needs link_text and final_url, with optional description_1 and description_2), 'callout' (short non-clickable highlight; needs callout_text), 'structured_snippet' (a header plus 3-10 values; needs header and values) and 'call' (a phone number; needs phone_number and country_code). Set level to 'campaign' (with campaign_id) to apply the extension across the whole campaign, or 'ad_group' (with ad_group_id) to apply it to one ad group only. Each call creates one asset; call the action again for each additional extension. New call and sitelink assets go through Google's policy review before they start showing.

Create a Google Ads ad extension asset and link it to a campaign or ad group in one atomic request. Supported asset_type values: 'sitelink' (extra links under the ad; needs link_text and final_url, with optional description_1 and description_2), 'callout' (short non-clickable highlight; needs callout_text), 'structured_snippet' (a header plus 3-10 values; needs header and values) and 'call' (a phone number; needs phone_number and country_code). Set level to 'campaign' (with campaign_id) to apply the extension across the whole campaign, or 'ad_group' (with ad_group_id) to apply it to one ad group only. Each call creates one asset; call the action again for each additional extension. New call and sitelink assets go through Google's policy review before they start showing.

Parameters
asset_typestringRequiredlevelstringRequiredcampaign_idstringad_group_idstringlink_textstringfinal_urlstringdescription_1stringdescription_2stringcallout_textstringheaderstringvaluesstringphone_numberstringcountry_codestring
Enable Campaign Enable a paused Google Ads campaign. Reversible via pause_campaign.

Enable a paused Google Ads campaign. Reversible via pause_campaign.

Parameters
campaign_idstringRequired
Pause Campaign Pause an active Google Ads campaign. Reversible via enable_campaign.

Pause an active Google Ads campaign. Reversible via enable_campaign.

Parameters
campaign_idstringRequired
Enable Ad Enable a paused ad within an ad group. Identify the ad by its ad group id and ad id; the create ad actions return these joined as '<ad_group_id>~<ad_id>'. Reversible via pause_ad.

Enable a paused ad within an ad group. Identify the ad by its ad group id and ad id; the create ad actions return these joined as '<ad_group_id>~<ad_id>'. Reversible via pause_ad.

Parameters
ad_group_idstringRequiredad_idstringRequired
Pause Ad Pause an active ad within an ad group. Identify the ad by its ad group id and ad id; the create ad actions return these joined as '<ad_group_id>~<ad_id>'. Reversible via enable_ad.

Pause an active ad within an ad group. Identify the ad by its ad group id and ad id; the create ad actions return these joined as '<ad_group_id>~<ad_id>'. Reversible via enable_ad.

Parameters
ad_group_idstringRequiredad_idstringRequired
Update Keywords Update existing positive keywords in a Google Ads ad group, identified by ad group criterion id (from the get_data 'keyword_criterion_id' field). Each update can change the keyword's status ('enabled' or 'paused') and/or its max CPC bid in micros; a keyword's text and match type cannot be changed (remove and re-add to change those). Updates are applied in one request; any that Google rejects (for example an unknown criterion id) are skipped and reported, and the remaining valid updates are still applied.

Update existing positive keywords in a Google Ads ad group, identified by ad group criterion id (from the get_data 'keyword_criterion_id' field). Each update can change the keyword's status ('enabled' or 'paused') and/or its max CPC bid in micros; a keyword's text and match type cannot be changed (remove and re-add to change those). Updates are applied in one request; any that Google rejects (for example an unknown criterion id) are skipped and reported, and the remaining valid updates are still applied.

Parameters
ad_group_idstringRequiredupdatesarrayRequired
Enable Ad Group Enable a paused Google Ads ad group. Reversible via pause_ad_group.

Enable a paused Google Ads ad group. Reversible via pause_ad_group.

Parameters
ad_group_idstringRequired
Set Campaign Bidding Strategy Switch a Google Ads campaign to a different standard (campaign-level) bidding strategy. Supported strategies: manual_cpc, target_cpa, target_roas, maximize_conversions, maximize_conversion_value, maximize_clicks, target_spend. maximize_clicks and target_spend are aliases for the same strategy (the former is the Google Ads UI label, the latter the API and get_data field naming). target_cpa_micros is required for target_cpa and maximize_conversions (1,000,000 micros = 1 unit of the account currency). target_roas is required for target_roas and maximize_conversion_value (expressed as a ratio, e.g. 4.0 means 400% return on ad spend). cpc_bid_ceiling_micros is required for maximize_clicks and target_spend; it is not accepted for other strategies because the API only allows a campaign-level ceiling on Target Spend (other strategies require a portfolio bidding strategy). manual_cpc takes no additional parameters.

Switch a Google Ads campaign to a different standard (campaign-level) bidding strategy. Supported strategies: manual_cpc, target_cpa, target_roas, maximize_conversions, maximize_conversion_value, maximize_clicks, target_spend. maximize_clicks and target_spend are aliases for the same strategy (the former is the Google Ads UI label, the latter the API and get_data field naming). target_cpa_micros is required for target_cpa and maximize_conversions (1,000,000 micros = 1 unit of the account currency). target_roas is required for target_roas and maximize_conversion_value (expressed as a ratio, e.g. 4.0 means 400% return on ad spend). cpc_bid_ceiling_micros is required for maximize_clicks and target_spend; it is not accepted for other strategies because the API only allows a campaign-level ceiling on Target Spend (other strategies require a portfolio bidding strategy). manual_cpc takes no additional parameters.

Parameters
campaign_idstringRequiredstrategystringRequiredtarget_cpa_microsstringtarget_roasstringcpc_bid_ceiling_microsstring
Set CPC Bid Ceiling Set the maximum CPC bid the strategy is allowed to place on a Google Ads campaign. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 2_500_000 means 2.50). Only applies to campaigns using Target Spend / Maximize Clicks bidding. Other strategies (Target CPA, Target ROAS, Maximize Conversions, Maximize Conversion Value) treat ceiling as portfolio-only per the Google Ads API, so those cannot be adjusted via this action.

Set the maximum CPC bid the strategy is allowed to place on a Google Ads campaign. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 2_500_000 means 2.50). Only applies to campaigns using Target Spend / Maximize Clicks bidding. Other strategies (Target CPA, Target ROAS, Maximize Conversions, Maximize Conversion Value) treat ceiling as portfolio-only per the Google Ads API, so those cannot be adjusted via this action.

Parameters
campaign_idstringRequiredamount_microsintegerRequired
Remove Keywords Remove positive keywords from a Google Ads ad group, identified by ad group criterion id (from the get_data 'keyword_criterion_id' field). Removals are applied in one request; any that Google rejects (for example an unknown criterion id) are skipped and reported, and the remaining valid removals still apply.

Remove positive keywords from a Google Ads ad group, identified by ad group criterion id (from the get_data 'keyword_criterion_id' field). Removals are applied in one request; any that Google rejects (for example an unknown criterion id) are skipped and reported, and the remaining valid removals still apply.

Parameters
ad_group_idstringRequiredcriterion_idsarrayRequired
Pause Ad Group Pause an active Google Ads ad group. Reversible via enable_ad_group.

Pause an active Google Ads ad group. Reversible via enable_ad_group.

Parameters
ad_group_idstringRequired
Set Campaign Language Targeting Set the languages a Google Ads campaign targets, so its ads only reach users Google associates with one of them. Each language is given as its Google Ads language code, spelled exactly as the languages parameter enumerates it (e.g. en, de, es, zh_CN). Regional variants such as en_US and en_GB are not among them and cannot be targeted, only the base en. Google's table of these codes with the language each one names is at https://developers.google.com/google-ads/api/data/codes-formats#languages. This replaces the whole language targeting — every language to target must be listed in one call, because the languages not listed are removed. Languages already targeted are left in place, so their criterion ids do not change. A campaign with no language criteria targets all languages; pass an empty list to clear the targeting and return it to that state. Language targeting cannot be negative: there is no way to exclude a single language, only to list the ones to target. Google rejects the change for campaign types that do not support language criteria (e.g. Smart campaigns).

Set the languages a Google Ads campaign targets, so its ads only reach users Google associates with one of them. Each language is given as its Google Ads language code, spelled exactly as the languages parameter enumerates it (e.g. en, de, es, zh_CN). Regional variants such as en_US and en_GB are not among them and cannot be targeted, only the base en. Google's table of these codes with the language each one names is at https://developers.google.com/google-ads/api/data/codes-formats#languages. This replaces the whole language targeting — every language to target must be listed in one call, because the languages not listed are removed. Languages already targeted are left in place, so their criterion ids do not change. A campaign with no language criteria targets all languages; pass an empty list to clear the targeting and return it to that state. Language targeting cannot be negative: there is no way to exclude a single language, only to list the ones to target. Google rejects the change for campaign types that do not support language criteria (e.g. Smart campaigns).

Parameters
campaign_idstringRequiredlanguagesarrayRequired
Remove Negative Keywords Remove negative keywords from a Google Ads campaign or ad group, identified by criterion id. Set level to 'campaign' (with campaign_id) or 'ad_group' (with ad_group_id) to match where the negative keywords are attached. Removals are applied in one request; any that Google rejects (for example an unknown criterion id) are skipped and reported, and the remaining valid removals still apply. Reversible via push_negative_keywords by re-adding the keyword text and match type.

Remove negative keywords from a Google Ads campaign or ad group, identified by criterion id. Set level to 'campaign' (with campaign_id) or 'ad_group' (with ad_group_id) to match where the negative keywords are attached. Removals are applied in one request; any that Google rejects (for example an unknown criterion id) are skipped and reported, and the remaining valid removals still apply. Reversible via push_negative_keywords by re-adding the keyword text and match type.

Parameters
levelstringRequiredcampaign_idstringad_group_idstringcriterion_idsarrayRequired
Set Max CPC Bid Set the default Max CPC bid on a Google Ads ad group. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 2_500_000 means 2.50). Manual CPC bids live on the ad group, not the campaign, so the parent campaign must use the Manual CPC bidding strategy; switch it first via set_campaign_bidding_strategy if it uses Smart Bidding.

Set the default Max CPC bid on a Google Ads ad group. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 2_500_000 means 2.50). Manual CPC bids live on the ad group, not the campaign, so the parent campaign must use the Manual CPC bidding strategy; switch it first via set_campaign_bidding_strategy if it uses Smart Bidding.

Parameters
ad_group_idstringRequiredamount_microsintegerRequired
Set Ad Schedule Set the ad schedule (dayparting) of a Google Ads campaign: the days and times of day its ads are allowed to serve, each with an optional bid adjustment. This replaces the campaign's whole schedule — every window it should serve in must be listed in one call, because the windows not listed are removed. Times are in the campaign's account time zone. Hours are 24-hour, minutes are limited to 0, 15, 30 and 45, and each window is exclusive of its end time, so 09:00-17:00 serves up to but not including 17:00; use end_hour 24 for the end of the day. Windows for the same day must not overlap, and a day takes at most six of them. A campaign with no ad schedule serves at all times; pass an empty schedule list to clear the schedule and return it to that state. To read the current schedule, query get_data with the campaign_criterion_ad_schedule_day_of_week, campaign_criterion_ad_schedule_start_hour, campaign_criterion_ad_schedule_start_minute, campaign_criterion_ad_schedule_end_hour and campaign_criterion_ad_schedule_end_minute fields.

Set the ad schedule (dayparting) of a Google Ads campaign: the days and times of day its ads are allowed to serve, each with an optional bid adjustment. This replaces the campaign's whole schedule — every window it should serve in must be listed in one call, because the windows not listed are removed. Times are in the campaign's account time zone. Hours are 24-hour, minutes are limited to 0, 15, 30 and 45, and each window is exclusive of its end time, so 09:00-17:00 serves up to but not including 17:00; use end_hour 24 for the end of the day. Windows for the same day must not overlap, and a day takes at most six of them. A campaign with no ad schedule serves at all times; pass an empty schedule list to clear the schedule and return it to that state. To read the current schedule, query get_data with the campaign_criterion_ad_schedule_day_of_week, campaign_criterion_ad_schedule_start_hour, campaign_criterion_ad_schedule_start_minute, campaign_criterion_ad_schedule_end_hour and campaign_criterion_ad_schedule_end_minute fields.

Parameters
campaign_idstringRequiredschedulearrayRequired
Set Target CPA Set the target cost per acquisition on a Google Ads campaign already using Target CPA or Maximize Conversions bidding. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 25_000_000 means 25.00). To switch a campaign to Target CPA bidding, use set_campaign_bidding_strategy with strategy='target_cpa' instead.

Set the target cost per acquisition on a Google Ads campaign already using Target CPA or Maximize Conversions bidding. The amount is in micros of the account currency (1,000,000 micros = 1 unit, e.g. 25_000_000 means 25.00). To switch a campaign to Target CPA bidding, use set_campaign_bidding_strategy with strategy='target_cpa' instead.

Parameters
campaign_idstringRequiredtarget_cpa_microsintegerRequired
Rename Campaign Change the name of an existing Google Ads campaign. Only the name changes: budget, bidding, targeting, status, ad groups and ads are all left as they are, and historical reporting stays attached to the campaign because reports key on the campaign id. Campaign names must be unique within the account, so renaming to a name another campaign already uses is rejected. To rename an ad group instead, use the rename_ad_group action.

Change the name of an existing Google Ads campaign. Only the name changes: budget, bidding, targeting, status, ad groups and ads are all left as they are, and historical reporting stays attached to the campaign because reports key on the campaign id. Campaign names must be unique within the account, so renaming to a name another campaign already uses is rejected. To rename an ad group instead, use the rename_ad_group action.

Parameters
namestringRequiredcampaign_idstringRequired
Rename Ad Group Change the name of an existing Google Ads ad group. Only the name changes: bids, targeting, status, keywords and ads are all left as they are, and historical reporting stays attached to the ad group because reports key on the ad group id. Ad group names must be unique within their campaign, so renaming to a name another ad group in the same campaign already uses is rejected. To rename a campaign instead, use the rename_campaign action.

Change the name of an existing Google Ads ad group. Only the name changes: bids, targeting, status, keywords and ads are all left as they are, and historical reporting stays attached to the ad group because reports key on the ad group id. Ad group names must be unique within their campaign, so renaming to a name another ad group in the same campaign already uses is rejected. To rename a campaign instead, use the rename_campaign action.

Parameters
namestringRequiredad_group_idstringRequired
Set Target ROAS Set the target return on ad spend on a Google Ads campaign already using Target ROAS or Maximize Conversion Value bidding. The value is a ratio of conversion value to spend, not a percentage (e.g. 4.0 means 400% ROAS). To switch a campaign to Target ROAS bidding, use set_campaign_bidding_strategy with strategy='target_roas' instead.

Set the target return on ad spend on a Google Ads campaign already using Target ROAS or Maximize Conversion Value bidding. The value is a ratio of conversion value to spend, not a percentage (e.g. 4.0 means 400% ROAS). To switch a campaign to Target ROAS bidding, use set_campaign_bidding_strategy with strategy='target_roas' instead.

Parameters
campaign_idstringRequiredtarget_roasnumberRequired
Create Customer Match List Create an empty Google Ads Customer Match user list (CRM-based, with CONTACT_INFO as the upload key type — email, phone, or mailing address) that can then be populated with upload_customer_match_list. Returns the numeric user_list_id to pass to that action. membership_life_span_days controls how long an uploaded member remains in the list before Google auto-removes it: 1-540 for a fixed lifespan, or 10000 as Google's sentinel value for 'no expiration'. The account must be enrolled in Customer Match; if it is not, creation fails with a policy error and no list is created.

Create an empty Google Ads Customer Match user list (CRM-based, with CONTACT_INFO as the upload key type — email, phone, or mailing address) that can then be populated with upload_customer_match_list. Returns the numeric user_list_id to pass to that action. membership_life_span_days controls how long an uploaded member remains in the list before Google auto-removes it: 1-540 for a fixed lifespan, or 10000 as Google's sentinel value for 'no expiration'. The account must be enrolled in Customer Match; if it is not, creation fails with a policy error and no list is created.

Parameters
namestringRequireddescriptionstringmembership_life_span_daysinteger
Attach User List to Ad Group Attach a Customer Match user list to a Google Ads ad group so the ad group can target or exclude users in that list. Pass exclude=false (default) to add the list as a positive audience criterion, or exclude=true to add it as a negative criterion (never show ads to users in the list — commonly used to suppress existing customers). This action is idempotent: attaching a list that is already attached with the same exclude value is a no-op and returns the existing criterion. Attaching with a different exclude value than the current attachment returns an error — detach first, then re-attach. targeting_mode controls whether the list narrows delivery for the ad group ('targeting') or is only used for reporting and bidding ('observation'). Passing 'targeting' or 'observation' updates the ad group's AUDIENCE target_restriction; other target_restrictions (e.g. DEMOGRAPHIC) are preserved. Passing 'unchanged' (default) leaves targeting_setting untouched; note the setting is ad-group-wide, so changing it affects ALL audience criteria on the ad group, not just the list being attached. Negative (exclude=true) criteria always apply regardless of targeting_setting. Scope: this action is for AD-GROUP-level audiences only; campaign-level audience criteria and Performance Max audience signals use different APIs and are not supported here.

Attach a Customer Match user list to a Google Ads ad group so the ad group can target or exclude users in that list. Pass exclude=false (default) to add the list as a positive audience criterion, or exclude=true to add it as a negative criterion (never show ads to users in the list — commonly used to suppress existing customers). This action is idempotent: attaching a list that is already attached with the same exclude value is a no-op and returns the existing criterion. Attaching with a different exclude value than the current attachment returns an error — detach first, then re-attach. targeting_mode controls whether the list narrows delivery for the ad group ('targeting') or is only used for reporting and bidding ('observation'). Passing 'targeting' or 'observation' updates the ad group's AUDIENCE target_restriction; other target_restrictions (e.g. DEMOGRAPHIC) are preserved. Passing 'unchanged' (default) leaves targeting_setting untouched; note the setting is ad-group-wide, so changing it affects ALL audience criteria on the ad group, not just the list being attached. Negative (exclude=true) criteria always apply regardless of targeting_setting. Scope: this action is for AD-GROUP-level audiences only; campaign-level audience criteria and Performance Max audience signals use different APIs and are not supported here.

Parameters
ad_group_idstringRequireduser_list_idstringRequiredexcludebooleantargeting_modestring
Upload Customer Match List Upload contact records (email, phone, or mailing address) to a Google Ads Customer Match user list for audience targeting. The user list must already exist in Google Ads; pass its numeric id as user_list_id. If you do not have one yet, call create_customer_match_list first to create an empty list and get its id. Uploads go through Google's Data Manager API (https://developers.google.com/data-manager/api/devguides/audiences/google-ads/customer-match), which requires the Google Ads account to have been authorised with the ``https://www.googleapis.com/auth/datamanager`` OAuth scope; the action returns a clear error if the scope is missing. This action is ASYNCHRONOUS: it returns immediately with a request_id once Google has accepted the request. Google then matches the records against signed-in users in the background — this typically takes a few minutes but can take up to 24 hours for large lists. The user list is NOT usable for targeting until matching completes. To check progress, call get_customer_match_upload_status with the returned request_id. Poll no more than once every 60 seconds. The job is done when status is SUCCESS, PARTIAL_SUCCESS, or FAILED; while it is PROCESSING keep polling. PII HANDLING: emails, phone numbers, and names are normalized and SHA-256 hashed by this action before being sent to Google — do NOT pre-hash them; pass raw values. operation_type=add appends records to the list; operation_type=remove removes matching records (use for compliance requests such as GDPR erasure). At most 10,000 records per call; split larger uploads into multiple calls.

Upload contact records (email, phone, or mailing address) to a Google Ads Customer Match user list for audience targeting. The user list must already exist in Google Ads; pass its numeric id as user_list_id. If you do not have one yet, call create_customer_match_list first to create an empty list and get its id. Uploads go through Google's Data Manager API (https://developers.google.com/data-manager/api/devguides/audiences/google-ads/customer-match), which requires the Google Ads account to have been authorised with the ``https://www.googleapis.com/auth/datamanager`` OAuth scope; the action returns a clear error if the scope is missing. This action is ASYNCHRONOUS: it returns immediately with a request_id once Google has accepted the request. Google then matches the records against signed-in users in the background — this typically takes a few minutes but can take up to 24 hours for large lists. The user list is NOT usable for targeting until matching completes. To check progress, call get_customer_match_upload_status with the returned request_id. Poll no more than once every 60 seconds. The job is done when status is SUCCESS, PARTIAL_SUCCESS, or FAILED; while it is PROCESSING keep polling. PII HANDLING: emails, phone numbers, and names are normalized and SHA-256 hashed by this action before being sent to Google — do NOT pre-hash them; pass raw values. operation_type=add appends records to the list; operation_type=remove removes matching records (use for compliance requests such as GDPR erasure). At most 10,000 records per call; split larger uploads into multiple calls.

Parameters
user_list_idstringRequiredoperation_typestringmembersarrayRequiredconsent_ad_user_datastringconsent_ad_personalizationstring
Delete Customer Match List Permanently delete a Google Ads Customer Match user list. Detaches the list from any ad groups or campaigns currently using it as an audience or exclusion criterion and removes all uploaded members. Historical performance data for the list is retained in reports. Cannot be undone; to recover, create a new list and re-upload members. Use with care — deleting a list that is actively targeting a live campaign changes delivery immediately.

Permanently delete a Google Ads Customer Match user list. Detaches the list from any ad groups or campaigns currently using it as an audience or exclusion criterion and removes all uploaded members. Historical performance data for the list is retained in reports. Cannot be undone; to recover, create a new list and re-upload members. Use with care — deleting a list that is actively targeting a live campaign changes delivery immediately.

Parameters
user_list_idstringRequired
Detach User List from Ad Group Remove a Customer Match user list criterion (audience or exclusion) from a Google Ads ad group. Reverses attach_user_list_to_ad_group. Removes both positive (audience) and negative (exclusion) criteria — pass the same ad_group_id and user_list_id used when attaching. Removing a user list stops any targeting or reporting effect it had on future traffic; historical performance data remains in reports. If the list is not currently attached to the ad group, the action returns an error and no changes are made.

Remove a Customer Match user list criterion (audience or exclusion) from a Google Ads ad group. Reverses attach_user_list_to_ad_group. Removes both positive (audience) and negative (exclusion) criteria — pass the same ad_group_id and user_list_id used when attaching. Removing a user list stops any targeting or reporting effect it had on future traffic; historical performance data remains in reports. If the list is not currently attached to the ad group, the action returns an error and no changes are made.

Parameters
ad_group_idstringRequireduser_list_idstringRequired
Get Customer Match Upload Status Check the status of a Customer Match upload request started by upload_customer_match_list. Pass the request_id that action returned. Status is one of PROCESSING, SUCCESS, PARTIAL_SUCCESS, FAILED. PROCESSING means matching is still in progress — poll again in at least 60 seconds. Do NOT poll more frequently; quota is shared with data reads. If still PROCESSING after 24 hours, treat as stuck and contact support. SUCCESS means every uploaded record was accepted; the response includes the record count and match_rate_range, a coarse bucket indicating what fraction of uploaded records were matched to signed-in Google users. A low match rate usually reflects source data quality (invalid or non-Google-account emails/phones), not upload failure. For operation_type=remove requests, SUCCESS means the matching records were removed from the list. PARTIAL_SUCCESS means some records were accepted and others were rejected; the response includes the same counts plus the error message describing which records failed. The list still receives the accepted records. FAILED means the entire request failed with no records ingested; the response includes the reason. Failed requests cannot be resumed; start a new upload after fixing the issue.

Check the status of a Customer Match upload request started by upload_customer_match_list. Pass the request_id that action returned. Status is one of PROCESSING, SUCCESS, PARTIAL_SUCCESS, FAILED. PROCESSING means matching is still in progress — poll again in at least 60 seconds. Do NOT poll more frequently; quota is shared with data reads. If still PROCESSING after 24 hours, treat as stuck and contact support. SUCCESS means every uploaded record was accepted; the response includes the record count and match_rate_range, a coarse bucket indicating what fraction of uploaded records were matched to signed-in Google users. A low match rate usually reflects source data quality (invalid or non-Google-account emails/phones), not upload failure. For operation_type=remove requests, SUCCESS means the matching records were removed from the list. PARTIAL_SUCCESS means some records were accepted and others were rejected; the response includes the same counts plus the error message describing which records failed. The list still receives the accepted records. FAILED means the entire request failed with no records ingested; the response includes the reason. Failed requests cannot be resumed; start a new upload after fixing the issue.

Parameters
request_idstringRequired
Update Ad Group Partially update an existing Google Ads ad group. Provide only the fields to change; at least one besides ad_group_id is required and omitted fields are left untouched. status is 'enabled' or 'paused'; ad_rotation_mode is 'optimize' or 'rotate_forever'. cpc_bid_micros is the default max CPC bid in micros of the account currency (1,000,000 micros = 1 unit, e.g. 2_500_000 means 2.50) and only applies when the parent campaign uses Manual CPC; switch it first via set_campaign_bidding_strategy if it uses Smart Bidding. Budget, target CPA and CPM bids are not editable here. This is a value change with no built-in undo: to reverse it read the current values first (e.g. GAQL 'SELECT ad_group.name, ad_group.status, ad_group.cpc_bid_micros, ad_group.ad_rotation_mode FROM ad_group WHERE ad_group.id = <id>') then call update_ad_group again with the previous values. The single-purpose rename_ad_group, pause_ad_group/enable_ad_group and set_max_cpc actions still exist; prefer them for one change and use update_ad_group to change several fields at once.

Partially update an existing Google Ads ad group. Provide only the fields to change; at least one besides ad_group_id is required and omitted fields are left untouched. status is 'enabled' or 'paused'; ad_rotation_mode is 'optimize' or 'rotate_forever'. cpc_bid_micros is the default max CPC bid in micros of the account currency (1,000,000 micros = 1 unit, e.g. 2_500_000 means 2.50) and only applies when the parent campaign uses Manual CPC; switch it first via set_campaign_bidding_strategy if it uses Smart Bidding. Budget, target CPA and CPM bids are not editable here. This is a value change with no built-in undo: to reverse it read the current values first (e.g. GAQL 'SELECT ad_group.name, ad_group.status, ad_group.cpc_bid_micros, ad_group.ad_rotation_mode FROM ad_group WHERE ad_group.id = <id>') then call update_ad_group again with the previous values. The single-purpose rename_ad_group, pause_ad_group/enable_ad_group and set_max_cpc actions still exist; prefer them for one change and use update_ad_group to change several fields at once.

Parameters
ad_group_idstringRequirednamestringstatusstringcpc_bid_microsstringad_rotation_modestring
Rename Customer Match List Change the display name of a Google Ads Customer Match user list. Does not affect membership, campaign attachments, targeting behaviour, or the list's configuration — only the name shown in the Google Ads UI and reports. Names must be unique per account; Google returns an error if another list already uses the requested name.

Change the display name of a Google Ads Customer Match user list. Does not affect membership, campaign attachments, targeting behaviour, or the list's configuration — only the name shown in the Google Ads UI and reports. Names must be unique per account; Google returns an error if another list already uses the requested name.

Parameters
user_list_idstringRequirednamestringRequired
Set Campaign Geo Targeting Set the geographic targeting of a Google Ads campaign: the countries, regions or cities its ads may serve in, plus optional radius (proximity) areas. Give the complete set of locations to target or exclude in one call; a location currently targeted but left out of the call is removed, and each location may be listed only once. Locations are identified by their numeric geo target constant id (e.g. 2840 for the United States); set a location's 'negative' flag to exclude it (for example target a country but exclude a state), and give targeted locations or proximities an optional bid_modifier between 0.1 and 10.0 (1.0 leaves bids unchanged; excluded locations may not have one). Re-running keeps the locations that stay in the set and updates their bid modifier, but a location cannot be switched between targeted and excluded in one call: omit it to remove it, then add it back the other way in a later call. A proximity area is a point (latitude, longitude) and a radius in miles or kilometers; proximity areas can only be targeted, not excluded, and are replaced as a whole on each call. Passing empty location and proximity lists clears the campaign's geo targeting so its ads can serve in all locations. To read the current geo targeting, query get_data with the criteria_type, campaign_criterion_location_geo_target_constant, campaign_criterion_negative, campaign_criterion_bid_modifier, campaign_criterion_proximity_geo_point_latitude_in_micro_degrees, campaign_criterion_proximity_geo_point_longitude_in_micro_degrees, campaign_criterion_proximity_radius and campaign_criterion_proximity_radius_units fields.

Set the geographic targeting of a Google Ads campaign: the countries, regions or cities its ads may serve in, plus optional radius (proximity) areas. Give the complete set of locations to target or exclude in one call; a location currently targeted but left out of the call is removed, and each location may be listed only once. Locations are identified by their numeric geo target constant id (e.g. 2840 for the United States); set a location's 'negative' flag to exclude it (for example target a country but exclude a state), and give targeted locations or proximities an optional bid_modifier between 0.1 and 10.0 (1.0 leaves bids unchanged; excluded locations may not have one). Re-running keeps the locations that stay in the set and updates their bid modifier, but a location cannot be switched between targeted and excluded in one call: omit it to remove it, then add it back the other way in a later call. A proximity area is a point (latitude, longitude) and a radius in miles or kilometers; proximity areas can only be targeted, not excluded, and are replaced as a whole on each call. Passing empty location and proximity lists clears the campaign's geo targeting so its ads can serve in all locations. To read the current geo targeting, query get_data with the criteria_type, campaign_criterion_location_geo_target_constant, campaign_criterion_negative, campaign_criterion_bid_modifier, campaign_criterion_proximity_geo_point_latitude_in_micro_degrees, campaign_criterion_proximity_geo_point_longitude_in_micro_degrees, campaign_criterion_proximity_radius and campaign_criterion_proximity_radius_units fields.

Parameters
campaign_idstringRequiredlocationsarrayproximitiesarray

FAQs

What's the fastest way to get Google Ads data into Claude?

Windsor MCP: 60-second setup at onboard.windsor.ai, then your data is live in every Claude conversation permanently. The alternative is downloading CSVs from Google Ads and uploading them manually, which gives you stale data, no cross-account joins, and no cross-source blending. The API route gives you full flexibility but requires engineering work and ongoing maintenance.

Tired of juggling fragmented data? Get started with Windsor.ai today to create a single source of truth

Let us help you automate data integration and AI-driven insights, so you can focus on what matters, growth strategy.
g logo
fb logo
big query data
youtube logo
power logo
looker logo