calendar Last updated: 11 November 2026
Data integration
Data Pipelines
Google Ads
How to's

How to Connect Google Ads to ChatGPT (1-Min Setup via Windsor.ai Native App)

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!

You can connect Google Ads to ChatGPT in two no-code steps: connect your Google Ads account in Windsor.ai, then add the Windsor.ai plugin in ChatGPT. ChatGPT then reads your campaign, keyword and search term data when you ask. Google’s own route is an open-source MCP server that you run yourself; it has no tools to pause campaigns or change budgets and bids.

The account is full of data: spend, impressions, conversions, Quality Scores, search terms, device splits, and hundreds of other metrics. Yet, getting a clear picture of what’s really happening usually means hopping between campaign views, building custom reports, and exporting CSVs.

Understanding why performance changed, which campaigns are wasting budget, which keywords are raising your CPA, and what to do next: that analysis still takes time.

🔗 Connect your Google Ads account: https://onboard.windsor.ai/app/google_ads.

Once connected, you can ask ChatGPT questions that go far beyond your Google Ads dashboard:

  • Which campaigns are spending the most but generating zero conversions this month?
  • Where is my budget being lost to low-quality search terms?
  • Which keywords with a Quality Score below 5 cost me the most?
  • How does my ROAS compare across campaign types, Search, Shopping, Performance Max?
  • What is my true ROAS by acquisition channel when Google Ads is blended with Meta and Shopify revenue?

Combining sources needs a paid plan. The free forever plan includes 1 data source.

And beyond analysis, the Windsor.ai plugin allows you to execute changes directly from ChatGPT. Find high CPA campaigns, wasted spend, or low-performing keywords, then pause or reallocate budget to top performers, without switching to Google Ads.

Steps to connect Google Ads to ChatGPT with the Windsor.ai plugin

The Google Ads to ChatGPT integration via Windsor takes two simple steps and requires no technical setup. The whole setup takes about a minute. For the short overview, see the Google Ads to ChatGPT integration page.

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

Prerequisites

Before connecting Google Ads to ChatGPT, make sure you have:

  • An active Windsor.ai account. The free forever plan covers 1 user, 1 data source and 1 account with the last 30 days of data, and needs no credit card. Paid plans start at $19/month for 3 sources, billed annually (pricing).
  • A Google Ads account (with at least Read-only access). Write actions need Standard or Admin access.
  • An active ChatGPT account. We used ChatGPT’s Free plan for the steps on this page. In a Business, Enterprise or Edu workspace, an admin can turn plugins on or off.

Step 1. Connect Google Ads to Windsor

Go to onboard.windsor.ai/app/google_ads and connect Google Ads as your data source.

Sign in with the Google account that has access to your Ads account and approve the connection. Select the account(s) you want to pull data from. Connecting multiple accounts lets you perform cross-account analysis inside a single ChatGPT conversation. Tracking more than one account needs a paid plan. The free forever plan includes 1 account.

connect google ads to windsor

Windsor will pull your campaign data directly from the Google Ads API and normalize it in the background, making it structured and analysis-ready before it reaches ChatGPT.

Step 2. Add the Windsor.ai plugin in ChatGPT

Open the Windsor.ai plugin page in ChatGPT and select Install plugin. You can also click Plugins in the ChatGPT sidebar and search for Windsor.ai.

Windsor.ai plugin page in ChatGPT with the Install plugin button

Complete the setup by granting ChatGPT access to your Windsor.ai account. To disconnect later, open Settings, then Plugins.

The Windsor.ai plugin is now connected. To confirm everything is working, start a new chat, click + and choose Windsor.ai (or type @Windsor), and run a quick test with the prompt:

List the data sources connected to my Windsor account.
Do you see Google Ads there?

Once ChatGPT recognizes your Google Ads data, you’re ready to start querying it in natural language. No ongoing maintenance is required.
Want the full walkthrough with real example prompts for pausing campaigns, shifting budget, changing bidding strategy, and managing Customer Match audiences? See ‘How to manage Google Ads campaigns from ChatGPT.’

The Google Ads connector has 34 write actions (write actions list): pause or enable a campaign, ad group, or ad; create a campaign, ad group, responsive search ad, or ad asset; rename a campaign or ad group, or update an ad group’s settings; set a campaign’s budget, bidding strategy, target CPA, target ROAS or CPC bid ceiling, and an ad group’s max CPC; set a campaign’s locations, languages and ad schedule; push, update or remove keywords, and push or remove negative keywords; and create, fill, rename, delete, attach or detach Customer Match audience lists.

Example: our top Google Ads campaigns by clicks in ChatGPT

We asked ChatGPT, through the Windsor.ai plugin: “For my Google Ads account windsor-main, which 5 campaigns got the most clicks in the last 30 days (6 October to 4 November 2026)? For each one, show only clicks, impressions and CTR.”

ChatGPT answer listing the top 5 Google Ads campaigns by clicks with impressions and CTR, via the Windsor.ai plugin

Our brand search campaign led with 3,660 clicks from 9,800 impressions, a CTR of 37.35%. The Performance Max campaign had the most impressions (179,115) and the lowest CTR of the five, 0.88%.

We checked the totals in a second question in the same chat (11 campaigns, 11,108 clicks, 378,728 impressions) and against the same data pulled from Windsor.ai directly.

Is there an official Google Ads app for ChatGPT?

No, as far as we could find. Google has no Google Ads plugin in ChatGPT’s Plugins directory. These are the routes that work, and when each fits:

  • Windsor.ai plugin: reads your campaigns, keywords, search terms and Quality Scores when you ask, and runs the 34 Google Ads write actions after you confirm each change. It fits ongoing questions, changes from the chat, and Google Ads next to other sources.
  • Google Ads MCP server: Google’s open-source Google Ads MCP server runs on your side, with a Google Cloud project and your own API credentials. It queries the account with GAQL and can create assets and manage labels; it has no tools to pause campaigns or change budgets and bids. In ChatGPT, a server like this is added as a custom MCP server from Plugins. Full support, including tools that change data, is limited to Business, Enterprise and Edu workspaces; Pro gets read and fetch tools only. It fits teams with developers who want GAQL access from the chat.
  • Third-party plugins: other vendors publish Google Ads plugins for ChatGPT, for example Supermetrics.
  • CSV export: download a Google Ads report and upload it to a chat. It fits a one-off question about one report.
  • Google Sheets: send Google Ads data to a sheet on a schedule with Windsor.ai and point ChatGPT or a dashboard at that copy. It fits shared reports that keep their own history.

What Google Ads data Windsor sends to ChatGPT

Windsor connects to the Google Ads API and gives ChatGPT access to 2,542 Google Ads fields (495 metrics and 2,047 dimensions). View the full list of supported data fields.

The most commonly used fields in real performance analysis, and what ChatGPT can answer with them:

  • Campaign performance: Cost, conversions, conversion value, ROAS, CPA, impressions, clicks, CTR: the core efficiency metrics at the campaign level
  • Ad group & keyword data: Keyword-level CPA, CPC, Quality Score, match type, search term report
  • Search terms: Actual queries triggering your ads: the dataset for negative keyword identification and match type analysis
  • Quality Score components: Quality Score (1 to 10), Expected CTR rating, Ad Relevance rating, Landing Page Experience rating: the three components Google rates for each keyword
  • Bidding & budget: Campaign budget, impression share lost to budget, impression share lost to rank, bidding strategy type: for budget allocation and bid strategy decisions
  • Audience segments: In-market audiences, remarketing lists, customer match, similar audiences: performance and CPA by audience layer
  • Device & time: Device split (mobile/desktop/tablet), hour of day, day of week: for dayparting and device bid adjustments
  • Asset groups (PMax): Performance Max asset group performance, cost and conversions per asset group: the closest thing to transparency inside PMax
  • Shopping & product data: Product ID, product title, product category: for Shopping and PMax product-level performance analysis
  • Conversion actions: Conversion action name and count: breakdown of form fills vs. calls vs. purchases vs. other conversion types

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

The use cases and prompts below cover the most common and valuable Google Ads analysis workflows.

To jumpstart, just replace campaign names, targets, and thresholds with the values from your own account.

🤖 For more prompt ideas across Google Ads and other data sources, visit windsor.ai/prompt-library/.

1. Finding budget waste: where spend isn’t delivering results

Budget waste in Google Ads is rarely visible at the campaign level; it hides in specific keywords, match types, and search terms that accumulate spend over weeks.

ChatGPT can surface it across your entire account with a single prompt.

Detect keywords with spend but zero conversions

Prompt:

Pull all keywords with more than $50 in spend and zero conversions in the last 30 days.

For each keyword, show:
- keyword_text, match_type, campaign_name, ad_group_name
- cost, impressions, clicks, ctr
- average_cpc, quality_score

Sort by cost descending (these are our clearest budget waste candidates).

For the top 20 by spend: are any currently in campaigns using Max Conversions bidding?
(If so, the algorithm may be bidding aggressively on terms it can't convert. Flag them for bid strategy review.)

Search term analysis: which queries trigger your ads

Prompt:

From the search term report for the last 30 days, show all search terms with more than $20 in spend.

For each term, show:
- search_term, campaign_name, ad_group_name, match_type
- cost, conversions, conversion_rate, cost_per_conversion

Group into three buckets:
1. High performers: conversion_rate above account average
2. Zero converters: spend > $20, zero conversions
3. Irrelevant terms: search terms that clearly don't match the advertised product or service (flag based on content mismatch)

For bucket 2 and 3, what negative keywords should be added to prevent future spend on these queries?

2. Evaluating Quality Score and CPC efficiency

Quality Score is Google’s 1 to 10 rating of how your ads and landing pages compare with other advertisers’ for each keyword. Google calls it a diagnostic tool, not an input in the ad auction, and builds it from three components: expected CTR, ad relevance and landing page experience (Google Ads Help).

ChatGPT can triage your entire keyword list by QS component and tell you where to focus.

Quality Score triage across the account

Prompt:

Pull all keywords with quality_score of 5 or below, with more than $30 in spend in the last 30 days.

For each keyword show:
- keyword_text, campaign_name, ad_group_name
- quality_score, search_predicted_ctr, creative_quality_score, post_click_quality_score
- cost, average_cpc

For the top 20 by spend:
- What is the most common failing component (expected CTR, ad relevance, or landing page experience)?
- Group by primary failure type
- If landing page experience is the common issue, list the affected campaigns and ad groups (this suggests a structural mismatch between ad copy and destination page)

3. Analyzing ROAS and campaign performance: finding what’s working

Understanding which campaigns are truly profitable goes beyond just looking at spend and conversions. True ROAS accounts for all revenue sources and accurately measures which campaigns are generating value.

ChatGPT can rank your campaigns by true ROAS and highlight where budget is most efficiently spent, so you know what’s working and what’s dragging down performance.

Campaign performance ranked by true ROAS

Prompt:

For all active campaigns in the last 30 days, show:
- campaign_name, campaign_type (Search, Shopping, PMax, Display, Video)
- cost, conversions, conversion_value
- roas (conversion_value / cost)
- cpa (cost / conversions)
- search_impression_share, search_budget_lost_impression_share, search_rank_lost_impression_share

Rank by ROAS descending.

Which campaigns are above your target ROAS but losing impression share due to budget? (These are our highest-priority candidates for budget reallocation)
Which campaigns are below target ROAS AND losing impression share to rank? (Those need both bid and quality work before more budget helps)

Performance Max transparency: what’s driving results inside your PMax campaigns

Prompt:

For all Performance Max campaigns, break down performance by asset group:
- asset_group_name, cost, conversions, conversion_value, roas

Which asset groups are below our target ROAS?
Which asset groups account for more than 50% of PMax spend?

Also pull top products within PMax campaigns (if Shopping feed is connected):
- product_item_id, product_title, cost, conversions

Flag any product that has spent more than $50 with zero conversions in the last 14 days (these products may need to be excluded from PMax or given dedicated Shopping campaigns with tighter controls.)

4. Estimating B2B and lead generation: connecting Google Ads to pipeline quality

For B2B teams, Google Ads conversions are form fills. B2B teams need to know which campaigns produce a qualified pipeline, and at what cost.

🔗 Connect Windsor with your CRM (HubSpot, Salesforce, etc.) data alongside Google Ads for full-funnel reporting.

Cost per qualified lead by campaign

Prompt:

Join Google Ads campaign data (campaign_name, cost, conversions) with CRM lead data using utm_campaign as the join key.

For each campaign, show:
- Total ad spend
- Total leads (Google Ads conversions)
- Leads that progressed to SQL stage (from CRM)
- SQL conversion rate
- Cost per SQL (spend/SQLs)
- Average deal value of opportunities from this campaign

Rank by cost per SQL ascending.

Which campaigns produce cheap leads that never qualify?
Which have fewer total conversions but a high SQL rate? (Our highest-quality traffic sources)

Combining sources needs a paid plan. The free forever plan includes 1 data source.

5. Agency use: cross-account analysis and client reporting

For agencies managing multiple Google Ads accounts, Windsor connects at the MCC level; all accounts are available in a single ChatGPT conversation for cross-account comparison and portfolio-level analysis. You can also filter by a specific account to generate separate reports. Tracking more than one account needs a paid plan. The free forever plan includes 1 account.

Cross-account budget pacing and anomaly detection

Prompt:

For each connected Google Ads account, pull campaign, budget_amount and cost by date for this month so far.

Calculate projected month-end spend at 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 (this usually signals a bidding anomaly or an accidental budget increase).

Client performance narrative for monthly reporting

Prompt:

Using Google Ads data for [client name] for this month vs. last month:

Compare: cost, impressions, clicks, ctr, conversions, cpa, conversion_value, roas.

Write a 3-paragraph client performance summary that:

1. Leads with the headline result: better or worse efficiency, and by how much
2. Explains the two biggest drivers of that change at campaign or ad group level
3. Gives one specific recommendation for next month with expected impact

Write for a non-technical client who cares about results.

No raw numbers in isolation: provide context.

Prompts that cover more than 30 days need a paid plan. The free forever plan includes the last 30 days.

Bonus: Blending Google Ads with other data sources in ChatGPT

Questions about whether ad spend brings revenue, how Google compares with other channels, and what customers do after they convert need data from outside Google Ads.

🔗 With Windsor, you can connect all your business and marketing tools (350+ sources supported), giving you a complete cross-channel overview in a single chat.

Here are some helpful analytical scenarios with multi-channel data you can try:

  • Google Ads + Meta Ads: Compare efficiency across paid channels in a single conversation. Ask ChatGPT to show blended ROAS and CPA across Google and Meta, with Google’s impression share alongside, and recommend where to shift budget based on performance data from both platforms simultaneously.
  • Google Ads + Shopify or WooCommerce: Google Ads reports conversion value based on what the pixel fires. Your store records actual completed orders. Connect both and ask ChatGPT to reconcile reported ROAS against actual net revenue after returns and failed payments, by campaign and by product category.
  • Google Ads + GA4: Google Ads reports that someone converted. GA4 records what visitors did on your site after the click. Connect both to ask ChatGPT: which campaigns have strong Google Ads CTR but high GA4 bounce rate? Where is there a disconnect between the ad promise and the landing page experience?
  • Google Ads + Salesforce or HubSpot: For B2B teams, the most important analysis is connecting Google Ads spend to the CRM pipeline. Ask ChatGPT to join campaign data with deal data using utm_campaign as the key, calculating cost per SQL, cost per closed deal, and which campaigns produce closed revenue.
  • Google Ads + Google Sheets: Many teams track targets, budget caps, and account notes in spreadsheets. Connect your planning sheets alongside Google Ads data and ask ChatGPT to compare actual pacing against your planned budget allocation, or flag campaigns that have hit their monthly spend cap with days remaining in the period.

Combining sources needs a paid plan. The free forever plan includes 1 data source.

How the Windsor.ai plugin works with Google Ads and ChatGPT

Windsor connects to the Google Ads API and pulls structured campaign data, such as metrics, dimensions, and diagnostic fields, into your ChatGPT conversations through the Windsor.ai plugin.

This is one of the fastest and simplest ways to get your Google Ads data into ChatGPT. There is no export step and no scheduled sync to manage.

Windsor.ai pulls the data from the Google Ads API when you ask. The connection includes:

  • Data when you ask. ChatGPT requests the fields a question needs from Windsor.ai, so you do not export a report first.
  • 2,542 Google Ads fields. Windsor gives ChatGPT access to the full Google Ads data model: campaign structure, performance metrics, Quality Score diagnostics, audience data, asset group breakdowns, and search term reports.
  • Cross-source blending. Windsor connects 350+ data sources. Google Ads data can be analysed alongside Meta Ads, Shopify, GA4, Salesforce, and more in a single ChatGPT conversation.
  • MCC support. If you manage multiple Google Ads accounts through a Manager Account (MCC), Windsor connects at the MCC level, making cross-account analysis available in a single chat.
  • Write actions. ChatGPT can make the changes in the write actions list in your Google Ads account, after you confirm each one.

If something does not work

  • A Google Ads account is missing: connect again in Windsor.ai with a Google account that has access to it, and select it in the account list. Tracking more than one account needs a paid plan. The free forever plan includes 1 account.
  • Google keeps asking for a passkey when you connect Google Ads: create one at g.co/passkeys and sign in again. A new passkey can take up to 7 days before Google accepts it. On a Google Workspace account, an admin can turn off the login challenge for your user for 10 minutes. During that window you can approve the passkey and connect. The Google Ads connector setup guide has the steps.
  • ChatGPT answers without your Google Ads data: choose Windsor.ai under + or type @Windsor in that chat, then ask again.
  • Windsor.ai shows “Disabled by admin”: your ChatGPT workspace admin has turned the plugin off. Ask them to enable it.
  • A change is refused for lack of access: the Google account you connected has Read only access; switch to a login with Standard or Admin access.
  • A max CPC change is refused: the ad group’s campaign uses Smart Bidding. Max CPC bids apply under Manual CPC, so switch the campaign’s bidding strategy first or keep the automated bids.
  • Quality Score is empty for a keyword: Google leaves it blank when it does not have enough data, often for keywords with few impressions.

The Google Ads to ChatGPT integration page gives the short answers and a second example, our campaigns compared by cost per conversion.

Conclusion

With Windsor.ai installed, ChatGPT reads your Google Ads campaigns, keywords, search terms and Performance Max asset groups when you ask about them. It can also make changes through write actions, such as pausing a campaign, adding negative keywords or setting a campaign budget.

Add Meta Ads, GA4 or your CRM through the same connection to compare channels, or to see which campaigns brought closed deals, in the same chat.

A weekly Google Ads report can also run without a prompt. In a ChatGPT Business, Enterprise or Edu workspace, a workspace agent can send the weekly Google Ads report to your team on a schedule. Our Claude Cowork vs ChatGPT Work test ran the same scheduled report in both assistants, and both got every total right.

Companies on Gemini Enterprise can follow how to connect Google Ads to Gemini Enterprise.

🚀 Connect Google Ads to ChatGPT with the Windsor.ai plugin in about a minute. Start for free now → onboard.windsor.ai/app/google_ads.


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).

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 'paused' 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.

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.

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.

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.

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.

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.

Parameters
campaign_idstringRequired
Pause 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.

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.

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.

Parameters
ad_group_idstringRequiredupdatesarrayRequired
Enable 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.

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.

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.

Parameters
ad_group_idstringRequiredcriterion_idsarrayRequired
Pause 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).

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

Parameters
campaign_idstringRequiredlocationsarrayproximitiesarray

FAQs

What are the ways to connect Google Ads to ChatGPT?

The main options are:

  • The Windsor.ai plugin for ChatGPT: This is a fully automated, no-code solution for direct integration. Connect your Google Ads account at onboard.windsor.ai, then add the Windsor.ai plugin in ChatGPT. MCC support, and cross-source blending with 350+ other sources. Set up in about a minute.
  • Manual CSV export: Download a Google Ads report as CSV and upload it to ChatGPT. Works for one-off questions, but the data stops at the export date, there is no cross-account analysis, and blending with other sources is not possible.
  • Custom API integration: Build a connection directly to the Google Ads API (using GAQL queries) and pipe data to ChatGPT via a custom script or middleware. Full flexibility but requires engineering work and ongoing maintenance. Google’s open-source Google Ads MCP server is a ready-made version of this route.

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