# AdCopilot documentation Source: https://adcopilot.cloud/docs/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/index.md > AdCopilot is the AI agent that runs your Google Ads. Add one connector to ChatGPT, Claude or any MCP client, sign in with Google, and ask. It changes things only when you ask, and it can never delete. AdCopilot connects the AI assistant you already use to your Google Ads account, and to Google Analytics 4, Search Console and Tag Manager if you connect them. You sign in with your own Google account, then ask in plain words. It reads freely, changes things only when you ask, and it can never delete anything. ## Start here ## What AdCopilot is A hosted connector. There is nothing to install or run. You add one URL, `https://mcp.adcopilot.cloud/mcp`, to your AI client, approve it once, and the assistant can call AdCopilot's tools under your own Google sign-in. * **103 tools on the full tier, whichever products are connected, as of v2.16.0**: 54 for Google Ads, 23 for Google Analytics 4, 6 for Search Console, 18 for Tag Manager, and 2 of AdCopilot's own. A tool for a product you have not connected yet answers with the link to connect it. See the [tool reference](https://adcopilot.cloud/docs/tools). * **It can never delete.** The four Google Ads `remove_*` tools are never exposed, and any change that sets something to `REMOVED` is refused on our server. You pause instead. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). * **You approve each change** in your AI client, and some limits hold on our server whatever the client allows. See [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes) and [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). * **It audits the account itself.** Eleven read-only analysis tools (as of v2.16.0) do the arithmetic on our side and quote the numbers they measured. See [the audit checks](https://adcopilot.cloud/docs/checks/conversion_tracking). * **Plans are sized by Google Ads accounts.** Free is one account. A new workspace starts on a 7-day Pro trial, then moves to Free. See [Billing and plans](https://adcopilot.cloud/docs/guides/billing-and-plans). ## Reading these docs with an AI Every page has **Copy Markdown**, **View as Markdown** and **Open in** ChatGPT, Claude or Perplexity at the top. The whole site is also at [llms.txt](https://adcopilot.cloud/docs/llms.txt) and [llms-full.txt](https://adcopilot.cloud/docs/llms-full.txt). Published by [Atromx Intelligence](https://atromx.com). Not affiliated with, endorsed by, or sponsored by Google, Anthropic, or OpenAI. # Ads and assets Source: https://adcopilot.cloud/docs/checks/ads_assets/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/checks/ads_assets.md > The 16 scored AdCopilot checks and 1 observation in the ads and assets category, with the analysis tools that surface each. Every entry on this page is evaluated deterministically from your own account data — the same rule and the same threshold on every run, with the number it measured quoted back to you. A check that cannot be evaluated is reported as `not_evaluated`, with a reason code, and is excluded from the health score on **both** sides of its ratio. It is never reported as a pass. **Being listed here is not a promise that a given run reached it.** A quick audit evaluates three of the 73 scored checks by design; a deep audit attempts all 73 and reports whatever it could not evaluate. The `coverage` block of any audit names the checks that were not run, and why — read that before reading a result as a clean bill of health. **Surfaced by** names the analysis tools that return this entry's finding. `full_audit` at `depth="deep"` returns all of them. ## Scored checks — 16 of the 73 These are part of the 73-check audit and they move the health score. ### G-AD1 — Ad freshness | Field | Value | | ----------- | -------------------------------- | | Check id | `G-AD1` | | Category | `ads_assets` | | Severity | medium | | Surfaced by | `full_audit`, `rsa_asset_report` | ### G-AD2 — CTR vs industry benchmark | Field | Value | | ----------- | ------------ | | Check id | `G-AD2` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ### G-PM1 — Audience signals configured | Field | Value | | ----------- | ------------ | | Check id | `G-PM1` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ### G-PM2 — PMax Ad Strength | Field | Value | | ----------- | ------------ | | Check id | `G-PM2` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ### G-PM3 — Brand cannibalization | Field | Value | | ----------- | ------------ | | Check id | `G-PM3` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ### G-PM4 — Search themes | Field | Value | | ----------- | ------------ | | Check id | `G-PM4` | | Category | `ads_assets` | | Severity | medium | | Surfaced by | `full_audit` | ### G-PM5 — Negative keywords | Field | Value | | ----------- | ------------ | | Check id | `G-PM5` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ### G26 — RSA per ad group | Field | Value | | ----------- | -------------------------------- | | Check id | `G26` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit`, `rsa_asset_report` | ### G27 — RSA headline count | Field | Value | | ----------- | -------------------------------- | | Check id | `G27` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit`, `rsa_asset_report` | ### G28 — RSA description count | Field | Value | | ----------- | -------------------------------- | | Check id | `G28` | | Category | `ads_assets` | | Severity | medium | | Surfaced by | `full_audit`, `rsa_asset_report` | ### G29 — RSA Ad Strength | Field | Value | | ----------- | -------------------------------- | | Check id | `G29` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit`, `rsa_asset_report` | ### G30 — RSA pinning strategy | Field | Value | | ----------- | -------------------------------- | | Check id | `G30` | | Category | `ads_assets` | | Severity | medium | | Surfaced by | `full_audit`, `rsa_asset_report` | ### G31 — PMax asset group density | Field | Value | | ----------- | ------------ | | Check id | `G31` | | Category | `ads_assets` | | Severity | critical | | Surfaced by | `full_audit` | ### G32 — PMax video assets present | Field | Value | | ----------- | ------------ | | Check id | `G32` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ### G33 — PMax asset group count | Field | Value | | ----------- | ------------ | | Check id | `G33` | | Category | `ads_assets` | | Severity | medium | | Surfaced by | `full_audit` | ### G34 — PMax final URL expansion | Field | Value | | ----------- | ------------ | | Check id | `G34` | | Category | `ads_assets` | | Severity | high | | Surfaced by | `full_audit` | ## Observations — 1, not scored Reported with the same evidence and the same suggested fix as a scored check, but **not** among the 73: an observation never moves the health score, on either side of its ratio. ### O-DISAPPROVED — Disapproved ads | Field | Value | | ----------- | --------------- | | Check id | `O-DISAPPROVED` | | Category | `ads_assets` | | Severity | critical | | Surfaced by | `full_audit` | # Conversion tracking Source: https://adcopilot.cloud/docs/checks/conversion_tracking/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/checks/conversion_tracking.md > The 11 scored AdCopilot checks in the conversion tracking category, with the analysis tools that surface each. Every entry on this page is evaluated deterministically from your own account data — the same rule and the same threshold on every run, with the number it measured quoted back to you. A check that cannot be evaluated is reported as `not_evaluated`, with a reason code, and is excluded from the health score on **both** sides of its ratio. It is never reported as a pass. **Being listed here is not a promise that a given run reached it.** A quick audit evaluates three of the 73 scored checks by design; a deep audit attempts all 73 and reports whatever it could not evaluate. The `coverage` block of any audit names the checks that were not run, and why — read that before reading a result as a clean bill of health. **Surfaced by** names the analysis tools that return this entry's finding. `full_audit` at `depth="deep"` returns all of them. ## Scored checks — 11 of the 73 These are part of the 73-check audit and they move the health score. ### G-CT1 — No duplicate counting | Field | Value | | ----------- | -------------------------------------- | | Check id | `G-CT1` | | Category | `conversion_tracking` | | Severity | critical | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G-CT2 — GA4 linked and flowing | Field | Value | | ----------- | -------------------------------------- | | Check id | `G-CT2` | | Category | `conversion_tracking` | | Severity | high | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G-CT3 — Google Tag firing | Field | Value | | ----------- | -------------------------------------- | | Check id | `G-CT3` | | Category | `conversion_tracking` | | Severity | critical | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G42 — Conversion actions defined | Field | Value | | ----------- | -------------------------------------- | | Check id | `G42` | | Category | `conversion_tracking` | | Severity | critical | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G43 — Enhanced conversions enabled | Field | Value | | ----------- | -------------------------------------- | | Check id | `G43` | | Category | `conversion_tracking` | | Severity | critical | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G44 — Server-side tracking | Field | Value | | ----------- | -------------------------------------- | | Check id | `G44` | | Category | `conversion_tracking` | | Severity | high | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G45 — Consent Mode v2 (EU/EEA) | Field | Value | | ----------- | -------------------------------------- | | Check id | `G45` | | Category | `conversion_tracking` | | Severity | critical | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G46 — Conversion window appropriate | Field | Value | | ----------- | -------------------------------------- | | Check id | `G46` | | Category | `conversion_tracking` | | Severity | medium | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G47 — Micro vs macro separation | Field | Value | | ----------- | -------------------------------------- | | Check id | `G47` | | Category | `conversion_tracking` | | Severity | high | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G48 — Attribution model | Field | Value | | ----------- | -------------------------------------- | | Check id | `G48` | | Category | `conversion_tracking` | | Severity | medium | | Surfaced by | `conversion_setup_audit`, `full_audit` | ### G49 — Conversion value assignment | Field | Value | | ----------- | -------------------------------------- | | Check id | `G49` | | Category | `conversion_tracking` | | Severity | high | | Surfaced by | `conversion_setup_audit`, `full_audit` | # Keywords and Quality Score Source: https://adcopilot.cloud/docs/checks/keywords_qs/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/checks/keywords_qs.md > The 8 scored AdCopilot checks and 3 observations in the keywords and quality score category, with the analysis tools that surface each. Every entry on this page is evaluated deterministically from your own account data — the same rule and the same threshold on every run, with the number it measured quoted back to you. A check that cannot be evaluated is reported as `not_evaluated`, with a reason code, and is excluded from the health score on **both** sides of its ratio. It is never reported as a pass. **Being listed here is not a promise that a given run reached it.** A quick audit evaluates three of the 73 scored checks by design; a deep audit attempts all 73 and reports whatever it could not evaluate. The `coverage` block of any audit names the checks that were not run, and why — read that before reading a result as a clean bill of health. **Surfaced by** names the analysis tools that return this entry's finding. `full_audit` at `depth="deep"` returns all of them. ## Scored checks — 8 of the 73 These are part of the 73-check audit and they move the health score. ### G-KW1 — Zero-impression keywords | Field | Value | | ----------- | --------------------------------------- | | Check id | `G-KW1` | | Category | `keywords_qs` | | Severity | medium | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G-KW2 — Keyword-to-ad relevance | Field | Value | | ----------- | --------------------------------------- | | Check id | `G-KW2` | | Category | `keywords_qs` | | Severity | high | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G20 — Average Quality Score | Field | Value | | ----------- | --------------------------------------- | | Check id | `G20` | | Category | `keywords_qs` | | Severity | high | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G21 — Critical QS keywords | Field | Value | | ----------- | --------------------------------------- | | Check id | `G21` | | Category | `keywords_qs` | | Severity | critical | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G22 — Expected CTR component | Field | Value | | ----------- | --------------------------------------- | | Check id | `G22` | | Category | `keywords_qs` | | Severity | high | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G23 — Ad relevance component | Field | Value | | ----------- | --------------------------------------- | | Check id | `G23` | | Category | `keywords_qs` | | Severity | high | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G24 — Landing page experience | Field | Value | | ----------- | --------------------------------------- | | Check id | `G24` | | Category | `keywords_qs` | | Severity | high | | Surfaced by | `full_audit`, `quality_score_breakdown` | ### G25 — Top keyword QS | Field | Value | | ----------- | --------------------------------------- | | Check id | `G25` | | Category | `keywords_qs` | | Severity | medium | | Surfaced by | `full_audit`, `quality_score_breakdown` | ## Observations — 3, not scored Reported with the same evidence and the same suggested fix as a scored check, but **not** among the 73: an observation never moves the health score, on either side of its ratio. ### O-KWO-1 — Converting search term is not a keyword | Field | Value | | ----------- | ----------------------- | | Check id | `O-KWO-1` | | Category | `keywords_qs` | | Severity | medium | | Surfaced by | `keyword_opportunities` | ### O-KWO-2 — Converting keyword losing impression share to rank | Field | Value | | ----------- | ----------------------- | | Check id | `O-KWO-2` | | Category | `keywords_qs` | | Severity | medium | | Surfaced by | `keyword_opportunities` | ### O-KWO-3 — Negative keyword blocks a converting term | Field | Value | | ----------- | ----------------------- | | Check id | `O-KWO-3` | | Category | `keywords_qs` | | Severity | high | | Surfaced by | `keyword_opportunities` | # Settings and targeting Source: https://adcopilot.cloud/docs/checks/settings_targeting/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/checks/settings_targeting.md > The 18 scored AdCopilot checks and 5 observations in the settings and targeting category, with the analysis tools that surface each. Every entry on this page is evaluated deterministically from your own account data — the same rule and the same threshold on every run, with the number it measured quoted back to you. A check that cannot be evaluated is reported as `not_evaluated`, with a reason code, and is excluded from the health score on **both** sides of its ratio. It is never reported as a pass. **Being listed here is not a promise that a given run reached it.** A quick audit evaluates three of the 73 scored checks by design; a deep audit attempts all 73 and reports whatever it could not evaluate. The `coverage` block of any audit names the checks that were not run, and why — read that before reading a result as a clean bill of health. **Surfaced by** names the analysis tools that return this entry's finding. `full_audit` at `depth="deep"` returns all of them. ## Scored checks — 18 of the 73 These are part of the 73-check audit and they move the health score. ### G36 — Smart bidding strategy active | Field | Value | | ----------- | ----------------------------- | | Check id | `G36` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `bidding_audit`, `full_audit` | ### G37 — Target CPA/ROAS reasonableness | Field | Value | | ----------- | ----------------------------- | | Check id | `G37` | | Category | `settings_targeting` | | Severity | critical | | Surfaced by | `bidding_audit`, `full_audit` | ### G38 — Learning phase status | Field | Value | | ----------- | ----------------------------- | | Check id | `G38` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `bidding_audit`, `full_audit` | ### G39 — Budget constrained campaigns | Field | Value | | ----------- | ----------------------------- | | Check id | `G39` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `budget_pacing`, `full_audit` | ### G40 — Manual CPC justification | Field | Value | | ----------- | ----------------------------- | | Check id | `G40` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `bidding_audit`, `full_audit` | ### G41 — Portfolio bid strategies | Field | Value | | ----------- | ----------------------------- | | Check id | `G41` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `bidding_audit`, `full_audit` | ### G50 — Sitelink extensions | Field | Value | | ----------- | -------------------- | | Check id | `G50` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `full_audit` | ### G51 — Callout extensions | Field | Value | | ----------- | -------------------- | | Check id | `G51` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `full_audit` | ### G52 — Structured snippets | Field | Value | | ----------- | -------------------- | | Check id | `G52` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `full_audit` | ### G53 — Image extensions | Field | Value | | ----------- | -------------------- | | Check id | `G53` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `full_audit` | ### G54 — Call extensions (if applicable) | Field | Value | | ----------- | -------------------- | | Check id | `G54` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `full_audit` | ### G55 — Lead form extensions | Field | Value | | ----------- | -------------------- | | Check id | `G55` | | Category | `settings_targeting` | | Severity | low | | Surfaced by | `full_audit` | ### G56 — Audience segments applied | Field | Value | | ----------- | -------------------- | | Check id | `G56` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `full_audit` | ### G57 — Customer Match lists | Field | Value | | ----------- | -------------------- | | Check id | `G57` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `full_audit` | ### G58 — Placement exclusions | Field | Value | | ----------- | -------------------- | | Check id | `G58` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `full_audit` | ### G59 — Landing page mobile speed | Field | Value | | ----------- | -------------------- | | Check id | `G59` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `full_audit` | ### G60 — Landing page relevance | Field | Value | | ----------- | -------------------- | | Check id | `G60` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `full_audit` | ### G61 — Landing page schema markup | Field | Value | | ----------- | -------------------- | | Check id | `G61` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `full_audit` | ## Observations — 5, not scored Reported with the same evidence and the same suggested fix as a scored check, but **not** among the 73: an observation never moves the health score, on either side of its ratio. ### O-DOW-1 — Unprofitable day-part | Field | Value | | ----------- | -------------------- | | Check id | `O-DOW-1` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `day_of_week` | ### O-DOW-2 — Underserved day-part | Field | Value | | ----------- | -------------------- | | Check id | `O-DOW-2` | | Category | `settings_targeting` | | Severity | low | | Surfaced by | `day_of_week` | ### O-PACE-OVER — Projected to overspend this month | Field | Value | | ----------- | ----------------------------- | | Check id | `O-PACE-OVER` | | Category | `settings_targeting` | | Severity | high | | Surfaced by | `budget_pacing`, `full_audit` | ### O-PACE-UNDER — Projected to underspend this month | Field | Value | | ----------- | ----------------------------- | | Check id | `O-PACE-UNDER` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `budget_pacing`, `full_audit` | ### O-SPEND-VS-CAP — Spend against plan cap | Field | Value | | ----------- | -------------------- | | Check id | `O-SPEND-VS-CAP` | | Category | `settings_targeting` | | Severity | medium | | Surfaced by | `full_audit` | # Account structure Source: https://adcopilot.cloud/docs/checks/structure/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/checks/structure.md > The 12 scored AdCopilot checks in the account structure category, with the analysis tools that surface each. Every entry on this page is evaluated deterministically from your own account data — the same rule and the same threshold on every run, with the number it measured quoted back to you. A check that cannot be evaluated is reported as `not_evaluated`, with a reason code, and is excluded from the health score on **both** sides of its ratio. It is never reported as a pass. **Being listed here is not a promise that a given run reached it.** A quick audit evaluates three of the 73 scored checks by design; a deep audit attempts all 73 and reports whatever it could not evaluate. The `coverage` block of any audit names the checks that were not run, and why — read that before reading a result as a clean bill of health. **Surfaced by** names the analysis tools that return this entry's finding. `full_audit` at `depth="deep"` returns all of them. ## Scored checks — 12 of the 73 These are part of the 73-check audit and they move the health score. ### G01 — Campaign naming convention | Field | Value | | ----------- | ------------ | | Check id | `G01` | | Category | `structure` | | Severity | medium | | Surfaced by | `full_audit` | ### G02 — Ad group naming convention | Field | Value | | ----------- | ------------ | | Check id | `G02` | | Category | `structure` | | Severity | medium | | Surfaced by | `full_audit` | ### G03 — Single theme ad groups | Field | Value | | ----------- | ------------ | | Check id | `G03` | | Category | `structure` | | Severity | high | | Surfaced by | `full_audit` | ### G04 — Campaign count per objective | Field | Value | | ----------- | ------------ | | Check id | `G04` | | Category | `structure` | | Severity | high | | Surfaced by | `full_audit` | ### G05 — Brand vs Non-Brand separation | Field | Value | | ----------- | ------------ | | Check id | `G05` | | Category | `structure` | | Severity | critical | | Surfaced by | `full_audit` | ### G06 — PMax present for eligible accounts | Field | Value | | ----------- | ------------ | | Check id | `G06` | | Category | `structure` | | Severity | medium | | Surfaced by | `full_audit` | ### G07 — Search + PMax overlap | Field | Value | | ----------- | ------------ | | Check id | `G07` | | Category | `structure` | | Severity | high | | Surfaced by | `full_audit` | ### G08 — Budget allocation matches priority | Field | Value | | ----------- | ------------ | | Check id | `G08` | | Category | `structure` | | Severity | high | | Surfaced by | `full_audit` | ### G09 — Campaign daily budget vs spend | Field | Value | | ----------- | ------------ | | Check id | `G09` | | Category | `structure` | | Severity | medium | | Surfaced by | `full_audit` | ### G10 — Ad schedule configured | Field | Value | | ----------- | ------------ | | Check id | `G10` | | Category | `structure` | | Severity | low | | Surfaced by | `full_audit` | ### G11 — Geographic targeting accuracy | Field | Value | | ----------- | ------------ | | Check id | `G11` | | Category | `structure` | | Severity | high | | Surfaced by | `full_audit` | ### G12 — Network settings | Field | Value | | ----------- | ------------ | | Check id | `G12` | | Category | `structure` | | Severity | high | | Surfaced by | `full_audit` | # Wasted spend Source: https://adcopilot.cloud/docs/checks/wasted_spend/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/checks/wasted_spend.md > The 8 scored AdCopilot checks and 7 observations in the wasted spend category, with the analysis tools that surface each. Every entry on this page is evaluated deterministically from your own account data — the same rule and the same threshold on every run, with the number it measured quoted back to you. A check that cannot be evaluated is reported as `not_evaluated`, with a reason code, and is excluded from the health score on **both** sides of its ratio. It is never reported as a pass. **Being listed here is not a promise that a given run reached it.** A quick audit evaluates three of the 73 scored checks by design; a deep audit attempts all 73 and reports whatever it could not evaluate. The `coverage` block of any audit names the checks that were not run, and why — read that before reading a result as a clean bill of health. **Surfaced by** names the analysis tools that return this entry's finding. `full_audit` at `depth="deep"` returns all of them. ## Scored checks — 8 of the 73 These are part of the 73-check audit and they move the health score. ### G-WS1 — Zero-conversion keywords | Field | Value | | ----------- | ----------------------------- | | Check id | `G-WS1` | | Category | `wasted_spend` | | Severity | high | | Surfaced by | `analyze_waste`, `full_audit` | ### G13 — Search term audit recency | Field | Value | | ----------- | ------------------------------------ | | Check id | `G13` | | Category | `wasted_spend` | | Severity | critical | | Surfaced by | `analyze_search_terms`, `full_audit` | ### G14 — Negative keyword lists exist | Field | Value | | ----------- | ------------------------------------ | | Check id | `G14` | | Category | `wasted_spend` | | Severity | critical | | Surfaced by | `analyze_search_terms`, `full_audit` | ### G15 — Account-level negatives applied | Field | Value | | ----------- | ------------------------------------ | | Check id | `G15` | | Category | `wasted_spend` | | Severity | high | | Surfaced by | `analyze_search_terms`, `full_audit` | ### G16 — Wasted spend on irrelevant terms | Field | Value | | ----------- | ----------------------------- | | Check id | `G16` | | Category | `wasted_spend` | | Severity | critical | | Surfaced by | `analyze_waste`, `full_audit` | ### G17 — Broad match + smart bidding pairing | Field | Value | | ----------- | ----------------------------- | | Check id | `G17` | | Category | `wasted_spend` | | Severity | critical | | Surfaced by | `analyze_waste`, `full_audit` | ### G18 — Close variant pollution | Field | Value | | ----------- | ------------------------------------ | | Check id | `G18` | | Category | `wasted_spend` | | Severity | high | | Surfaced by | `analyze_search_terms`, `full_audit` | ### G19 — Search term visibility | Field | Value | | ----------- | ------------------------------------ | | Check id | `G19` | | Category | `wasted_spend` | | Severity | medium | | Surfaced by | `analyze_search_terms`, `full_audit` | ## Observations — 7, not scored Reported with the same evidence and the same suggested fix as a scored check, but **not** among the 73: an observation never moves the health score, on either side of its ratio. ### O-LOW-ROAS — Campaign under 1.0 ROAS | Field | Value | | ----------- | --------------- | | Check id | `O-LOW-ROAS` | | Category | `wasted_spend` | | Severity | high | | Surfaced by | `analyze_waste` | ### O-NEG-COMP — Competitor search terms | Field | Value | | ----------- | ---------------------- | | Check id | `O-NEG-COMP` | | Category | `wasted_spend` | | Severity | low | | Surfaced by | `analyze_search_terms` | ### O-NEG-FREE — Free-intent search terms | Field | Value | | ----------- | ------------------------------------ | | Check id | `O-NEG-FREE` | | Category | `wasted_spend` | | Severity | medium | | Surfaced by | `analyze_search_terms`, `full_audit` | ### O-NEG-INFO — Informational search terms | Field | Value | | ----------- | ------------------------------------ | | Check id | `O-NEG-INFO` | | Category | `wasted_spend` | | Severity | medium | | Surfaced by | `analyze_search_terms`, `full_audit` | ### O-NEG-JOB — Job-seeker search terms | Field | Value | | ----------- | ------------------------------------ | | Check id | `O-NEG-JOB` | | Category | `wasted_spend` | | Severity | medium | | Surfaced by | `analyze_search_terms`, `full_audit` | ### O-NEG-USER — Terms you told us never to show for | Field | Value | | ----------- | ---------------------- | | Check id | `O-NEG-USER` | | Category | `wasted_spend` | | Severity | low | | Surfaced by | `analyze_search_terms` | ### O-ZERO-CONV-CAMPAIGN — Campaign spending with no conversions | Field | Value | | ----------- | ---------------------- | | Check id | `O-ZERO-CONV-CAMPAIGN` | | Category | `wasted_spend` | | Severity | high | | Surfaced by | `analyze_waste` | # Accounts and scope Source: https://adcopilot.cloud/docs/concepts/accounts-and-scope/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/concepts/accounts-and-scope.md > Which Google Ads accounts an assistant can act on — what your Google sign-in can open, the accounts you switch on, and the number your plan allows. An assistant can act only on Google Ads accounts that pass three checks, in this order. ## 1. Your Google sign-in can open it AdCopilot runs as you, never above you. If your Google login cannot open an account in the Google Ads interface, AdCopilot cannot reach it either. `list_accessible_customers` returns the accounts your sign-in can reach. An account you can open only through a manager (MCC) account is not in that list, and AdCopilot cannot reach it yet. Giving the assistant the manager account's ID does not change that: the connector never uses a manager ID sent on a call. Email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) with the account's name. ## 2. You switched it on In the dashboard, **Ad accounts** (on the **Google products** page) lists every account your connected Google logins can reach. Only the ones switched **On** are reachable. A call to an account that is switched off is refused, and says where to switch it back on. ## 3. Your plan has room Plans are sized by how many Google Ads accounts you can have switched on at once: | Plan | Accounts | | ------- | -------- | | Free | 1 | | Starter | 3 | | Plus | 10 | | Pro | 50 | If more accounts are switched on than your plan includes, every call is refused until you switch some off or upgrade. See [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps). ## Workspaces A **workspace** holds your connected Google products, the accounts you switched on, your business profile and your teammates. Every workspace uses the same connector URL. When you approve an assistant, the approve page asks which workspace it may use; you can belong to more than one. See [Team and seats](https://adcopilot.cloud/docs/guides/team-and-seats). If an account you expect is missing, see [Account not showing up](https://adcopilot.cloud/docs/troubleshooting/account-not-showing). # Approval-gated writes Source: https://adcopilot.cloud/docs/concepts/approval-gated-writes/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/concepts/approval-gated-writes.md > AdCopilot reads freely and changes things only when you ask. Approval is your AI client's own tool-permission prompt, and a set of limits holds on AdCopilot's server whatever the client allows. AdCopilot draws a line between **reading** your accounts and **changing** them. Reading is free. A change runs only when you ask for it. ## How a change happens 1. **You ask**, or the assistant finds something worth changing. 2. **It proposes** the exact change in plain words: the account, the campaign, ad group, keyword or ad, the change, and what it expects to happen. Money is spelled out, daily with its monthly equivalent. 3. **You say yes.** Your AI client then asks permission to run the tool, and you allow it. 4. **It reports** what changed and how to undo it, which is almost always the opposite call. For example: > Add negative keyword "free" (phrase match) to campaign "Invoicing — Search". > It blocks searches containing "free", which drove $60 of zero-conversion > clicks last month. Tool: `add_negative_keywords`. ## Who does the approving Nothing changes until you allow it in your AI client. The approval is your client's own tool-permission prompt, not a screen AdCopilot shows. If you tell your client to always allow a tool, it will run that tool without asking again. That is why the limits that matter hold on AdCopilot's server, whatever the client does: * **It cannot delete.** See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). * **It cannot publish a Tag Manager container.** Its tag changes wait in a workspace for you to publish. * **It will not switch on a campaign it built for you.** That switch is yours, in Google Ads. * **It asks for your budget before it builds**, and refuses spending past your monthly cap. See [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). * **It only reaches the accounts you switched on**, within what your Google sign-in can open. Every call is written down, refusals included. The dashboard's **Tool calls** page shows them. ## No unattended mode AdCopilot does not change anything on a schedule or while you are away. You can run the read-only daily check-in on a timer from your own AI client (see [The daily routine](https://adcopilot.cloud/docs/guides/daily-routine)); any change it finds is a proposal that waits for you. ## Related * [Read vs write tools](https://adcopilot.cloud/docs/concepts/read-vs-write) * [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete) * [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence) # It can never delete Source: https://adcopilot.cloud/docs/concepts/can-never-delete/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/concepts/can-never-delete.md > AdCopilot exposes no delete tool for any product and refuses any change that sets something to REMOVED. You pause instead. Deleting is something you do yourself, in Google's own interface. AdCopilot can never delete anything. This holds on our server, not in a prompt, so no instruction and no "always allow" setting changes it. ## Google Ads Our fork of Google's Google Ads MCP server implements 47 tools as of v2.16.0. Four of them delete: * `remove_ad` * `remove_keyword` * `remove_campaign_asset` * `remove_asset_from_asset_group` **Those four are never exposed.** They are not in the tool list your assistant receives. The other 43 are, alongside AdCopilot's own eleven read-only analysis tools: 54 Google Ads tools in all, as of v2.16.0. In the Google Ads API a deletion can also be a status change, so any call that would set a status to `REMOVED` is refused before it reaches Google: > Setting status to REMOVED removes the resource, and hosted connectors cannot > delete. Pause it instead, or use the Google Ads interface if you really mean > to remove it. ## Analytics, Search Console and Tag Manager None of the three exposes a delete tool, and a call that would set a status to `REMOVED` is refused on their tools too, the same way as on Google Ads. In Tag Manager, AdCopilot creates and updates tags, triggers, variables and folders in its own workspace and never publishes; enabling a built-in variable is allowed, disabling one is not. ## Pause instead | You want to... | AdCopilot does this | | --------------------------------- | ------------------------------------------------------------------------------------------------ | | Stop a campaign | `set_campaign_status` → PAUSED | | Stop an ad | `update_ad_status` → PAUSED | | Stop a keyword | `update_keyword` → PAUSED | | Stop an asset showing | `set_campaign_asset_status`, `set_ad_group_asset_status` or `set_customer_asset_status` → PAUSED | | Stop an auto-apply recommendation | `pause_auto_apply_subscription` | A pause is reversible with the opposite call. A true deletion is something you do yourself, in the Google Ads interface. ## The honest exception: negatives A negative keyword, on a campaign, in a shared list, or at account level, can be **added** but not **removed** by AdCopilot. Removing one is a Google Ads interface action. The assistant should say so when it proposes one, so you know the undo is manual before you approve. # How your data moves Source: https://adcopilot.cloud/docs/concepts/data-transit/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/concepts/data-transit.md > AdCopilot is a connector, not a data warehouse. Queries run live against your Google accounts; here is what it keeps from them, and for how long. AdCopilot is a **connector**. When your assistant asks a question, the request goes through AdCopilot to Google's API and the answer comes back the same way. ## The path a request takes ### Your assistant calls a tool [#your-assistant-calls-a-tool] You ask a question, and your AI client calls an AdCopilot tool, for example `search` or `full_audit`. ### AdCopilot calls Google [#adcopilot-calls-google] AdCopilot checks the call (your plan, the accounts you switched on, the [budget checks](https://adcopilot.cloud/docs/concepts/money-fence)), then calls Google's API with the access you granted. ### The answer returns [#the-answer-returns] Google's response flows back to your assistant, which writes the reply you read. ## What AdCopilot keeps Queries run live against your account; audit reads are cached for up to an hour, a saved audit's findings are kept for 180 days, we log each tool call (tool, account id, outcome), and the business profile your workspace builds as you work (business details, the first campaign, a log of decisions, the last session's note) is kept until the workspace owner deletes it. * **The read cache.** The rows an audit reads from Google Ads are cached so a repeated audit is faster and does not ask Google twice: performance reports for 15 minutes, account settings for up to an hour. The account summary your assistant opens a conversation with is held in memory for 10 minutes. * **Saved audit results.** When an audit's results are saved to your dashboard, they keep the account-level figures the audit measured, such as total conversions and conversion value, with the currency, time zone and date range, and a written summary of the result; each finding keeps its description, the changes it suggests and up to 10 example rows from your account, such as search terms, keywords, ad group and campaign names, landing-page URLs, conversion-action names, cost and conversions. They are deleted after 180 days. * **The ledger.** One entry per tool call: the tool, the account id, the outcome and the time. It never holds the rows that came back, and entries are deleted after 180 days. * **The server's system log.** Each Google Ads request is logged with its account id and the text of the query your assistant or an audit ran, and the full content of any request Google rejects is logged too, such as the keywords or ad text it tried to set. It is kept until the server's routine log rotation removes it. * **The business profile.** The business details and budget you give it, the first campaign it built, a log of decisions and a note on the last session, so the next conversation starts where the last one stopped. The workspace owner can delete it. The service also keeps billing, email, trial, sign-in, routine and error records, and nightly database backups; see the [privacy policy](https://adcopilot.cloud/privacy) for each and how long it is kept. The conversation itself lives with your AI client's vendor, under its policy and your plan settings. ## Your Google access * **We never see your Google password.** You sign in with Google itself, and Google returns a token for the access you granted. The token is encrypted at rest. * **Each consent screen asks only for what that step needs.** Connecting a product from its card in **Google products** asks for that product's access and your Google identity (your email address). Joining a team or creating a workspace asks for Google Ads. Reconnecting asks again for Google Ads and the products your Google account already connected, so the new token keeps them. None of them asks for Gmail or Drive. * **You can withdraw it at any time**, from your Google account's connected apps, or with **Disconnect Google** in **Google products**. That deletes the token AdCopilot stored for you in the workspace and disconnects every product. It also asks Google to cancel AdCopilot's access, unless another AdCopilot workspace or a teammate still uses the same Google account: Google's cancel applies to the whole account, so it would disconnect them too. **Disconnect** on a single product stops AdCopilot using that product and keeps the token. The privacy policy on [adcopilot.cloud](https://adcopilot.cloud/privacy) is the commitment. This page explains the mechanism. # The budget checks Source: https://adcopilot.cloud/docs/concepts/money-fence/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/concepts/money-fence.md > The limits AdCopilot's server applies to anything that can start or raise spend — the comfortable daily budget (a warning), the monthly cap (a refusal), Maximize Clicks with no per-click cap (a refusal), and the campaign it built (yours to switch on). Four tools can start or raise spend: `create_campaign`, `create_performance_max_campaign`, `update_campaign` and `set_campaign_status`. AdCopilot checks each call to them against the budget you saved, on its own server, before Google is called. These checks hold even if your AI client is set to always allow the tool. ## The two numbers you save Both are in the **Business profile** on the dashboard's Home page (the workspace owner edits it), or you can tell AdCopilot in the chat and it saves them. * **Comfortable daily budget** — the daily amount you said you are comfortable with. A preference. * **Monthly cap** — the most you want the campaigns in a Google Ads account to spend in a month, all together. A limit. ## What refuses and what only warns | Situation | Result | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | | Building a campaign when no business profile is saved | **Refused** — tell AdCopilot what you sell, where your customers are and your daily comfort, then build. | | Building a campaign when no comfortable daily budget is saved | **Refused** — say the daily number, it saves it, then builds. | | Switching on or re-bidding a campaign with no comfortable daily budget saved | **Refused** — same fix. | | Switching on or re-bidding a campaign with no comfortable daily budget saved, when AdCopilot cannot read the campaign's daily budget from Google Ads | **Refused** — same fix; nothing was changed. | | A daily budget above your comfortable daily budget | **Goes through, with a warning.** | | A per-click cap higher than your whole comfortable daily budget | **Goes through, with a warning.** | | Switching on a campaign, building one switched on, raising a budget, or giving a campaign that has ended a new end date, past your monthly cap — counting the campaigns already running in the account | **Refused.** | | Any of those when AdCopilot cannot read the campaign's daily budget from Google Ads, while a monthly cap is saved | **Refused** — try again in a minute. | | Maximize Clicks with no per-click cap | **Refused.** | | Switching on the campaign AdCopilot built for you | **Refused** — that switch is yours, in Google Ads. | | A budget, per-click cap or monthly cap it cannot read as a number, or a monthly cap of zero or below | **Refused.** | ## The comfort warning Since v2.15.0, going above your comfortable daily budget is a heads-up, not a block. The change goes through and the reply says: > This campaign is set to spend $60/day — about $1,824 a month — above the > comfortable daily budget on file, $40. That is a heads-up, not a block: the > saved comfort stays $40 unless you ask me to change it. Your saved comfort does not change unless you ask. When you ask for a number above it, the assistant passes your own words as `over_comfort_ack`, and they are recorded with the change and quoted back: > Recorded with this change: "yes, go to 60 a day for the sale week". ## The monthly cap The monthly cap is a limit you set, so it refuses. It is checked on every change that would start or raise spend: switching a campaign on, building a campaign switched on, raising a daily budget, and moving the start or end date of a campaign that is switched on but has ended, which starts it spending again. It counts the campaigns already running in that Google Ads account together, with a budget that several campaigns share counted once: > That would put this account's running campaigns at $250/day in total — > $100 for this campaign plus $150 for the others — about $7,600 a month, > above the monthly cap of $5,000 on file. Raise the cap first (tell me the > number), pick a smaller daily budget, or pause another campaign. When nothing else is running in the account, or AdCopilot cannot read the rest of it at that moment, it compares the one campaign on its own: > That would put this campaign at $200/day — about $6,080 a month — above the > monthly cap of $5,000 on file. Raise the cap first (tell me the number), or > pick a smaller daily budget. The month is 30.4 days, so the daily budgets may add up to the cap divided by 30.4. A campaign built paused is checked when it is switched on. Raising the budget of a campaign that stays paused is compared on its own, because it spends nothing until it is switched on, unless that budget also pays for a campaign that is running. If AdCopilot cannot read the campaign's own daily budget from Google Ads at all, it does not guess: it refuses the change and asks you to try again in a minute. A monthly cap that is saved but is not a number above zero refuses every one of these changes until you give it one; leave **Monthly cap** blank for no cap. Changes made in Google Ads itself, outside AdCopilot, are not checked. ## Maximize Clicks with no per-click cap Maximize Clicks with no maximum cost per click lets Google pay any amount for a single click. AdCopilot refuses it and asks for the most you want to pay for one click, then switches with that cap. ## The campaign it built A campaign AdCopilot builds with you is created paused, and AdCopilot will not switch it on. You do that in Google Ads: Campaigns → the campaign → the grey Paused dot → Enabled. ## Who these checks apply to The monthly cap applies to every workspace that saves one. It is a limit you set, so it holds whatever the Business profile's **How much you already know** says, **I do this for a living** included, and however long the workspace has been running its own campaigns. The comfortable-daily-budget checks, the per-click-cap checks and the "nothing saved yet" refusals apply to workspaces going through AdCopilot's guided start. They are off when **How much you already know** is set to **I do this for a living**, and for workspaces that were running their own campaigns before the guided start existed. The no-delete rule and the campaign-it-built rule apply to everyone. See [Money-fence refusals and warnings](https://adcopilot.cloud/docs/troubleshooting/money-fence) for what to do about each message. # Read vs write tools Source: https://adcopilot.cloud/docs/concepts/read-vs-write/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/concepts/read-vs-write.md > Every AdCopilot tool either reads or writes. Reads run freely; writes change something and wait for your yes. 41 of the 103 tools read as of v2.16.0, whichever products are connected. Every tool is either a **read** or a **write**. Reads run freely. Writes change something in your account, so the assistant proposes them first and runs them only when you say yes. See [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes). ## The split, by product Counted on the whole list, which is the same whichever products are connected: | Product | Tools | Read | Write | | ------------------ | ------- | ------ | ------ | | Google Ads | 54 | 16 | 38 | | Google Analytics 4 | 23 | 11 | 12 | | Search Console | 6 | 4 | 2 | | Tag Manager | 18 | 9 | 9 | | AdCopilot | 2 | 1 | 1 | | **All** | **103** | **41** | **62** | The Google Ads reads include `search` (any report, in Google's query language), `list_accessible_customers`, `get_resource_metadata`, `list_asset_links`, `list_auto_apply_subscriptions` and every analysis tool, from `full_audit` to `day_of_week`. The [tool reference](https://adcopilot.cloud/docs/tools) marks every tool **Read** or **Write**. The AdCopilot pair is `get_org_context` (read: what is connected, and where you stand) and `save_org_context` (write: saves what you told it about your business, so the next conversation remembers). ## Read-only access You can narrow what AdCopilot may change: * **Google Analytics and Tag Manager** can be connected with **Read-only access**. Their write tools stay unavailable until you press **Enable editing** in **Google products**. * **A teammate** with the **viewer** role can read but not change anything. The owner sets roles on the **Team** page, or on the invite link. * **A whole workspace** can be put on the read-only tier. Every write tool is removed on our server. Ask [support@adcopilot.cloud](mailto:support@adcopilot.cloud). ## How to tell, in practice * If the assistant is **answering a question**, it is reading. * If the assistant is **proposing a change and waiting for your yes**, it is about to write. That pause is the signal. # Any MCP client Source: https://adcopilot.cloud/docs/connect/any-mcp-client/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect/any-mcp-client.md > Cursor, Windsurf, Microsoft Copilot or any client that speaks the Model Context Protocol — add the connector URL, approve it, and ask. AdCopilot is a remote MCP server over streamable HTTP, with OAuth sign-in. Any client that can add a remote server by URL can use it. ```text https://mcp.adcopilot.cloud/mcp ``` ## Clients that read a JSON configuration file Most accept this shape. Where the file lives is up to your client; check its documentation for the path. ```json { "mcpServers": { "adcopilot": { "url": "https://mcp.adcopilot.cloud/mcp" } } } ``` ## Clients with a connector settings screen Add a custom connector (or "remote MCP server") and paste the URL. Microsoft Copilot works this way. ## Sign in The first time the client connects, it opens AdCopilot's page asking you to let it use your AdCopilot. Press **Approve**. There is no API key to paste. ## Then ask > Get me started with AdCopilot ## Picking up new tools Clients cache the tool list from when they connected. After an AdCopilot release adds tools, reconnect AdCopilot in the client's connector settings, or remove it and add it again. Or **Revoke** the app under **Connections** in the dashboard, and it re-approves with the full set next time. Connecting another Google product needs nothing in the client, unless **Connections** marks it **Re-authorization needed**. See [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). # Connect ChatGPT Source: https://adcopilot.cloud/docs/connect/chatgpt/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect/chatgpt.md > Add AdCopilot to ChatGPT in developer mode — turn developer mode on, create the app with the connector URL, sign in and approve, then type @AdCopilot in a new chat. Works on ChatGPT's Free plan. ChatGPT does not take a pasted URL in a settings box the way Claude does. You turn on developer mode, then create AdCopilot as an app yourself. It takes about three minutes and works on ChatGPT's **Free** plan. Every label below is ChatGPT's own, checked click by click on 23 September 2026\. ChatGPT moves these screens often, so follow the words; the pictures only support them. Before you start, connect Google Ads (and any other Google product) at [app.adcopilot.cloud](https://app.adcopilot.cloud). See [Connect Google Ads](https://adcopilot.cloud/docs/getting-started/connect-google-ads). ## 1. Turn on developer mode Open the profile menu at the bottom left, then **Settings**, then **Security and login**. Scroll down to **Developer mode** and switch it on. This link opens the right settings panel, but you still have to scroll down: [chatgpt.com/#settings/Security](https://chatgpt.com/#settings/Security). [Screenshot: ChatGPT's profile menu open at the bottom left, with Settings in the list.] [Screenshot: The Developer mode switch turned on, with a red Elevated risk tag beside its name.] ChatGPT tags developer mode **Elevated risk** and warns that apps added this way could change or erase data. It says that of every app you add yourself. AdCopilot cannot delete, and it changes your account only when you ask. On a Business, Enterprise or Edu workspace, an admin may have to allow developer mode before you see the switch. ## 2. Create the app Go to [chatgpt.com/plugins](https://chatgpt.com/plugins). Press **+** at the top right, next to **Search plugins**, and choose **Create app**. A **New Plugin** box opens with a place to drop a file. Ignore that and press **Create MCP App** at the bottom left. [Screenshot: The Plugins page with the + menu open: Create plugin, Upload plugin and Create app.] [Screenshot: The New Plugin box, with the Create MCP App button at the bottom left.] There is no direct link to this form. Don't use **Upload plugin**. ## 3. Fill in the form | Field | Value | | -------------- | ------------------------------------------------------- | | Name | `AdCopilot` — this is what you type after @ later | | Description | `Google Ads, Analytics, Search Console and Tag Manager` | | Connection | **Server URL** (the default) | | Server URL | the URL below | | Authentication | **OAuth** (already selected — leave it) | ```text https://mcp.adcopilot.cloud/mcp ``` Tick **I understand and want to continue**, then press **Create**. The icon is optional. To see our mark beside AdCopilot in ChatGPT, [download the icon](https://adcopilot.cloud/docs/images/connect/chatgpt/adcopilot-icon-256.png) (a 256 px PNG, under ChatGPT's 10 KB limit) and add it at the top of the form. [Screenshot: The filled-in form: icon, Name AdCopilot, the description, the Server URL, Authentication OAuth, and the box ticked.] ## 4. Sign in and approve ChatGPT shows **Add AdCopilot to ChatGPT**. Press **Sign in with AdCopilot**. A new tab opens our page, **Let ChatGPT use your AdCopilot?** Press **Approve**. [Screenshot: ChatGPT's Add AdCopilot to ChatGPT box with the Sign in with AdCopilot button.] [Screenshot: AdCopilot's page asking Let ChatGPT use your AdCopilot?, with an Approve button.] If the tab keeps spinning after you approve, close it and go back to the ChatGPT tab. It says **AdCopilot is installed.** If the app's page then says **No app tools available yet**, that is ChatGPT catching up. Our server has already answered. Carry on to step 5. [Screenshot: AdCopilot's page in ChatGPT's settings, connected, with No app tools available yet under Tools.] ## 5. Type @AdCopilot in a new chat Open a new chat, type **@AdCopilot** and pick it from the list, then send: > Get me started with AdCopilot [Screenshot: A new chat with @AdCo typed and AdCopilot offered in the list with its icon.] Picking it with @ is what makes ChatGPT use AdCopilot instead of searching the web. Do it at the start of each new chat. ## If something goes wrong See [Connecting ChatGPT](https://adcopilot.cloud/docs/troubleshooting/connect-chatgpt) for: no developer mode switch, "No app tools available yet", ChatGPT searching the web instead, and the sign-in tab that keeps spinning. ## Disconnecting Remove AdCopilot from ChatGPT's settings, or **Revoke** ChatGPT under **Connections** in the AdCopilot dashboard. Either takes effect at once. # The Claude Code plugin Source: https://adcopilot.cloud/docs/connect/claude-code-plugin/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect/claude-code-plugin.md > For developers on Claude Code. The AdCopilot plugin registers the connector for you and adds three skills and five commands. What it contains, how to install it, and what to do if you added the connector by hand first. The AdCopilot plugin for Claude Code is public and MIT-licensed: [AtromxIntelligence/adcopilot-claude-plugin](https://github.com/AtromxIntelligence/adcopilot-claude-plugin), version 0.1.0. It does two things: * **It registers the connector for you.** There is no `claude mcp add` step. The plugin points Claude Code at `https://mcp.adcopilot.cloud/mcp`, the same connector every other assistant uses. * **It adds three skills and five commands** for the steps the connector cannot take for you: what to click in Google's own screens, and the traps that are easy to fall into. This is a Claude Code plugin. In Codex, Gemini CLI or any other client, add the connector by URL. See [Connect your assistant](https://adcopilot.cloud/docs/connect). ## Install In Claude Code: ```text /plugin marketplace add AtromxIntelligence/adcopilot-claude-plugin /plugin install adcopilot@adcopilot-claude-plugin ``` Then run `/mcp`, choose **adcopilot** and sign in. You need an AdCopilot account, and your Google products are connected in the dashboard at [app.adcopilot.cloud](https://app.adcopilot.cloud), not in Claude Code. See [Connect Google Ads](https://adcopilot.cloud/docs/getting-started/connect-google-ads). ## Sign-in is unchanged The plugin changes nothing about how you sign in. The first time Claude Code connects, your browser opens AdCopilot's page asking you to let Claude Code use your AdCopilot. You sign in with your own Google account and press **Approve**, exactly as you would after `claude mcp add`. The plugin itself holds no key or token, and you can withdraw the access from **Connections** in the dashboard at any time. ## What is in it What Claude Code loads from the plugin is markdown and one connector registration. It has no hooks and starts no local server, so nothing from it runs on your machine. The repository also holds the eval suite used to test the skills; Claude Code does not run it. ### Three skills Claude uses a skill on its own when the conversation calls for it. | Skill | Claude uses it when you | What it does | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `adcopilot-connect` | install AdCopilot, ask to get started, ask what is connected, ask to connect or link Google Ads, Analytics, Tag Manager or Search Console, or ask why a tool or product is missing | Connects your Google products and links them to each other in the order that works, saying what each step bought you. | | `adcopilot-launch` | ask to build a campaign, launch ads or start advertising, or ask how a new campaign is doing in its first weeks or why it is not showing | Builds a first Search campaign switched off, checks the settings that leak money by reading the campaign back, hands you the switch to turn it on, and runs the first week's checks. | | `adcopilot-measure` | ask to set up conversion tracking or count sign-ups, ask about Analytics or Tag Manager for tracking, or ask why Google Ads shows no conversions | Sets up conversion tracking end to end: the Analytics property and data stream, the Tag Manager tag, the key event, the link to Google Ads and the import. It finishes with exactly one Primary conversion, proven by a real click. | ### Five commands You type these. | Command | What it does | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/adcopilot:setup` | Checks the connector is connected and signed in, says what each connected product unlocks, and catches a copy of the connector you added by hand. | | `/adcopilot:launch` | A first Search campaign, through `adcopilot-launch`. | | `/adcopilot:measure` | Conversion tracking, through `adcopilot-measure`. | | `/adcopilot:daily` | The daily check-in: what was spent since yesterday, the searches the ads showed for, and what changed in the account, as far as your plan's daily operations allow. | | `/adcopilot:audit` | The full audit and this month's budget pacing, with findings that only mean the account is new kept apart from the real ones. | The plugin works through the same connector, so the same rules hold: every change is proposed first, new campaigns are built paused, and it [can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). The yes before a change is Claude Code's own permission prompt. An allowlist entry or auto mode skips it, so leave AdCopilot's write tools off your allowlist. See [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes). ## Already added the connector by hand? If you ran `claude mcp add` before installing the plugin, Claude Code keeps your copy and silently ignores the plugin's. `claude mcp list` shows the sign: a bare `adcopilot:` line and no `plugin:adcopilot:adcopilot` line. Remove your copy from every scope it is in. One `claude mcp remove` is not always enough, because the same name can be registered in more than one scope at once: ```bash claude mcp remove adcopilot -s user ``` Then, from the directory you added it in: ```bash claude mcp remove adcopilot -s local ``` A local registration belongs to the directory you ran `claude mcp add` in, and is invisible from anywhere else. If you added it in more than one project, repeat this in each. If a project's `.mcp.json` lists it, that one is `-s project`, run from that project. Run `claude mcp list` again until only `plugin:adcopilot:adcopilot` remains, then `/mcp` to sign in. `/adcopilot:setup` checks for this too. ## Rather not install a plugin? Add the connector by hand instead. Use one or the other, not both: ```bash claude mcp add --scope user --transport http adcopilot https://mcp.adcopilot.cloud/mcp ``` See [Connect Claude Code and Codex](https://adcopilot.cloud/docs/connect/claude-code). ## Scripts and allowed tools Claude Code names a plugin's tools after the plugin. With the plugin, AdCopilot's tools are `mcp__plugin_adcopilot_adcopilot__`; added by hand as `adcopilot`, they are `mcp__adcopilot__`. Use the right prefix in `--allowedTools` for a `claude -p` script, and take the exact names from `/mcp`. ## Updating and removing **New AdCopilot tools.** Run `/mcp`, choose **adcopilot** and reconnect. See [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). **A new plugin version.** Refresh the marketplace, update the plugin, then restart Claude Code: ```bash claude plugin marketplace update adcopilot-claude-plugin claude plugin update adcopilot@adcopilot-claude-plugin ``` **Remove it:** ```bash claude plugin uninstall adcopilot@adcopilot-claude-plugin ``` ## How the skills are tested The plugin's repository carries its eval suite. Its README sets the rule a skill must meet to stay: on the same cases, it has to beat a copy of the plugin whose skills are cut to their descriptions, which leaves the connector to do the work alone. ## Support * A command, a skill or the plugin's README is wrong: [open an issue on the plugin repository](https://github.com/AtromxIntelligence/adcopilot-claude-plugin/issues). * Sign-in, a tool call or your account: [support@adcopilot.cloud](mailto:support@adcopilot.cloud). # Connect Claude Code and Codex Source: https://adcopilot.cloud/docs/connect/claude-code/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect/claude-code.md > In Claude Code, install the AdCopilot plugin or add the connector with one command. In Codex, one command. Then approve it in your browser and ask from the terminal. ## Claude Code: the plugin The AdCopilot plugin registers the connector for you, so there is no `claude mcp add` step. It also adds three skills and five `/adcopilot:` commands. In Claude Code: ```text /plugin marketplace add AtromxIntelligence/adcopilot-claude-plugin /plugin install adcopilot@adcopilot-claude-plugin ``` Then run `/mcp`, choose **adcopilot** and authenticate. Your browser opens AdCopilot's page asking you to let Claude Code use your AdCopilot. Press **Approve** and go back to the terminal. What the skills and commands do, and what to do if you already added the connector by hand: [The Claude Code plugin](https://adcopilot.cloud/docs/connect/claude-code-plugin). ## Claude Code: by hand Rather not install a plugin? Add the connector with one command instead: ```bash claude mcp add --scope user --transport http adcopilot https://mcp.adcopilot.cloud/mcp ``` `--scope user` makes AdCopilot available in every folder. Without it, Claude Code adds it only to the folder you ran the command in. Then start Claude Code, run `/mcp`, choose **adcopilot** and authenticate, as above. Use the plugin or this command, not both. A copy added by hand hides the plugin's; see [Already added the connector by hand?](https://adcopilot.cloud/docs/connect/claude-code-plugin#already-added-the-connector-by-hand). ## Codex ```bash codex mcp add adcopilot --url https://mcp.adcopilot.cloud/mcp ``` Codex signs in through your browser the same way: approve AdCopilot on the page it opens. ## Ask In a new session, say: > Get me started with AdCopilot ## Picking up new tools The tool list is loaded when the client connects. After an AdCopilot release adds tools: * **Claude Code:** run `/mcp`, choose **adcopilot** and reconnect. If you added it by hand rather than with the plugin, you can also remove it (`claude mcp remove adcopilot`) and add it again with the command above. If the remove says AdCopilot is in more than one scope, run `claude mcp remove adcopilot -s user` and, from the folder you added it in, `claude mcp remove adcopilot -s local`. * **Codex:** start a new session; if the tool is still missing, remove AdCopilot and add it again. AdCopilot says so in the conversation when this is needed. Connecting another Google product needs nothing here, unless **Connections** marks the client **Re-authorization needed**. See [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). ## Scheduling from the terminal Claude Code can run AdCopilot's daily check-in from your own scheduler. See [The daily routine](https://adcopilot.cloud/docs/guides/daily-routine). # Connect Claude Source: https://adcopilot.cloud/docs/connect/claude/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect/claude.md > Add AdCopilot to Claude on the web or desktop as a custom connector — open Add custom connector, paste the URL, connect and approve, let read-only tools run without asking, then say "Get me started with AdCopilot". Works on Claude's Free plan. Claude on the web and the desktop app take AdCopilot as a **custom connector**: a name and one URL. It takes about two minutes, and it worked on Claude's **Free** plan when we checked. Every label below is Claude's own, checked click by click on 24 September 2026\. Claude's layout differs between accounts: some open **Customize** as a full page, others as a settings box. The direct link in step 1 works on both, so start there. Before you start, connect Google Ads (and any other Google product) at [app.adcopilot.cloud](https://app.adcopilot.cloud). See [Connect Google Ads](https://adcopilot.cloud/docs/getting-started/connect-google-ads). ## 1. Open Add custom connector This link opens Claude's **Add custom connector** box straight away. If you are signed out, Claude asks you to sign in first. [Open Add custom connector in Claude](https://claude.ai/new?modal=add-custom-connector#customize/connectors/yours) To get there yourself: in Claude's sidebar choose **Customize**, then **Connectors**, press **+ Add** at the top right, and choose **Add custom connector**. [Screenshot: Claude's Connectors page with the + Add menu open, offering Add custom connector.] [Screenshot: The Add custom connector box, with empty Name and MCP server URL fields.] In a Team or Enterprise organisation, an owner may need to add custom connectors for you. ## 2. Fill in the form | Field | Value | | -------------- | ------------- | | Name | `AdCopilot` | | MCP server URL | the URL below | ```text https://mcp.adcopilot.cloud/mcp ``` Press **Continue**. If Chrome's autofill list covers the URL box, press Esc to close it. [Screenshot: The form filled in: Name AdCopilot, MCP server URL https://mcp.adcopilot.cloud/mcp, and Continue ready to press.] ## 3. Leave the sign-in settings as they are The next screen shows Claude's sign-in settings. **Sign in now** and **Use Claude's published identity** are already selected and marked **Detected**. Don't change them. Scroll down and press **Add**. [Screenshot: Claude's sign-in settings for AdCopilot: Sign in now and Use Claude's published identity selected and marked Detected, with Back and Add at the bottom.] ## 4. Connect and approve Claude opens the connector's page: **You're not connected to AdCopilot yet.** Press **Connect**. [Screenshot: AdCopilot's connector page in Claude, with the Connect button.] Our page opens, **Let Claude use your AdCopilot?**, and lists what Claude will be able to do. Press **Approve**. [Screenshot: AdCopilot's page asking Let Claude use your AdCopilot?, with an Approve button.] You land back in Claude, which lists AdCopilot's tools straight away. ## 5. Let reads run without asking Under **Tool permissions**, Claude sorts AdCopilot's tools into **Read-only tools** and **Write/delete tools**, each on **Needs approval** to begin with. That is why Claude stops to ask ("Claude wants to use …") the first time each report runs. Open the menu beside **Read-only tools** and choose **Always allow**. Leave **Write/delete tools** on **Needs approval**. [Screenshot: The Read-only tools menu open under Tool permissions: Always allow, Needs approval, Blocked and Custom.] [Screenshot: Read-only tools set to Always allow, with each read-only tool on the allow setting.] Reports and audits then run without a prompt each time. Claude still asks before every change while **Write/delete tools** stay on **Needs approval**: that prompt is Claude's, not AdCopilot's, so keep it. AdCopilot proposes each change in the chat first, and it can never delete. See [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes). ## 6. Say hello Start a new chat and send: > Get me started with AdCopilot [Screenshot: A new Claude chat with Get me started with AdCopilot typed in the message box.] You don't need an @ in Claude: it picks AdCopilot on its own. In the AdCopilot dashboard, **AI assistants** shows **Connected** once Claude has made its first call. ## If something goes wrong See [Connecting Claude](https://adcopilot.cloud/docs/troubleshooting/connect-claude) for: Claude asking permission before every report, Chrome's autofill covering the URL box, no **Customize** in the sidebar, and custom connectors in a Team or Enterprise organisation. ## Picking up new tools Claude keeps the tool list it was given when you approved it. After an AdCopilot release adds tools, open AdCopilot under **Customize → Connectors**, press **Disconnect**, then connect it again. AdCopilot tells you in the chat when this is needed. Connecting another Google product needs nothing here, unless **Connections** marks Claude **Re-authorization needed**. See [Reconnecting](https://adcopilot.cloud/docs/getting-started/reconnect). ## Disconnecting Press **Disconnect** on AdCopilot's page under **Customize → Connectors**, or **Revoke** Claude under **Connections** in the AdCopilot dashboard. # Connect Gemini CLI Source: https://adcopilot.cloud/docs/connect/gemini-cli/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect/gemini-cli.md > Add AdCopilot to Gemini CLI with one command over HTTP, sign in, and ask from the terminal. ```bash gemini mcp add --scope user --transport http adcopilot https://mcp.adcopilot.cloud/mcp ``` Both flags matter: * `--transport http` — Gemini CLI assumes a local command unless you say the server is reached over HTTP. * `--scope user` — makes AdCopilot available in every folder. Without it, Gemini CLI adds it to the current project only. Don't add `--trust`. It makes Gemini CLI run every tool without asking you first. ## Sign in Start Gemini CLI. If AdCopilot needs signing in, run `/mcp auth adcopilot`. Your browser opens AdCopilot's page asking you to let Gemini CLI use your AdCopilot. Press **Approve**. ## Ask > Get me started with AdCopilot ## Picking up new tools After an AdCopilot release adds tools, restart Gemini CLI. If a tool is still missing, remove AdCopilot (`gemini mcp remove adcopilot`) and add it again. Connecting another Google product needs nothing here, unless **Connections** marks the client **Re-authorization needed**. See [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). # Connect your assistant Source: https://adcopilot.cloud/docs/connect/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/connect.md > One connector URL for every AI assistant. Pick yours — ChatGPT, Claude, Claude Code, Codex, Gemini CLI or any MCP client — and follow its steps. Every assistant uses the same connector URL. Your own sign-in, not the URL, decides which workspace and accounts it reaches. ```text https://mcp.adcopilot.cloud/mcp ``` Connect your Google products in the dashboard first (see [Connect Google Ads](https://adcopilot.cloud/docs/getting-started/connect-google-ads)), then add AdCopilot to your assistant: ## What happens when you connect 1. Your assistant opens an AdCopilot page: **Let \ use your AdCopilot?** It lists what the assistant will be able to do. If you belong to more than one workspace, you pick one here. 2. Press **Approve**. You can withdraw it at any time from **Connections** in the dashboard. 3. In the dashboard, **AI assistants** shows **Connected** once your assistant makes its first call. 4. Start a new chat and say **Get me started with AdCopilot**. If you connect another Google product later, there is nothing to do in your AI app: your approval already covers every product AdCopilot serves. The exception is an app **Connections** marks **Re-authorization needed**; see [Approve your assistant again](https://adcopilot.cloud/docs/getting-started/reconnect#approve-your-assistant-again). # Connect Google Ads Source: https://adcopilot.cloud/docs/getting-started/connect-google-ads/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/getting-started/connect-google-ads.md > Connect Google Ads, and optionally Analytics, Search Console and Tag Manager, with your own Google sign-in. Choose which ad accounts AdCopilot works on, then add the connector to your assistant. AdCopilot never asks for your Google password. Each product is connected with Google's own consent screen, and you can withdraw access at any time from your Google account. ## Connect your Google products 1. Sign in at [app.adcopilot.cloud](https://app.adcopilot.cloud) and open **Google products**. 2. Under **Connect your Google products**, press **Connect Google Ads**. Google shows its consent screen. Approve it. 3. Back in AdCopilot, choose which ad accounts AdCopilot can work on. Only the accounts you switch **On** are reachable, up to your plan's limit. 4. Connect **Google Analytics**, **Search Console** and **Tag Manager** the same way if you use them. Each card asks only for that product's own access. Connecting one does not grant the others. For Google Analytics and Tag Manager the card shows **Read-only access** or **Editing enabled**; press **Enable editing** if you want AdCopilot to make changes there too. The Google account you connect Google Ads with doesn't have to be the one you signed in to AdCopilot with. On Google's screen, pick the account that has access to your ads. The Google Ads card then shows which Google account it is connected through. Need to move to a different Google login later? Use **Connect another account** on the same page. It switches your connection to the new login: * The ad accounts list is replaced by the accounts the new login can reach. * Analytics, Search Console and Tag Manager need connecting again with the new login. * If the new login has no Google Ads account, nothing changes. ## Add the connector to your assistant One URL for every assistant and every workspace: ```text https://mcp.adcopilot.cloud/mcp ``` Your assistant opens an AdCopilot page, **Let \ use your AdCopilot?**, where you pick the workspace and press **Approve**. The steps for each assistant are under [Connect your assistant](https://adcopilot.cloud/docs/connect). ## Check what it can reach Start a new chat and say: > Get me started with AdCopilot AdCopilot's first call, `get_org_context`, reports what is connected and which ad accounts are switched on. If an account you expect is missing, see [Account not showing up](https://adcopilot.cloud/docs/troubleshooting/account-not-showing). ## Connected a new Google product later? There is nothing to do in your AI app. When you approve your assistant, AdCopilot asks for every Google product it serves, so a product you connect later is already in its tool list and works on the next request. Start a new chat and say **Get me started with AdCopilot** to hear what it adds. If **Connections** marks your assistant **Re-authorization needed**, its approval does not cover the new product: for example, it was approved when AdCopilot asked for Google Ads alone. **Revoke** it under **Connections** and approve it when it next asks, or remove the AdCopilot connector in your AI app and add it back. AdCopilot says so in the chat too. If a tool is still missing, see [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). # Run your first audit Source: https://adcopilot.cloud/docs/getting-started/first-audit/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/getting-started/first-audit.md > Say "Get me started with AdCopilot" — AdCopilot reads what you have connected, tells you what state your account is in, and gives you the next step. Then run the read-only morning audit or a full audit. ## Say "Get me started with AdCopilot" Open the AI assistant you connected AdCopilot to, start a new chat, and type: > Get me started with AdCopilot That one sentence is the whole opening move. Your assistant calls `get_org_context` first, which reads what you have connected and what state your Google Ads account is in. It then tells you where you stand in one or two sentences and offers two or three numbered next steps, in plain words. It changes nothing: the whole first turn is read-only. Say it again whenever you are unsure what to do next. It picks up where you left off rather than starting over. In ChatGPT, type **@AdCopilot** and pick it from the list first, then the sentence. Otherwise ChatGPT may search the web instead of asking AdCopilot. See [Connect ChatGPT](https://adcopilot.cloud/docs/connect/chatgpt). ## Then: the morning audit Once you know the shape of the account, the standing read-only check is the morning audit: > Run my AdCopilot morning audit. It uses AdCopilot's `morning-audit` prompt, the same six checks per account: 1. **Accounts in scope** — which accounts you can act on now. 2. **Spend vs plan cap** — month-to-date cost against your monthly cap. 3. **Wasted spend** — the search terms and keywords spending with no conversions. 4. **Negative-keyword candidates** — clearly off-intent terms worth blocking. 5. **Disapprovals** — ads Google has switched off by policy. 6. **Pacing** — projected month-end spend against the cap. It ends each account with a compact table and a verdict per row: **OK**, **WATCH** or **ACT**. See [The daily routine](https://adcopilot.cloud/docs/guides/daily-routine). Tell AdCopilot your monthly cap once (or set it under **Business profile** on the dashboard's Home page). Without it, spend is reported as a plain number and the cap check says so. ## Or: a full audit > Run a deep AdCopilot audit of my Google Ads account. `full_audit` scores the account against up to 73 checks across conversion tracking, wasted spend, structure, keywords, ads and settings, and gives a 0-100 health score. A quick audit runs three of the 73 and does not grade the account. A deep audit attempts all 73. If Google is slow, a deep audit returns what it finished and lists the rest as not evaluated; see [An audit returned partial results](https://adcopilot.cloud/docs/troubleshooting/audit-partial). What each check measures is in [Audit checks](https://adcopilot.cloud/docs/checks/conversion_tracking). ## Turn a finding into a change Under each **ACT** row the assistant writes a specific proposal: the account, the exact target, the exact change, and the tool that would make it. For example: > Pause keyword "free invoice template" in campaign "Invoicing — Search" > (it spent $180 last month with zero conversions). Apply with > `update_keyword` → PAUSED. Reversible by re-enabling it. Nothing happens until you say **yes**. Read [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes) for how that works. ## What it will not do * It will not make a change you did not ask for. * It will not delete anything. It pauses instead. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). * It will not switch on a campaign it built for you. That switch is yours, in Google Ads. # Getting started Source: https://adcopilot.cloud/docs/getting-started/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/getting-started.md > What you need, and the three steps from sign-up to your first answer — connect your Google products, add AdCopilot to your AI assistant, and say "Get me started with AdCopilot". AdCopilot lets you run Google Ads by asking an AI assistant. You connect your Google products once, with your own Google sign-in, and from then on you read and change them in plain words from ChatGPT, Claude, Claude Code, Codex, Gemini CLI or any other MCP client. ## What you need * A Google account that can open at least one Google Ads account. Google Analytics 4, Search Console and Tag Manager are optional. * An AI assistant that can add an MCP connector. See [Connect your assistant](https://adcopilot.cloud/docs/connect) for each one. * Nothing to install or host. AdCopilot is a hosted connector. ## The three steps ### Sign up and connect your Google products [#sign-up-and-connect-your-google-products] Go to [app.adcopilot.cloud](https://app.adcopilot.cloud) and continue with Google. Your first sign-in creates your workspace. Then open **Google products** and connect Google Ads, plus any of Analytics, Search Console and Tag Manager you use. See [Connect Google Ads](https://adcopilot.cloud/docs/getting-started/connect-google-ads). ### Add AdCopilot to your assistant [#add-adcopilot-to-your-assistant] Every assistant uses the same connector URL: ```text https://mcp.adcopilot.cloud/mcp ``` Where it goes differs by assistant. ChatGPT needs developer mode first. Follow the page for yours under [Connect your assistant](https://adcopilot.cloud/docs/connect). The assistant opens an AdCopilot page asking you to approve it; press **Approve**. ### Ask it to do something [#ask-it-to-do-something] Start a new chat and type **Get me started with AdCopilot**. AdCopilot reads what you have connected and tells you where you stand and what to do next, in plain words and without changing anything. After that, AdCopilot proposes every change in the chat first, and your assistant asks you before it makes one as long as its approval prompt for changes stays on. See [Run your first audit](https://adcopilot.cloud/docs/getting-started/first-audit). ## Your first week A new workspace starts on a **7-day Pro trial**: up to 50 Google Ads accounts, no daily cap, no card. When it ends, the workspace moves to the **Free** plan (one account, 10 operations a day). Nothing locks, and nothing is deleted. The trial is one per person: an address that has had one starts on Free. See [Billing and plans](https://adcopilot.cloud/docs/guides/billing-and-plans). AdCopilot reads freely, changes things only when you ask, and can never delete anything. Read [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes) and [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete) before your first change. # Reconnecting Source: https://adcopilot.cloud/docs/getting-started/reconnect/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/getting-started/reconnect.md > When Google stops accepting AdCopilot's sign-in, when your assistant needs to pick up tools a release added, or when Connections says it needs re-authorization — how to fix each without changing anything in your accounts. There are two different things to reconnect, and they have different fixes. | What you see | What needs reconnecting | Fix | | ------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------- | | "Google is no longer accepting this connector's sign-in" | Your **Google** sign-in | [Reconnect Google](#reconnect-google) | | A tool is missing, or AdCopilot says tools are "available but not in this connection's tool list" | Your **AI assistant's** connection | [Reconnect your assistant](#reconnect-your-assistant) | | **Connections** marks your assistant **Re-authorization needed** | Your **AI assistant's** approval | [Approve your assistant again](#approve-your-assistant-again) | ## Reconnect Google Google sign-ins can stop working: you changed your Google password, removed AdCopilot from your Google account's connected apps, or your access to an account changed. AdCopilot then says: > Google is no longer accepting this connector's sign-in, so it cannot reach > your ads accounts. Reconnect your Google account at … — sign in, one click, > and the connector URL does not change. Open the link in that message, or the same link in the email AdCopilot sends when it finds the sign-in refused, sign in to AdCopilot if it asks, and complete the Google sign-in. The link names your workspace, never a key, so it is safe in a chat. AdCopilot checks every stored Google sign-in each night, so that email can reach you before you next ask your assistant for anything. In the dashboard, **Connections** marks the affected Google login **Needs reauth** until you do. If the sign-in belongs to a teammate, AdCopilot says the connection's owner needs to reconnect it, and emails them. Until you reconnect, AdCopilot cannot read or change the accounts behind that sign-in. Other connections keep working. ## Reconnect your assistant Your assistant keeps the tool list it was given when you approved it. After an AdCopilot release adds tools, it needs to fetch the list again. AdCopilot says so in the chat, with the steps for your assistant: * **Claude:** open **Customize → Connectors** (layouts vary; the [Claude guide](https://adcopilot.cloud/docs/connect/claude) has a direct link), choose AdCopilot, press **Disconnect**, then connect it again. * **Claude Code:** run `/mcp` and reconnect AdCopilot. If you added it by hand rather than with [the plugin](https://adcopilot.cloud/docs/connect/claude-code-plugin), you can also remove it and add it again with `claude mcp add --scope user --transport http adcopilot https://mcp.adcopilot.cloud/mcp`. * **ChatGPT:** open the AdCopilot app in ChatGPT's settings and reconnect it. If its tools still do not appear, remove the app and create it again with the same URL, as in [Connect ChatGPT](https://adcopilot.cloud/docs/connect/chatgpt). * **Anything else:** reconnect AdCopilot in its connector settings, or remove it and add it again. Or skip the AI app entirely: in the dashboard, open **Connections** and **Revoke** the app. The next thing it asks for gets the full set of permissions. Then start a new chat. Reconnecting never changes your campaigns. Connecting another Google product is different: there is nothing to do in your AI app. When you approve your assistant, AdCopilot asks for every Google product it serves, so a product you connect later is already in its tool list and works on the next request. ## Approve your assistant again **Connections** marks an app **Re-authorization needed** when its approval does not cover a product your workspace has connected: for example, it was approved when AdCopilot asked for Google Ads alone. AdCopilot says so in the chat too. **Revoke** it under **Connections** and approve it when it next asks, or remove the AdCopilot connector in your AI app and add it back. With the [Claude Code plugin](https://adcopilot.cloud/docs/connect/claude-code-plugin), use Revoke: adding the connector again by hand hides the plugin's. Still stuck? See [Reconnect troubleshooting](https://adcopilot.cloud/docs/troubleshooting/reconnect). # Billing and plans Source: https://adcopilot.cloud/docs/guides/billing-and-plans/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/guides/billing-and-plans.md > AdCopilot's plans are sized by how many Google Ads accounts you run, with a daily operations cap. A new workspace starts on a 7-day Pro trial and moves to Free — never a lockout. AdCopilot is sized on one axis: **how many Google Ads accounts** a plan runs at once. There is a real Free plan, and a new workspace starts on a full Pro trial. ## Plans | Plan | Google Ads accounts | Included operations a day | Price a month | | ------- | ------------------- | ------------------------- | ------------- | | Free | 1 | 10 | $0 | | Starter | 3 | 500 | $19 | | Plus | 10 | 2,000 | $79 | | Pro | 50 | no cap | $249 | Every plan includes every product: Google Ads, Google Analytics 4, Search Console and Tag Manager, and every tool. Prices are listed in US dollars; you can also pay in rupees (INR) at checkout, at the rupee price the Billing page shows. Applicable taxes are shown before you pay. The [pricing page](https://adcopilot.cloud/pricing) is always the current list. ## What the numbers mean * **Accounts** — how many Google Ads accounts you can have switched on at once. This is what a plan is sized by. * **Operations** — one operation is one successful tool call. Some calls are not counted: `get_resource_metadata` and `list_accessible_customers` (the assistant's own bookkeeping), and AdCopilot's own `get_org_context` and `save_org_context`. The day resets at midnight IST; when AdCopilot knows your Google Ads account's time zone, the cap message gives the reset in your time. * **Free stops at 10.** Free includes 10 operations a day and has no grace day: once the 10 are used, calls are refused until the reset. * **One grace day a week on Starter and Plus.** The first day in any 7 that a Starter or Plus workspace goes over its cap finishes normally, with a note. After that, calls over the cap are refused until the reset. * **Free is a real plan**, not a demo: one account, for as long as you like. * **Teammates** are separate from the plan size. See [Team and seats](https://adcopilot.cloud/docs/guides/team-and-seats). ## The trial A new workspace starts on a **7-day Pro trial**: every tool, up to 50 accounts, no daily cap, no card. It is the biggest plan on purpose, so the week shows what AdCopilot does at your real workload. When the trial ends, the workspace **moves to Free automatically**. Nothing locks and nothing is deleted. Free keeps one Google Ads account switched on; choose which one under **Ad accounts** in **Google products**. The trial is one per person. An address that has already had one starts a new workspace on Free. ## Monthly or yearly Every paid plan can be bought **monthly or yearly**. Pick the interval on the Billing page before you choose a tier; the price shown on the card is the price you are charged. A yearly plan bills once for the year and renews on the same date. Today that's simply **12 times the monthly price** — yearly billing exists so you can pay once a year, not because it's discounted (a saving would show as a "Save N%" badge on the Billing page if one is ever turned on). Two details worth knowing: * **Extra team seats are billed monthly, so they aren't sold on a yearly plan** — support can't add them to a yearly workspace either. If you need seats, choose monthly billing when you subscribe, or contact us from the Billing page. * **Changing tier keeps your interval.** Moving from Starter to Plus on a yearly plan stays yearly. ## Changing plan Manage your plan from the **Billing** area of your workspace at [app.adcopilot.cloud](https://app.adcopilot.cloud). * **Moving off Free or the trial to a paid tier** starts a new subscription — you are charged today and the higher account and ops limits apply as soon as the payment is confirmed. * **Changing tier on an existing paid plan** takes effect at your next renewal, and you keep your current tier's limits until then. How it is set up depends on the currency you pay in: * **On a US-dollar plan**, the change is scheduled for your next renewal, and you can cancel it from the Billing page any time before it takes effect. If your bank couldn't switch the subscription to a different plan, the Billing page says so, and trying again won't help: email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) and we set the new plan up to start when your current period ends. You keep your current plan until then, and you approve a new auto-pay mandate for the new plan at that point. * **On a rupee (INR) plan**, email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) — see below. ### Changing tier on a rupee plan Indian auto-pay mandates (UPI AutoPay, e-mandate and cards issued in India) can't be edited once they are approved, so a new plan needs a **new auto-pay mandate**. The Billing page doesn't set that up for a rupee plan. To change plan, email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) — we'll set it up for your next billing date. You keep your current plan and its limits until then, and you approve the new auto-pay mandate for the new plan when it starts. If a payment does not go through, see [Billing and payment issues](https://adcopilot.cloud/docs/troubleshooting/billing-payment). ## Cancelling Cancelling is **self-serve** — Billing → **Cancel subscription**. Before you confirm, the panel names when it takes effect — the exact date if we have one on file for your workspace, otherwise "the end of your current billing period" — and nothing changes before then: 1. **Until your paid-through date** — everything keeps working and you are not charged again. 2. **After it** — the workspace switches to **read-only**: your connectors keep answering questions and stop making changes. 3. **30 days later** — the workspace is suspended and the connectors pause. Your data and setup are kept at every step. You can subscribe again from the same page once your paid-through date has passed. If that date isn't on record for your workspace, the page asks you to write to [support@adcopilot.cloud](mailto:support@adcopilot.cloud) instead. ## Your daily usage The Billing page shows how many operations you have used today, against your plan's cap where you have one. If the cap has refused a call in the last seven days, it also shows how many times. Once you are at or over the cap on Starter or Plus, it shows whether your one grace day this week is covering today; on Free, it says the next call waits for the reset. The same meter appears on **Google products**, on **Home** and on **Usage**. Hitting the account limit or the daily ops cap does not delete anything or lose your work — it just pauses new operations until the next reset or an upgrade. See [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps). # Campaign and keyword changes Source: https://adcopilot.cloud/docs/guides/campaign-keyword-changes/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/guides/campaign-keyword-changes.md > Create campaigns and ad groups, add and adjust keywords, change bidding, pause what is underperforming — in plain words, each change proposed first, nothing deleted. Beyond auditing, AdCopilot builds and steers the account: campaigns, ad groups, ads, keywords, bids and targeting. Each change is proposed first and runs when you say yes, and pausing replaces deleting. ## Create a campaign > Create a Search campaign "Invoicing — Search" with a $30/day budget. AdCopilot needs to know your business and the daily amount you are comfortable with before it builds; if they are not saved yet, it asks. A campaign it builds with you is created **paused**, and it will not switch it on: that switch is yours, in Google Ads. See [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). For Performance Max, ask for a PMax campaign; it uses `create_performance_max_campaign`, which needs a business name and a logo asset. See [Performance Max](https://adcopilot.cloud/docs/tools/performance-max). ## Add ad groups, ads and keywords > Add an ad group "Templates" and these keywords as phrase match: ... The assistant proposes `create_ad_group`, `add_keywords` with your terms and match types, and `create_responsive_search_ad` with headlines and descriptions. `update_keyword` changes a keyword's bid or status. ## Change the budget or the bidding > Raise the daily budget on "Invoicing — Search" to $45. `update_campaign` changes the budget, dates, networks and bidding strategy. A budget above your comfortable daily budget goes through with a warning; a raise past your monthly cap is refused. Maximize Clicks needs a maximum cost per click. See [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). ## Pause what is underperforming > Pause the three keywords with the highest cost and zero conversions. It reads to find them, then proposes `update_keyword` → PAUSED for each. Pausing is reversible. AdCopilot never deletes; see [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). ## Targeting * `set_geo_targets` — locations to target or exclude. * `set_ad_schedule` — days and hours. * `set_device_bid_adjustment` — raise or lower bids by device. See [Targeting and bids](https://adcopilot.cloud/docs/tools/targeting). ## Count the right results If the account has no conversion action, AdCopilot can create one with `create_conversion_action` and give you the conversion ID and label your website tag needs. With Tag Manager connected, it can stage that tag for you to publish. See [Conversions and auto-apply](https://adcopilot.cloud/docs/tools/conversions). # The daily routine Source: https://adcopilot.cloud/docs/guides/daily-routine/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/guides/daily-routine.md > Run AdCopilot's morning Google Ads audit — a fixed, read-only six-check sequence that reports spend, wasted spend, negatives, disapprovals, and pacing, then proposes approval-gated fixes. The daily routine is a fixed, read-only audit followed by approval-gated proposals. The assistant **inspects and reports**, then **proposes** — it never changes the account on its own, and it can never delete. Ask for it with: > Run my AdCopilot morning audit. That runs AdCopilot's `morning-audit` prompt, which every connection has with nothing to install. Two more prompts come with it: `growth-audit` covers Google Ads plus whichever of Search Console, Analytics and Tag Manager you connected, and `weekly-report` is the Monday summary. Where the account's own analysis tools cover a check (wasted spend, negatives, pacing), the assistant calls `full_audit` and quotes its numbers instead of doing the arithmetic itself. ## Before you start * If the assistant does not know an account's **monthly plan cap** (budget target), it asks once. Without it, spend is reported as a raw number and the cap check is marked "no cap set." * It identifies accounts with `list_accessible_customers`, and consults `get_resource_metadata` rather than guessing a field name. ## The six checks Run in order, per connected account. Checks 2–6 use the `search` tool and are read-only. `cost_micros ÷ 1,000,000 = amount in the account currency`. Date ranges are never written into the query: pass `start_date` and `end_date` as `YYYY-MM-DD` and the connector adds the quoted `segments.date` filter itself. 1. **Accounts in scope** — `list_accessible_customers`. 2. **Spend vs plan cap** — month-to-date cost against the cap. `resource: campaign`, `fields: campaign.name, metrics.cost_micros`, with `start_date` = the 1st of the month and `end_date` = today, which reaches Google as: ```sql SELECT campaign.name, metrics.cost_micros FROM campaign WHERE segments.date BETWEEN '2026-09-01' AND '2026-09-16' ``` 3. **Wasted-spend ranking** — highest-cost search terms with little to show, flagging near-zero conversions. `resource: search_term_view`, `fields: search_term_view.search_term, metrics.cost_micros, metrics.conversions, metrics.clicks`, `orderings: metrics.cost_micros DESC`, `limit: 50`, and the last 30 days as two dates: ```sql SELECT search_term_view.search_term, metrics.cost_micros, metrics.conversions, metrics.clicks FROM search_term_view WHERE segments.date BETWEEN '2026-08-17' AND '2026-09-15' ORDER BY metrics.cost_micros DESC LIMIT 50 ``` 4. **Negative-keyword candidates** — the clearly off-intent terms from that ranking worth blocking. 5. **Disapprovals** — ads switched off by policy. No date range on this one: ```sql SELECT ad_group_ad.ad.id, ad_group_ad.policy_summary.approval_status, ad_group_ad.policy_summary.policy_topic_entries FROM ad_group_ad WHERE ad_group_ad.policy_summary.approval_status != 'APPROVED' ``` 6. **Pacing** — project month-end spend from MTD cost and the fraction of the month elapsed, compared to the cap. ## The report Each account ends with a compact table and a plain verdict per row — **OK**, **WATCH**, or **ACT**: ``` Account: — () Window: to Check Result Verdict Spend vs plan cap $X MTD of $Y cap OK Wasted spend $X on N zero-conversion terms ACT Negative candidates N off-intent terms ($X) ACT Disapprovals N ad(s) disapproved ACT Pacing projecting $X — Z% of cap WATCH ``` ## Turning ACT into proposals For each **ACT** row the assistant writes a specific, approvable proposal, then stops and waits for your yes: * **Wasted spend** → **pause** the offending keyword (`update_keyword` → PAUSED) or lower its bid. Never removed. * **Negative candidates** → `add_negative_keywords` with the exact terms and level. The connector can add a negative but cannot remove one, so reversing it is a Google Ads UI action — the assistant says so. * **Disapprovals** → surface the ad and its policy reason; the fix is usually a corrected ad you review. * **Pacing over cap** → reversible budget or bid changes; if a campaign must stop, **pause**, never delete. After an approved change, the assistant reports how to undo it — almost always the opposite call. ## Make it a habit: the daily check-in and the Monday summary Two artefacts, one habit. The **daily check-in** is this audit, run every morning. The **Monday summary** is the same read over the past week. Pick the recipe for the client you actually use — AdCopilot runs in the cloud, so the schedule lives in your client, or, when it ships, in AdCopilot on your explicit say-so (Recipe C), and nothing outside your control can put the account on a timer. ### Recipe A — Claude (Scheduled tasks) In Claude, open **Scheduled tasks → New task**. Set it to **Daily** at 08:00 (your time), and leave **"Require this computer" off** — AdCopilot runs in the cloud, so your machine doesn't need to be on. In **Instructions**, paste: > Use the AdCopilot connector's `growth-audit` prompt for *your business name*. > This is read-only — don't make any changes. Give me the Check / Result / > Verdict table in plain language, then the top 3 things to fix, most impactful > first, as numbered options. For the Monday summary, add a second task set to **Weekly, Monday 08:00** with: > Use the AdCopilot connector's `weekly-report` prompt for *your business name*. > Read-only. Run it once by hand first so you see what arrives and can supply the monthly plan cap. On Claude Code the same pair works, plus a `claude -p` cron one-liner if you prefer the terminal. ### Recipe B — ChatGPT (Tasks) ChatGPT does not list connector prompts, so the task is written in plain English instead: > Every day at 8am, run my AdCopilot growth audit and message me the summary. > Every Monday at 8am, send me my AdCopilot weekly report. Check that the task lists the AdCopilot connector, then trigger it once by hand. Honest caveat: **if ChatGPT lets you** — we have not yet verified that a scheduled ChatGPT Task can call a connector's tools, so if the first run comes back empty, use Recipe A instead. ### Recipe C — AdCopilot running it for you (not yet) AdCopilot running the check-in **on its own schedule, server-side** is a paid feature that **does not run yet**. There is a Routine card in the app, and it refuses with that message rather than pretending — nothing you can switch on there will put your account on a timer today. When it ships it will be **included from Starter**, and the click on that card will be the consent record: a routine will never be switchable on from inside an AI client. Nothing about Recipes A and B changes when it lands — the bring-your-own-scheduler path stays free on every plan, including Free. # Negative-keyword sweep Source: https://adcopilot.cloud/docs/guides/negative-keyword-sweep/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/guides/negative-keyword-sweep.md > Find the search terms spending with nothing to show, and block the clearly off-intent ones with negative keywords — on a campaign, in a shared list, or across the account. Every negative is proposed first. A negative-keyword sweep is the highest-leverage recurring cleanup in most Search accounts: find the searches that triggered your ads but should not have, and block them so the budget stops leaking. ## Ask for it > Find wasted spend in the last 30 days and propose negative keywords. ## What the assistant does 1. **Groups the search terms by theme.** `analyze_search_terms` sorts the last 30 days of search terms into negative-keyword candidates: people looking for information, jobs, something free, a competitor, and anything you told AdCopilot never to show for. It returns one ready-to-run `add_negative_keywords` call per theme, with the numbers behind it. Competitor terms are checked only if you have saved competitors in your business profile; AdCopilot never guesses one. 2. **Checks the spend.** `analyze_waste` names the zero-converting search terms and keywords. If it asks for raw rows instead, it runs a read-only `search` over the search-term view. The window is two `YYYY-MM-DD` dates (`start_date` / `end_date`), and AdCopilot builds the quoted `segments.date` filter: ```sql SELECT search_term_view.search_term, metrics.cost_micros, metrics.conversions, metrics.clicks FROM search_term_view WHERE segments.date BETWEEN '2026-08-17' AND '2026-09-15' ORDER BY metrics.cost_micros DESC LIMIT 50 ``` 3. **Separates intent from noise.** Not every zero-conversion term is waste; some are new or seasonal. Only the clearly off-intent ones become proposals. 4. **Proposes the block** with the exact terms, match type and level, and waits for your yes. ## Choosing the level | Level | Tool | Use it for | | ----------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | One campaign | `add_negative_keywords` | Terms wrong for this campaign only. | | A shared list | `create_negative_keyword_list`, `add_to_negative_keyword_list`, `attach_negative_keyword_list` | Terms wrong for several campaigns; attach the list to each. | | The whole account | `add_account_negatives` | Terms that should never trigger any ad. | **Match type** matters: a phrase-match negative blocks any search containing the phrase; exact blocks only that exact search. The assistant proposes a default and explains it; change it before you approve. AdCopilot can **add** a negative keyword but cannot **remove** one — removing a negative is done in the Google Ads interface. Because a negative is hard to undo here, read the exact terms before you approve. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). # Team and seats Source: https://adcopilot.cloud/docs/guides/team-and-seats/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/guides/team-and-seats.md > Invite teammates to a workspace to share connected accounts. Each plan includes seats and more are a paid add-on; plans themselves are sized by accounts, not seats. A workspace can be shared. Invite teammates so more than one person can work with the same connected Google Ads accounts from their own AI clients. ## Inviting teammates From your workspace at [app.adcopilot.cloud](https://app.adcopilot.cloud), the workspace owner can invite people by email. Each teammate signs in with their own Google account and works within the workspace's connected accounts. ## Seats are not the tier — they are an add-on Plans are sized by **how many Google Ads accounts** a workspace runs — see [Billing and plans](https://adcopilot.cloud/docs/guides/billing-and-plans). Teammates are a separate, orthogonal axis: each plan includes a number of seats. | Plan | Seats included | | ------- | -------------- | | Free | 1 | | Starter | 1 | | Plus | 3 | | Pro | 10 | More seats are an add-on on the paid plans, at **$19 per seat per month (₹1,249 on rupee billing)**, flat across the paid plans. **Free includes one seat**, and Free cannot add seats: a Free workspace that needs a second person moves to a paid plan first. When a workspace is full, the invite page tells the person joining to ask the owner, and the owner sees the seat price on their own Team page. **Adding a seat goes through support today.** There is no seat control in the app: the Team page tells a Free owner what a seat costs and which plan has them, and tells a paid owner to write to [support@atromx.com](mailto:support@atromx.com) — we add it the same day. Switching a teammate off is the same: write to us, or ask us to move the seat. The Team page changes a teammate's **role**, not their seat. Nobody's Google account is touched by any of it. Extra seats are **not available on yearly billing yet**. The add-on is priced per month and has no annual form, so a yearly workspace that needs another seat should contact us from the billing page. ## Roles and access * The **owner** manages billing, the plan, and who is in the workspace. * **Members** work with the connected accounts through their own AI clients, under the same [approval-gated](https://adcopilot.cloud/docs/concepts/approval-gated-writes), can-never-delete rules that apply to everyone. * **Viewers** can read but not change anything. The owner sets each teammate's role on the **Team** page. ## Multiple workspaces You can belong to more than one workspace — for example your own and a client's. Switch between them from the sidebar; each has its own connected accounts. The connector URL is the same for all of them: when you approve an assistant, you pick the workspace it may use. See [Accounts and scope](https://adcopilot.cloud/docs/concepts/accounts-and-scope). # Ad group and ad tools Source: https://adcopilot.cloud/docs/tools/ad-groups/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/ad-groups.md > Structure below the campaign — ad groups, responsive search ads, and ad status. All writes, each proposed first. The structure below a campaign. All are **writes**: proposed first, run when you say yes. ## create\_ad\_group **Write.** Creates an ad group in a campaign, with a default max CPC. > Add an ad group "Templates" to "Invoicing — Search". ## update\_ad\_group **Write.** Changes an ad group's name, status or default max CPC. > Rename ad group "Templates" to "Invoice templates" and set its default bid to > $1.20. ## create\_responsive\_search\_ad **Write.** Creates a responsive search ad from several headlines and descriptions; Google assembles the combinations. > Create a responsive search ad in "Invoice templates" with these headlines and > descriptions: ... ## update\_ad\_status **Write.** Enables or pauses an ad. `REMOVED` is refused; pause instead. To fix a disapproved ad, read its policy reason first, then write a corrected ad. > Pause ad 12345 in "Invoice templates". # AdCopilot tools Source: https://adcopilot.cloud/docs/tools/adcopilot/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/adcopilot.md > get_org_context, the call every conversation starts with, and save_org_context, which remembers your business between conversations. Neither counts against your daily operations. Two tools belong to AdCopilot itself rather than to a Google product. They work on every plan, with nothing connected, and neither counts against your daily operations. ## get\_org\_context **Read.** The starting point of every conversation. It returns what this workspace has connected, which Google Ads accounts are switched on, the state the account is in, your saved business profile, your plan and today's usage, and the next step. The assistant calls it before any other tool, and does what it says. > Get me started with AdCopilot It also keeps your assistant's tool list honest: * If your connection is missing tools that exist now, it says how many, names a few, and says how to reconnect your assistant. * Every tool description ends with a line `Tools revision: .` `get_org_context` reports the current code. If a description your assistant holds ends with a different code, or the line is missing, `get_org_context(tools=[…])` returns the current text of up to ten named tools. See [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). ## save\_org\_context **Write.** Saves what you told AdCopilot about your business (what you sell, where your customers are, your comfortable daily budget and monthly cap), how far you have got, and a note of the session, so the next conversation carries on from there. It saves only what you said. Some things cannot be changed from a conversation: how much you already know about Google Ads (it changes what AdCopilot lets the assistant do) and the record of the first campaign AdCopilot built with you. Those are in the **Business profile** on the dashboard's Home page. A viewer, or a read-only workspace, cannot save. # Keyword and negative tools Source: https://adcopilot.cloud/docs/tools/ads-keywords/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/ads-keywords.md > Add keywords, change their bids and status, and block off-intent searches with negatives — on one campaign, in a shared list, or across the account. A negative can be added here but not removed. All are **writes**: proposed first, run when you say yes. ## add\_keywords **Write.** Adds keywords to an ad group, with their match types. > Add these phrase-match keywords to "Invoice templates": "invoice template", > "invoice maker". ## update\_keyword **Write.** Changes a keyword's status or bid. This is how AdCopilot **pauses** a wasteful keyword rather than deleting it. > Pause "free invoice maker" — it spent $180 last month with no conversions. ## add\_negative\_keywords **Write.** Adds negative keywords to one campaign. > Block "jobs" and "salary" as negatives on "Invoicing — Search". ## Shared negative keyword lists One blocklist that many campaigns share. * `create_negative_keyword_list` — **Write.** Creates a list, optionally with its keywords. It does nothing until it is attached. * `add_to_negative_keyword_list` — **Write.** Adds keywords to an existing list. * `attach_negative_keyword_list` — **Write.** Attaches a list to a campaign. > Make a "Never show" list with "free", "jobs" and "template download", and > attach it to all my Search campaigns. ## add\_account\_negatives **Write.** Adds words blocked in every campaign, through the account's single account-level list (Google allows one, of up to 1,000 keywords). AdCopilot can **add** negatives but cannot **remove** them, or detach a list — that is done in the Google Ads interface. Read the exact terms before you approve. See the [negative-keyword sweep](https://adcopilot.cloud/docs/guides/negative-keyword-sweep). # Analysis and audit tools Source: https://adcopilot.cloud/docs/tools/analysis/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/analysis.md > AdCopilot's eleven read-only analysis tools as of v2.16.0 — full_audit, account_health_score and nine focused lenses. They do the arithmetic on AdCopilot's side and quote the numbers they measured. These tools are AdCopilot's own, not part of Google's server. Each reads the account, runs the same rules with the same thresholds every time, and returns findings with the numbers it measured and a next step: the call that would fix it where AdCopilot has one, otherwise the steps in Google Ads. None of them changes anything. What each check measures is in [Audit checks](https://adcopilot.cloud/docs/checks/conversion_tracking). ## full\_audit **Read.** Audits conversion tracking, wasted spend, structure, keywords, ads and settings. Findings come failures first, then by each check's severity, not by the amount measured. Some carry a fixing call; the rest name the steps in Google Ads. * `depth="quick"` (the default) scores three of the 73 checks over this month to date, whatever `days` says, and does not grade the account. `days` and `sections` shape a deep audit only. * `depth="deep"` attempts all 73, scores each one the account has data for, and gives a 0-100 health score. `sections=[…]` narrows a deep audit to some of the six areas. * If Google is slow, a deep audit stops waiting after 45 seconds and returns what finished. Checks that did not get their data are listed as not evaluated, never scored. See [An audit returned partial results](https://adcopilot.cloud/docs/troubleshooting/audit-partial). * A check that finds too little or nothing to measure is not evaluated and is left out of the score, and its row in the not-evaluated list says why. On a new account that covers keywords Google has not given a Quality Score yet, a click-through rate on fewer than 1,000 impressions, and anything ranked by spend before anything has spent. On any account it also covers a check whose subject is not set up, such as the conversion checks when no primary conversion action is enabled. The audit says in one line how many checks that was. > Run a deep audit of my Google Ads account. ## account\_health\_score **Read.** One number: the weighted 0-100 health score across the 73 checks, its letter grade, the score per category, and how many checks could be evaluated. No findings. If fewer than half the checks could be evaluated, there is no score, and it says why. ## The nine lenses | Tool | What it answers | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `analyze_waste` | Where money goes with nothing to show: zero-converting search terms and keywords, broad match on manual bidding, campaigns under 1.0 ROAS. | | `analyze_search_terms` | Negative-keyword candidates by theme (information, jobs, free, competitors, your never-show-for list), with one ready-to-run `add_negative_keywords` call per theme. | | `keyword_opportunities` | Search terms that convert but are not keywords, converting keywords losing impression share to rank, and negatives that block a converting term. | | `quality_score_breakdown` | Quality Score split into expected CTR, ad relevance and landing-page experience, weighted by impressions, with the worst high-spend keywords named. | | `rsa_asset_report` | Every responsive search ad headline and description with Google's BEST / GOOD / LOW label, ad strength, counts, pinning and creative age. | | `conversion_setup_audit` | Whether conversion tracking can be trusted: primary actions, enhanced conversions, attribution, values, duplicate counting, GA4 link, consent mode, tag firing. | | `bidding_audit` | Bid strategies against the account's own conversion volume: manual bidding with enough data, unrealistic targets, campaigns stuck learning. | | `budget_pacing` | This month's projected spend against each daily budget, in the account's time zone. A budget several campaigns share is projected once, on their combined spend. `month` is `YYYY-MM`. | | `day_of_week` | 90 days of cost and conversions by day and hour, naming the day-parts that lose money and the ones that are underserved. | ## Output Each tool takes `detail="summary"` or `"full"` and `render="json"`, `"markdown"` or `"both"`. Every result carries a `coverage` block that names the checks not evaluated and why. Read it before reading a result as a clean bill of health. A workspace has a daily budget of fresh Google reads for analysis. Once it is spent, the tools answer from cached data and say so; fresh audits resume at midnight IST. # Asset tools Source: https://adcopilot.cloud/docs/tools/assets/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/assets.md > Sitelinks, callouts, calls, images, promotions, prices, lead forms and more — create them, link them at campaign, ad group or account level, and pause or re-enable a link. All writes, each proposed first. Assets are the extra pieces that ride along with your ads: links, phone numbers, promotions, images and more. AdCopilot can create each type, link it where it should appear, and pause or re-enable a link. All of these are **writes**. ## Creating assets | Tool | Creates | | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `create_sitelink_asset` | A sitelink: an extra link below your ad. | | `create_callout_asset` | A callout: short text such as "Free shipping". | | `create_structured_snippet_asset` | A structured snippet: a header and a list of values. | | `create_call_asset` | A phone number people can call from the ad. | | `create_image_asset` | An image (PNG or JPEG, up to 5120 KB) from a public image URL or a `data:` URI. AdCopilot is hosted and cannot read files on your computer, so pass the image itself as a `data:` URI. | | `create_promotion_asset` | A promotion: a sale or special offer. | | `create_price_asset` | Products or services with prices. | | `create_lead_form_asset` | A form that collects details directly from the ad. | | `create_text_asset` | A headline, description or long headline for a Performance Max asset group. | | `create_youtube_video_asset` | A YouTube video for Performance Max. | > Create a sitelink to our pricing page titled "See pricing". ## Linking assets | Tool | Links an asset to | | ------------------------- | ---------------------------------- | | `link_asset_to_campaign` | A campaign. | | `link_asset_to_ad_group` | An ad group. | | `link_assets_to_customer` | The whole account: every campaign. | > Link that sitelink to "Invoicing — Search". ## Pausing and re-enabling a link | Tool | Changes a link on | | --------------------------- | ----------------- | | `set_campaign_asset_status` | One campaign. | | `set_ad_group_asset_status` | One ad group. | | `set_customer_asset_status` | The account. | `PAUSED` stops the asset serving there; the asset and its other links are untouched. `ENABLED` switches it back on. `REMOVED` is refused. Find the link first with `list_asset_links` (see [Read and report](https://adcopilot.cloud/docs/tools/read)). > Stop showing the old phone number on "Invoicing — Search". ## Asset groups (Performance Max) | Tool | Does | | --------------------------- | ------------------------------------------------------------------------- | | `create_asset_group` | Creates a PMax asset group and links the assets you give it, in one step. | | `add_assets_to_asset_group` | Adds more assets to an existing asset group. | See [Performance Max](https://adcopilot.cloud/docs/tools/performance-max). AdCopilot never deletes an asset or removes a link: `remove_campaign_asset` and `remove_asset_from_asset_group` are withheld. Pause the link instead. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). # Campaign tools Source: https://adcopilot.cloud/docs/tools/campaigns/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/campaigns.md > Create Search and Performance Max campaigns with a budget, change budgets, networks and bidding, and pause or re-enable campaigns. Every write is proposed first and checked against your saved budget. These tools create and steer campaigns. All are **writes**: proposed first, run when you say yes. All four are checked against your saved budget on AdCopilot's server; see [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). ## create\_campaign **Write.** Creates a campaign with a budget. Search campaigns are built conservatively on purpose: Google search on, Search partners off, the Display Network off, and location targeting set to people actually in the places you target. Ask for the looser settings if you want them. > Create a Search campaign "Invoicing — Search" with a $30/day budget. A campaign AdCopilot builds with you is created paused, and it will not switch it on for you. ## create\_performance\_max\_campaign **Write.** Creates a Performance Max campaign with a budget, a business name and a logo. See [Performance Max](https://adcopilot.cloud/docs/tools/performance-max). ## update\_campaign **Write.** Changes an existing campaign: name, status, daily budget, start and end dates, Search partners, the Display Network, location targeting type, and bidding strategy (with its target CPA, target ROAS or maximum cost per click). > Raise the daily budget on "Invoicing — Search" to $45. A budget above your comfortable daily budget goes through with a warning. A raise past your monthly cap, and Maximize Clicks with no per-click cap, are refused. ## set\_campaign\_status **Write.** Enables or pauses a campaign. `REMOVED` is refused: pausing is the reversible stand-in for deleting. > Pause "Holiday — Search"; we are done for the season. # Conversions and auto-apply Source: https://adcopilot.cloud/docs/tools/conversions/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/conversions.md > Create a Google Ads conversion action and get the ID and label its tag needs, and pause the recommendation types Google applies to your account without asking. ## create\_conversion\_action **Write.** Creates a conversion action (what the account counts as a result) and returns the conversion ID and label its website tag needs. * Only website conversions (type `WEBPAGE`) can be created. Conversions imported from Google Analytics cannot be created through the Google Ads API, and are refused with an explanation. * It creates one enabled action and changes nothing else. * Nothing is counted until the tag is on your site. With Tag Manager connected, AdCopilot can stage a "Google Ads Conversion Tracking" tag with that ID and label; you publish the container yourself. See [Tag Manager](https://adcopilot.cloud/docs/tools/tag-manager). > Set up a conversion for sign-ups on my thank-you page. ## Auto-apply recommendations Google can apply some recommendation types to your account without asking. * `list_auto_apply_subscriptions` — **Read.** Which types are on. The Google Ads API covers only some types; the rest can only be seen and changed in the Google Ads interface, and the answer names them. * `pause_auto_apply_subscription` — **Write.** Pauses one type. It cannot switch a type on, create one or remove one. > Stop Google auto-applying broad match to my account. # Google Analytics tools Source: https://adcopilot.cloud/docs/tools/google-analytics/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/google-analytics.md > The 23 Google Analytics tools as of v2.16.0 — 11 reads (reports, realtime, funnels, and your properties' setup) and 12 writes (conversions, custom definitions, data streams, properties, and the link to Google Ads). None deletes. Available once you connect Google Analytics in **Google products**. The writes need **Enable editing** on the Analytics card; with **Read-only access** your assistant can read but not change anything. There is no delete or archive tool. ## Reports (read) | Tool | What it does | | ------------------------- | ---------------------------------------------------- | | `ga4_run_report` | Any report: dimensions by metrics over a date range. | | `ga4_run_realtime_report` | The last \~30 minutes. | | `ga4_run_funnel_report` | An ordered funnel of steps over a date range. | | `ga4_get_metadata` | The dimensions and metrics a property has. | > Which landing pages turned paid clicks into sign-ups last month? ## Setup (read) | Tool | Lists | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ga4_list_account_summaries` | The Analytics accounts and properties your login can reach. | | `ga4_list_properties` | The properties under an account. | | `ga4_list_data_streams` | A property's data streams. | | `ga4_list_conversion_events` | Events marked as conversions (key events). If events Analytics collects on every visit (`page_view`, `session_start`, `first_visit`, `user_engagement`) are among them, it names them and the step that unmarks them in Analytics. | | `ga4_list_custom_dimensions` | Custom dimensions. | | `ga4_list_custom_metrics` | Custom metrics. | | `ga4_list_google_ads_links` | The property's links to Google Ads. | ## Changes (write) | Tool | What it does | | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | `ga4_create_google_ads_link` | Links a property to a Google Ads account, so its key events can be imported as conversions. There is no unlink tool. | | `ga4_create_conversion_event` / `ga4_update_conversion_event` | Marks an event as a conversion, or changes how it is counted. | | `ga4_create_custom_dimension` / `ga4_update_custom_dimension` | Adds or renames a custom dimension. | | `ga4_create_custom_metric` / `ga4_update_custom_metric` | Adds or renames a custom metric. | | `ga4_create_data_stream` / `ga4_update_data_stream` | Adds a website data stream (it gives the measurement ID), or renames one. | | `ga4_update_property` | Changes a property's settings. | | `ga4_create_property` | Creates a property under an account, in the Google Ads account's time zone and currency. | | `ga4_provision_account` | Starts a new Analytics account for a login that has none. It returns a link where you accept Google's Analytics terms yourself; only you can. | > Link my Analytics property to my Google Ads account. # Tool reference Source: https://adcopilot.cloud/docs/tools/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools.md > Every AdCopilot tool, by product — 103 on the full tier, whichever of Google Ads, Google Analytics 4, Search Console and Tag Manager are connected. The four Google Ads remove tools are never exposed. You rarely call a tool by name. You ask in plain words and the assistant picks the tool. This reference is here so you know what is possible and can read what the assistant proposes. ## The counts Your assistant sees every product's tools from the day it connects, plus AdCopilot's own two, whichever products are connected. A tool for a product you have not connected yet answers with the link to connect it: connecting the product is what lets its tools run. | Product | Tools | Read | Write | Page | | ------------------ | ------- | ------ | ------ | ------------------------------------------- | | AdCopilot | 2 | 1 | 1 | [AdCopilot tools](https://adcopilot.cloud/docs/tools/adcopilot) | | Google Ads | 54 | 16 | 38 | the Google Ads pages below | | Google Analytics 4 | 23 | 11 | 12 | [Google Analytics](https://adcopilot.cloud/docs/tools/google-analytics) | | Search Console | 6 | 4 | 2 | [Search Console](https://adcopilot.cloud/docs/tools/search-console) | | Tag Manager | 18 | 9 | 9 | [Tag Manager](https://adcopilot.cloud/docs/tools/tag-manager) | | **The whole list** | **103** | **41** | **62** | | A workspace on the read-only tier sees only the reads, 41, whichever products are connected. Two cases list fewer: a connection approved before 10 September 2026, which carries Google Ads access only, and a client that asks for narrower access than the default. Remove and re-add the AdCopilot connector in your AI client to get the whole list. ## Google Ads As of v2.16.0, the 54 Google Ads tools are 43 from our fork of Google's own Google Ads MCP server (Apache-2.0; not affiliated with or endorsed by Google) and eleven read-only analysis tools of AdCopilot's own. The fork implements 47; the four that delete are never exposed. ## The four withheld tools They exist in the fork and are **never exposed** by AdCopilot: | Tool | Use instead | | ------------------------------- | ------------------------------------------------------------ | | `remove_ad` | `update_ad_status` → PAUSED | | `remove_keyword` | `update_keyword` → PAUSED | | `remove_campaign_asset` | `set_campaign_asset_status` → PAUSED | | `remove_asset_from_asset_group` | Pause the campaign, or remove it in the Google Ads interface | Any call that sets a status to `REMOVED` is refused too. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). ## When a tool is missing Your assistant loads the tool list when it connects. If a tool on these pages is missing, or behaves differently from what it says here, see [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). # Performance Max Source: https://adcopilot.cloud/docs/tools/performance-max/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/performance-max.md > How AdCopilot builds a Performance Max campaign — the campaign with a business name and logo, then an asset group holding the text, image and video that feed it. A Performance Max campaign is a campaign plus an **asset group** that holds the creative. AdCopilot builds both with writes you approve one at a time. ## The pieces ### The assets [#the-assets] Create what the campaign and asset group need: * `create_text_asset` — headlines, descriptions and long headlines, and the business name. * `create_image_asset` — the logo and images (PNG or JPEG, up to 5120 KB) from a public image URL or a `data:` URI. * `create_youtube_video_asset` — a YouTube video. ### The campaign [#the-campaign] `create_performance_max_campaign` creates the campaign with a budget, the business name and the logo. Performance Max requires both at creation. It is checked against your saved budget like any other campaign; see [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). ### The asset group [#the-asset-group] `create_asset_group` creates the asset group and links every asset you give it in one step. Add more later with `add_assets_to_asset_group`. ## Example > Create a Performance Max campaign for "Acme Templates" at $50/day, then build > an asset group with these headlines, descriptions, images and this YouTube > video: ... The assistant proposes each write in turn and waits for your yes. See the [asset tools](https://adcopilot.cloud/docs/tools/assets) and the [campaign tools](https://adcopilot.cloud/docs/tools/campaigns). AdCopilot can build and extend a Performance Max campaign but never deletes — `remove_asset_from_asset_group` is withheld. Pausing the campaign is the reversible way to stop it. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). # Read and report tools Source: https://adcopilot.cloud/docs/tools/read/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/read.md > The Google Ads reading tools — search over every reportable resource, account discovery, schema lookups, asset links and auto-apply subscriptions. None of them changes anything. These tools only read. They run without a proposal because they never change anything. See [Read vs write](https://adcopilot.cloud/docs/concepts/read-vs-write). ## search **Read.** Any Google Ads report, in Google's query language (GAQL): campaigns, ad groups, keywords, search terms, metrics, policy status, change history and more. > Show me last month's spend and conversions by campaign. You never write the date range into the query. Pass `start_date` and `end_date` as `YYYY-MM-DD` and AdCopilot adds the correctly quoted `segments.date` filter: * `resource`: `campaign` * `fields`: `campaign.name`, `metrics.cost_micros`, `metrics.conversions` * `start_date`: `2026-08-01` * `end_date`: `2026-08-31` * `orderings`: `metrics.cost_micros DESC` which reaches Google as: ```sql SELECT campaign.name, metrics.cost_micros, metrics.conversions FROM campaign WHERE segments.date BETWEEN '2026-08-01' AND '2026-08-31' ORDER BY metrics.cost_micros DESC ``` The two dates take `YYYY-MM-DD` only, not shortcut tokens. Anything hand-written into `conditions` is passed through untouched, which is the usual source of date syntax errors, so send the two dates instead. Money comes back in micros: `cost_micros ÷ 1,000,000` is the amount in the account's currency. ## list\_accessible\_customers **Read.** The Google Ads accounts your Google sign-in can reach. Not counted against your daily operations. See [Accounts and scope](https://adcopilot.cloud/docs/concepts/accounts-and-scope). > Which Google Ads accounts can I act on? ## get\_resource\_metadata **Read.** The fields you can select, filter and sort on for a resource, so the assistant builds a correct query instead of guessing a field name. Not counted against your daily operations. > What fields can I query on the search term view? ## list\_asset\_links **Read.** Every asset link in the account, at account, campaign and ad group level: which phone numbers, sitelinks and callouts are on, where, whether Google is serving them, and the call that pauses or re-enables each. > Which phone numbers are on my ads, and where? ## list\_auto\_apply\_subscriptions **Read.** The recommendation types Google is allowed to apply to the account without asking. The Google Ads API covers only some of them; the rest are named as visible only in the Google Ads interface, so this list alone never proves auto-apply is fully off. > Is Google auto-applying any recommendations on my account? # Search Console tools Source: https://adcopilot.cloud/docs/tools/search-console/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/search-console.md > The 6 Search Console tools as of v2.16.0 — 4 reads (search performance, sites, sitemaps, URL inspection) and 2 writes (submit a sitemap, request indexing). None deletes. Available once you connect Search Console in **Google products**. Search Console shows what you already rank for without paying, which helps decide what not to buy in Google Ads. | Tool | Kind | What it does | | ---------------------- | ----- | --------------------------------------------------------------------------------------------------- | | `gsc_search_analytics` | Read | Clicks, impressions, CTR and position for a verified site, by query, page, country, device or date. | | `gsc_list_sites` | Read | The Search Console properties your login can reach. | | `gsc_list_sitemaps` | Read | The sitemaps submitted for a site. | | `gsc_inspect_url` | Read | Index status and coverage for one URL. | | `gsc_submit_sitemap` | Write | Submits or re-submits a sitemap. | | `gsc_request_indexing` | Write | Asks Google to crawl a URL again, through Google's Indexing API. | > Which searches do I already rank for in the top three, so I can stop paying > for them? # Tag Manager tools Source: https://adcopilot.cloud/docs/tools/tag-manager/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/tag-manager.md > The 18 Tag Manager tools as of v2.16.0 — 9 reads and 9 writes. Every change is staged in AdCopilot's own workspace in your container and never published; you publish. Nothing is deleted. Available once you connect Tag Manager in **Google products**. The writes need **Enable editing** on the Tag Manager card. ## Staged, never published Every change is made in a workspace AdCopilot manages inside your container. AdCopilot **never publishes**: nothing reaches your site until you review the workspace in Tag Manager and publish it yourself. There is no delete tool, and a built-in variable can be enabled but not disabled. ## Reads | Tool | Lists | | ----------------------------- | ---------------------------------------------- | | `gtm_list_accounts` | The Tag Manager accounts your login can reach. | | `gtm_list_containers` | The containers in an account. | | `gtm_list_workspaces` | A container's draft workspaces. | | `gtm_list_version_headers` | A container's published version history. | | `gtm_list_tags` | Tags in a workspace. | | `gtm_list_triggers` | Triggers in a workspace. | | `gtm_list_variables` | User-defined variables in a workspace. | | `gtm_list_folders` | Folders in a workspace. | | `gtm_list_built_in_variables` | The built-in variables switched on. | ## Writes (staged) | Tool | What it does | | --------------------------------------------- | ----------------------------------------------------- | | `gtm_create_tag` / `gtm_update_tag` | Adds or changes a tag, with the triggers it fires on. | | `gtm_create_trigger` / `gtm_update_trigger` | Adds or changes a trigger. | | `gtm_create_variable` / `gtm_update_variable` | Adds or changes a user-defined variable. | | `gtm_create_folder` / `gtm_update_folder` | Adds or renames a folder. | | `gtm_enable_built_in_variable` | Switches on a built-in variable. | > Set up the Google Ads conversion tag for my thank-you page. A common pairing: `create_conversion_action` in Google Ads returns the conversion ID and label, and AdCopilot stages the "Google Ads Conversion Tracking" tag with them. See [Conversions and auto-apply](https://adcopilot.cloud/docs/tools/conversions). # Targeting and bid tools Source: https://adcopilot.cloud/docs/tools/targeting/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/tools/targeting.md > Where, when and on which devices your ads compete — locations, ad schedule and device bid adjustments. All writes, each proposed first. All are **writes**: proposed first, run when you say yes. ## set\_geo\_targets **Write.** Adds locations to target, or to exclude, on a campaign, using Google's location IDs (for example US = 2840, UK = 2826, Canada = 2124). > Target the United States and Canada only on "Invoicing — Search". ## set\_ad\_schedule **Write.** Sets the days and hours a campaign's ads show. > Only run "Invoicing — Search" on weekdays, 8am to 8pm. ## set\_device\_bid\_adjustment **Write.** Raises or lowers bids for mobile, desktop or tablet on a campaign. > Lower mobile bids by 20% on "Invoicing — Search". # Account not showing up Source: https://adcopilot.cloud/docs/troubleshooting/account-not-showing/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/account-not-showing.md > A Google Ads account you expect is missing, switched off, or refused. The usual causes and fixes, in order. Work through these in order. ## 1. Ask what AdCopilot can see Start a new chat and say **Get me started with AdCopilot**. `get_org_context` lists what is connected and which accounts are switched on. To see every account your Google sign-in can reach, ask: > List the Google Ads accounts I can act on. That calls `list_accessible_customers`. ## 2. Check your Google access * In the Google Ads interface, check the Google login you connected can open that account. * For an account you can open only through a manager (MCC) account, AdCopilot cannot reach it yet, and there is no manager ID to give the assistant: the connector never uses one sent on a call. Email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) with the account's name. * If the account belongs to a different Google login, use **Connect another account** in **Google products**. That switches your connection to that login; [Connect Google Ads](https://adcopilot.cloud/docs/getting-started/connect-google-ads) says what changes. * Under **Ad accounts** in **Google products**, **Refresh accounts** (owners) looks again for accounts your connected logins can reach. ## 3. It is switched off > Account 1234567890 is switched off for this workspace — switch it back on > at …/accounts, or Starter at $19/mo (₹1,499) includes 3 accounts. Only accounts switched **On** under **Ad accounts** in **Google products** are reachable. A workspace owner switches them on. When a trial ends and the workspace moves to Free, only one stays on; pick which. If the message instead says "This connector is not authorised for account …", AdCopilot has never seen that account in this workspace. Check steps 2 and 4. ## 4. Your plan's account limit | Plan | Accounts | | ------- | -------- | | Free | 1 | | Starter | 3 | | Plus | 10 | | Pro | 50 | At the limit, switch another account off or upgrade. See [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps). ## 5. Reconnect If your access changed recently, or AdCopilot says Google is no longer accepting its sign-in, see [Reconnecting](https://adcopilot.cloud/docs/getting-started/reconnect). A missing account is almost always Google access, a switched-off account, or the plan limit — not a bug. # An audit returned partial results Source: https://adcopilot.cloud/docs/troubleshooting/audit-partial/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/audit-partial.md > Why a full_audit lists checks as not evaluated, what it means when it reached its time limit or timed out, and how to get a complete run. An audit that could not read everything says so. A check that did not get its data is listed as **not evaluated**, with the reason, and is left out of the health score on both sides. It is never reported as a pass. Read the `coverage` block before reading a result as a clean bill of health. ## The audit reached its time limit Since v2.15.1, a deep `full_audit` stops waiting for Google after 45 seconds and returns what finished: > This audit reached its time limit before Google answered every read, so > these sections are incomplete: … Every check that did not get its data is in > the not-evaluated list; nothing was scored from missing data. Running the > audit again is usually faster, because the Google Ads reads that finished > are cached. What to do: * **Run it again.** The Google Ads reads that finished are cached, so the second run usually completes. A Tag Manager or Analytics read the time limit cut is named on the check it cost, with the time limit as the reason; it does not mean that connection is broken. * **Narrow it.** Ask for a deep audit of one area at a time, for example `sections=["wasted_spend"]`. The six areas are conversion tracking, wasted spend, structure, keywords, ads and assets, and settings and targeting. ## The audit timed out If a tool gets nothing back within 60 seconds, it returns no result at all: > full\_audit did not finish within 60 seconds because Google Ads was slow to > answer, so it returned no result. Nothing was changed in the account. Try once more; the cached reads make the second run faster. Or narrow it with `sections=[…]`. ## Other reasons checks are not evaluated | Message | Meaning | What to do | | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | "A quick audit runs N of the 73 checks and does not grade the account." | A quick audit is three checks by design. | Ask for a deep audit. | | "This first audit ran N of the 73 checks …" | The first audit is kept short. | Ask for a deep audit when you want the score. | | "No health score: only N of 73 checks could be evaluated on this account (under half) …" | The account lacks the data for most checks, often because it is new or has little traffic. | Nothing is wrong; the findings are still measured. | | "On this account, N of the checks had too little or nothing to measure in this window …" | Those checks found too little or nothing to measure. That can be no spend yet, too few impressions or keywords Google has not rated, or something not set up, such as no enabled primary conversion action. They are left out of the score, not counted against it. | Read the not-evaluated list of a deep `full_audit`: each row there says what that check found missing. Spend, impressions and ratings come with time and traffic; a missing setup needs to be set up. | | "This audit could not be scored: N checks were not read on this run …" | Reads failed on this run. | Run it again. | | "This audit hit its query budget …" | One audit has a ceiling on the reads it makes. | Run it with `sections` narrowed. | | "… over today's Google Ads analysis budget, so these findings come from cached data." | The workspace's daily budget of fresh analysis reads is spent. | Fresh audits resume at midnight IST. | | "Spend vs plan cap was not checked: no monthly cap is saved …" | No monthly cap in your business profile. | Tell AdCopilot your monthly cap. | | "Competitor search terms were not checked …" | No competitors saved. AdCopilot never guesses one. | Tell AdCopilot your competitors. | A quick audit ignores `sections`; it always runs the same checks. # Billing and payment issues Source: https://adcopilot.cloud/docs/troubleshooting/billing-payment/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/billing-payment.md > A payment did not go through, a plan change did not apply, or the workspace became read-only or inactive. Where to look and what each state means. Billing is on the **Billing** page at [app.adcopilot.cloud](https://app.adcopilot.cloud). Current prices are on the [pricing page](https://adcopilot.cloud/pricing). ## A payment did not go through * Cards issued outside India go through your bank's 3-D Secure or OTP check, and a card that cannot be challenged is declined. Try another card, or ask about invoicing by bank transfer for larger plans. * Retry from the **Billing** page. The workspace keeps working at first. * If a renewal stays unpaid for about a week, the workspace becomes **read-only**: your assistant can still read, and cannot make changes, until the payment goes through. * If it keeps failing, write to [support@adcopilot.cloud](mailto:support@adcopilot.cloud). ## A plan change did not seem to apply * **From Free or the trial to a paid plan**: the higher limits apply once the payment is confirmed. Reload the dashboard. * **Between paid plans, on a US-dollar plan**: the change is scheduled for your next renewal. You keep your current limits until then. The **Billing** page shows the scheduled change, and you can cancel it there. If the page says your bank couldn't switch the subscription to a different plan, trying again won't help: email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) and we set the new plan up to start when your current period ends. You approve a new auto-pay mandate for the new plan at that point. * **Between paid plans, on a rupee (INR) plan**: the **Billing** page doesn't change a rupee plan itself. To change plan, email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) — we'll set it up for your next billing date. You keep your current limits until then. * **On the day a paid-plan change starts**, the new limits apply once its first payment is confirmed. Reload the dashboard. See [Billing and plans](https://adcopilot.cloud/docs/guides/billing-and-plans#changing-tier-on-a-rupee-plan) for how a rupee plan change works. ## The workspace is read-only or inactive * **Read-only** after a cancelled subscription's paid-through date, or after about a week unpaid: reads work, changes do not. * **Inactive** 30 days after a cancelled subscription's paid-through date: AdCopilot says "Your subscription is inactive" and every call is refused. The owner can reactivate on the **Billing** page. Your data and setup are kept. See [Billing and plans](https://adcopilot.cloud/docs/guides/billing-and-plans) for how cancelling works. Reaching a plan limit is not a billing failure. See [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps). # Connecting ChatGPT Source: https://adcopilot.cloud/docs/troubleshooting/connect-chatgpt/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/connect-chatgpt.md > Fixes for connecting AdCopilot to ChatGPT — no developer mode switch, "No app tools available yet", ChatGPT searching the web instead of using AdCopilot, and the sign-in tab that keeps spinning. The full steps are in [Connect ChatGPT](https://adcopilot.cloud/docs/connect/chatgpt). These are the places people get stuck. ## No developer mode switch * Developer mode is in **Settings → Security and login**; scroll down past the other security settings. The link [chatgpt.com/#settings/Security](https://chatgpt.com/#settings/Security) opens the panel but does not scroll to it. * On a **Business, Enterprise or Edu** workspace, developer mode depends on your workspace's policy. Ask your ChatGPT admin to allow it. * It works on the **Free** plan; you do not need to pay for ChatGPT. ## No "Create MCP App" button Go to [chatgpt.com/plugins](https://chatgpt.com/plugins), press **+** at the top right and choose **Create app**. In the **New Plugin** box, ignore the file drop area; **Create MCP App** is at the bottom left. Don't use **Upload plugin**. If **+** only offers other options, check developer mode is on. ## No app tools available yet ChatGPT often shows **No app tools available yet** on the app's page right after you connect. It is ChatGPT's page catching up; our server has already answered. It does not need fixing. Open a new chat and type **@AdCopilot**. If AdCopilot still has no tools in a new chat, reconnect it: open the AdCopilot app in ChatGPT's settings and reconnect, or remove it and create it again with the same URL. ## ChatGPT searches the web instead ChatGPT decides for itself whether to use an app. Make the choice for it: start each new chat by typing **@AdCopilot** and picking it from the list, then ask. The AdCopilot chip in the message box means it will use AdCopilot. If AdCopilot is not in the @ list, check the app was created and approved (ChatGPT says **AdCopilot is installed.**) and that developer mode is still on. ## The sign-in tab keeps spinning After you press **Approve** on AdCopilot's page, the tab it returns to may spin without finishing. Close it and go back to the ChatGPT tab, which says **AdCopilot is installed.** The approval has already gone through; the dashboard's **AI assistants** page shows **Connected** once ChatGPT makes its first call. If ChatGPT did not say it is installed, press **Sign in with AdCopilot** again. ## "Elevated risk" ChatGPT labels developer mode, and every app added through it, **Elevated risk**, and warns that such apps could change or erase data. It says that of every app outside its directory. AdCopilot cannot delete, and it changes your accounts only when you ask. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). # Connecting Claude Source: https://adcopilot.cloud/docs/troubleshooting/connect-claude/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/connect-claude.md > Fixes for connecting AdCopilot to Claude — Claude asking permission before every report, Chrome's autofill covering the URL box, no Customize in the sidebar, and custom connectors in a Team or Enterprise organisation. The full steps are in [Connect Claude](https://adcopilot.cloud/docs/connect/claude). These are the places people get stuck. ## Claude asks permission before every report Claude starts every AdCopilot tool on **Needs approval**, so it asks ("Claude wants to use …") the first time each report or audit runs. To stop that for reads: 1. In Claude, open **Customize → Connectors** and choose **AdCopilot**. 2. Under **Tool permissions**, open the menu beside **Read-only tools** and choose **Always allow**. 3. Leave **Write/delete tools** on **Needs approval**. Changes still wait for your yes. AdCopilot proposes each one in the chat first, and it can never delete. See [Approval-gated writes](https://adcopilot.cloud/docs/concepts/approval-gated-writes). ## Chrome's autofill covers the URL box When you click the **MCP server URL** box, Chrome may drop its autofill list over it. Press **Esc** to close the list, then paste the URL: ```text https://mcp.adcopilot.cloud/mcp ``` ## I don't see Customize Claude's layout differs between accounts, and **Customize** is not always where the steps say. Use the direct link instead. It opens the **Add custom connector** box on every layout we have seen: [claude.ai/new?modal=add-custom-connector#customize/connectors/yours](https://claude.ai/new?modal=add-custom-connector#customize/connectors/yours). If you are signed out, Claude asks you to sign in first. ## Team or Enterprise organisation In a Claude Team or Enterprise organisation, adding custom connectors may be limited to the organisation's owners. If you can't add one, ask an owner to add AdCopilot with the same name and URL. # A Google product is not connected Source: https://adcopilot.cloud/docs/troubleshooting/google-product-access/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/google-product-access.md > When AdCopilot says Analytics, Search Console, Tag Manager or Google Ads isn't connected, isn't available through your assistant's authorisation, is read-only, or Google revoked its access — what each means and the fix. ## Not connected > Google Analytics 4 isn't connected to this workspace yet. Connect it at > app.adcopilot.cloud/accounts — then I can see which clicks turned into > enquiries. The product has never been connected to this workspace, or was disconnected. Open **Google products**, press **Connect** on the product's card and approve Google's consent screen. The product works on your assistant's next request; there is nothing to do in your AI app unless it cannot see the product (next section). ## Connected, but your assistant cannot see it > Google Analytics 4 is not available through this connector's current > authorisation — remove and re-add the AdCopilot connector in your AI client > to pick it up. Your assistant's approval does not cover the product: for example, it was approved when AdCopilot asked for Google Ads alone. An approval is fixed when it is given. In the dashboard open **Connections** and **Revoke** the app, and approve it when it next asks; or remove AdCopilot in your AI app and add it again. **Connections** marks such an app **Re-authorization needed**. See [Approve your assistant again](https://adcopilot.cloud/docs/getting-started/reconnect#approve-your-assistant-again). An assistant approved before 10 September 2026 was approved for Google Ads only. AdCopilot never widens an approval on its own, so the same remove and re-add is the way to give it Analytics, Search Console and Tag Manager. **Connections** lists the products each app was approved without, even before you connect them. ## Read-only access > Google Analytics 4 is connected read-only, so I can't make changes there. > Press Enable editing on its card at app.adcopilot.cloud/accounts and > approve Google's screen, then ask again. For Google Analytics and Tag Manager, the card in **Google products** says **Read-only access** or **Editing enabled**. Read-only access happens when the editing box was left unticked on Google's consent screen: AdCopilot can read the product but not change it, and the write tools are refused. Press **Enable editing** on the card and approve Google's consent screen; the write tools then work on the next request, with nothing to do in your AI app. ## Google revoked the access > Google is no longer accepting this connector's sign-in, so it cannot reach > your ads accounts. Reconnect your Google account at … — one click, and the > connector URL does not change. Google stops accepting a sign-in when you change your Google password, remove AdCopilot from your Google account's connected apps, or lose access to the account. Open the reconnect link in the message, or the same link in the email AdCopilot sends when it finds the sign-in refused. **Connections** shows the login as **Needs reauth** until you do. See [Reconnect troubleshooting](https://adcopilot.cloud/docs/troubleshooting/reconnect). If the sign-in belongs to a teammate: > Google is no longer accepting the sign-in for one of the accounts you reach > through this connector; its owner needs to reconnect it. AdCopilot emails that person. The other connections keep working. ## No connection reaches the product > No connection reaches Google Ads. Connect it, or ask an owner to share one > that can. Nobody in the workspace has connected that product in a way your account can use. Connect it yourself in **Google products**, or ask the workspace owner. # Troubleshooting Source: https://adcopilot.cloud/docs/troubleshooting/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting.md > Find the fix for what you are seeing — connecting Claude or ChatGPT, a missing or out-of-date tool, a partial audit, a budget refusal or warning, a plan cap, a Google product that is not connected, a missing account, reconnecting, and billing. Find what you are seeing, then follow the link. Every message AdCopilot sends says what happened and what to do; these pages say the same at more length. ## Connecting | What you see | Go to | | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | | Claude asks permission before every report | [Connecting Claude](https://adcopilot.cloud/docs/troubleshooting/connect-claude#claude-asks-permission-before-every-report) | | Chrome's autofill covers Claude's URL box | [Connecting Claude](https://adcopilot.cloud/docs/troubleshooting/connect-claude#chromes-autofill-covers-the-url-box) | | No **Customize** in Claude's sidebar | [Connecting Claude](https://adcopilot.cloud/docs/troubleshooting/connect-claude#i-dont-see-customize) | | Can't add a custom connector in a Claude Team or Enterprise organisation | [Connecting Claude](https://adcopilot.cloud/docs/troubleshooting/connect-claude#team-or-enterprise-organisation) | | No **Developer mode** switch in ChatGPT | [Connecting ChatGPT](https://adcopilot.cloud/docs/troubleshooting/connect-chatgpt#no-developer-mode-switch) | | ChatGPT says **No app tools available yet** | [Connecting ChatGPT](https://adcopilot.cloud/docs/troubleshooting/connect-chatgpt#no-app-tools-available-yet) | | ChatGPT searches the web instead of using AdCopilot | [Connecting ChatGPT](https://adcopilot.cloud/docs/troubleshooting/connect-chatgpt#chatgpt-searches-the-web-instead) | | The sign-in tab keeps spinning after **Approve** | [Connecting ChatGPT](https://adcopilot.cloud/docs/troubleshooting/connect-chatgpt#the-sign-in-tab-keeps-spinning) | | "Google is no longer accepting this connector's sign-in" | [Reconnect troubleshooting](https://adcopilot.cloud/docs/troubleshooting/reconnect) | ## Tools and audits | What you see | Go to | | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | A tool is missing, or AdCopilot says tools are "available but not in this connection's tool list" | [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing) | | "… tool descriptions changed after this connection's tool list was loaded" | [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing#a-description-is-out-of-date) | | An audit lists checks as not evaluated, or says it reached its time limit | [An audit returned partial results](https://adcopilot.cloud/docs/troubleshooting/audit-partial) | | "full\_audit did not finish within 60 seconds" | [An audit returned partial results](https://adcopilot.cloud/docs/troubleshooting/audit-partial#the-audit-timed-out) | ## Refusals and warnings | What you see | Go to | | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | "… above the comfortable daily budget on file … a heads-up, not a block" | [Budget refusals and warnings](https://adcopilot.cloud/docs/troubleshooting/money-fence#above-your-comfortable-daily-budget) | | "… above the monthly cap … on file" | [Budget refusals and warnings](https://adcopilot.cloud/docs/troubleshooting/money-fence#above-your-monthly-cap) | | "Maximize Clicks with no per-click cap …" | [Budget refusals and warnings](https://adcopilot.cloud/docs/troubleshooting/money-fence#maximize-clicks-with-no-per-click-cap) | | "No comfortable daily budget is saved …" | [Budget refusals and warnings](https://adcopilot.cloud/docs/troubleshooting/money-fence#no-comfortable-daily-budget-saved) | | "… switching it on is yours to do in Google Ads" | [Budget refusals and warnings](https://adcopilot.cloud/docs/troubleshooting/money-fence#the-campaign-it-built) | | "Setting status to REMOVED …" | [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete) | | "… included operations used today" | [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps#the-daily-operations-cap) | | "This workspace has N Google Ads accounts switched on and your plan includes …" | [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps#the-account-limit) | | "Account … is switched off for this workspace" | [Account not showing up](https://adcopilot.cloud/docs/troubleshooting/account-not-showing#3-it-is-switched-off) | | "… isn't connected to this workspace yet" | [A Google product is not connected](https://adcopilot.cloud/docs/troubleshooting/google-product-access#not-connected) | | "… is not available through this connector's current authorisation" | [A Google product is not connected](https://adcopilot.cloud/docs/troubleshooting/google-product-access#connected-but-your-assistant-cannot-see-it) | | "Your subscription is inactive" | [Billing and payment issues](https://adcopilot.cloud/docs/troubleshooting/billing-payment) | ## Accounts and billing * [Account not showing up](https://adcopilot.cloud/docs/troubleshooting/account-not-showing) * [Reconnect troubleshooting](https://adcopilot.cloud/docs/troubleshooting/reconnect) * [Billing and payment issues](https://adcopilot.cloud/docs/troubleshooting/billing-payment) Still stuck? Write to [support@adcopilot.cloud](mailto:support@adcopilot.cloud) with what you asked, which assistant, and the message you got. # Budget refusals and warnings Source: https://adcopilot.cloud/docs/troubleshooting/money-fence/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/money-fence.md > What each of AdCopilot's budget messages means — the comfortable-daily-budget warning, the monthly-cap refusal, Maximize Clicks with no cap, no budget saved, and the campaign it built — and what to do. These come from the budget checks AdCopilot's server runs on any change that can start or raise spend. How they work is in [The budget checks](https://adcopilot.cloud/docs/concepts/money-fence). Amounts are in your account's currency. ## Above your comfortable daily budget > This campaign is set to spend $60/day — about $1,824 a month — above the > comfortable daily budget on file, $40. That is a heads-up, not a block: the > saved comfort stays $40 unless you ask me to change it. **A warning, not a refusal.** The change went through. Since v2.15.0, going above your comfortable daily budget never blocks. * If you meant it, nothing to do. Your words are recorded with the change. * If you want the higher figure to be your new normal, say so and AdCopilot saves it, or change **Comfortable daily budget** in the Business profile. * If it was a slip, ask AdCopilot to set the budget back. A similar warning appears when a per-click cap is higher than your whole comfortable daily budget — usually a typo. Tell AdCopilot the most you want to pay for one click. ## Above your monthly cap > That would put this account's running campaigns at $250/day in total — > $100 for this campaign plus $150 for the others — about $7,600 a month, > above the monthly cap of $5,000 on file. Raise the cap first (tell me the > number), pick a smaller daily budget, or pause another campaign. Or, for one campaign on its own: > That would put this campaign at $200/day — about $6,080 a month — above the > monthly cap of $5,000 on file. Raise the cap first (tell me the number), or > pick a smaller daily budget. **Refused.** Nothing changed. The monthly cap is a limit you set, and it counts every campaign running in the account. It applies when you switch a campaign on, build one switched on, raise a budget, or give a campaign that has ended a new start or end date. Tell AdCopilot a higher monthly cap (or change **Monthly cap** in the Business profile) and ask again, choose a smaller daily budget, or pause a campaign you no longer need. ## Monthly cap not readable > I can't read the monthly cap on file as a plain number above zero, so I > won't switch on or raise spending I have no way to check against it. Tell me > the monthly cap you want and I'll save it, then ask again. **Refused.** The saved monthly cap is not a number above zero that AdCopilot can read. Say the monthly cap you want, or correct **Monthly cap** in the Business profile, and ask again. If you don't want a cap, leave the field blank; a cap of zero is not "no cap". ## Campaign budget not readable > I couldn't read this campaign's daily budget from Google Ads just now, so I > can't check it against the monthly cap on file, and I won't start spending I > haven't checked. Nothing was changed. Try again in a minute. **Refused.** A monthly cap is saved, and Google Ads did not answer with the campaign's daily budget, so AdCopilot could not check the change against the cap. Ask again in a minute. If it keeps happening, check the dashboard's **Connections** for a Google login marked **Needs reauth**, and see [Reconnecting](https://adcopilot.cloud/docs/getting-started/reconnect#reconnect-google). ## Maximize Clicks with no per-click cap > Maximize Clicks with no per-click cap would let Google pay any amount for a > single click. Tell me the most you want to pay for one click and I'll switch > it with that cap … **Refused.** Give a maximum cost per click and ask again. ## No comfortable daily budget saved > No comfortable daily budget is saved for this workspace yet, so I can't > switch on a campaign that spends $30/day — about $912 a month. Tell me the > daily number you're comfortable with, I'll save it, then ask again. **Refused, once.** Say your number; AdCopilot saves it and you ask again. The same applies when building a campaign, and when nothing about your business is saved yet: tell it what you sell, where your customers are and your daily number. AdCopilot never suggests a budget for you. If Google Ads did not answer with the campaign's daily budget at that moment, the same refusal names no amount: > No comfortable daily budget is saved for this workspace yet, and I couldn't > read this campaign's daily budget from Google Ads just now, so I won't > switch it on. Tell me the daily number you're comfortable with, I'll save > it, then ask again. Nothing was changed. The fix is the same: say your number and ask again. ## The campaign it built > This is the campaign we built together — switching it on is yours to do in > Google Ads: Campaigns → … → click the grey Paused dot → Enabled. **Refused, by design.** Switch it on yourself in Google Ads when you are ready. ## A number it cannot read > I can't read the daily budget on this request as a plain number … **Refused.** Say the amount again as a plain number. ## Not a budget message * "Setting status to REMOVED …" — AdCopilot cannot delete; pause instead. See [It can never delete](https://adcopilot.cloud/docs/concepts/can-never-delete). * "… included operations used today" — the daily cap. See [Plan caps and limits](https://adcopilot.cloud/docs/troubleshooting/plan-caps). # Plan caps and limits Source: https://adcopilot.cloud/docs/troubleshooting/plan-caps/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/plan-caps.md > What happens at the daily operations cap or the account limit — nothing is deleted, calls are refused until the reset, a switched-off account, or an upgrade — and the grace day on Starter and Plus. Plans have two limits: how many Google Ads **accounts** you can have switched on at once, and how many **operations** you can use a day. Reaching either refuses new calls; it never changes or deletes anything in your accounts. | Plan | Accounts | Operations a day | | ------- | -------- | ---------------- | | Free | 1 | 10 | | Starter | 3 | 500 | | Plus | 10 | 2,000 | | Pro | 50 | no cap | ## The daily operations cap An operation is one successful tool call. Not counted: `get_org_context`, `save_org_context`, `list_accessible_customers` and `get_resource_metadata`. The day resets at midnight IST. **On Free, 10 is the limit.** Free includes 10 operations a day and has no grace day. Once the 10 are used, calls are refused until the reset: > 10 of 10 included operations used today; resets at midnight IST. Starter is > $19/mo (₹1,499) for 500/day and 3 accounts: … **The grace day on Starter and Plus.** The first day in any 7 that a Starter or Plus workspace goes over its cap, calls keep working and the reply says: > That was 500 of 500 included operations — today is covered, tomorrow needs > Plus at $79/mo (₹4,999) for 2000/day: … After that, calls over the cap are refused until the reset. The reset time is given in your Google Ads account's time zone when AdCopilot knows it, otherwise as midnight IST. A teammate is told to ask the workspace owner instead of being sent to billing. What to do: wait for the reset, or upgrade on the **Billing** page. The dashboard's **Usage**, **Home**, **Google products** and **Billing** pages show today's count against the cap. ## The account limit If more Google Ads accounts are switched on than your plan includes, every call is refused until you fix it: > This workspace has 3 Google Ads accounts switched on and your plan includes > 1; switch some off at …/accounts, or Starter is $19/mo (₹1,499) for 3 and > Plus $79/mo (₹4,999) for 10. Switch accounts off under **Ad accounts** in **Google products**, or upgrade. It usually means a move to a smaller plan took effect while more accounts were switched on, or the workspace moved to Free after a cancellation. A trial ending does not cause it: at the end of a trial AdCopilot keeps one account on and switches the rest off itself. ## After an upgrade Moving from Free or the trial to a paid plan applies the higher limits as soon as the payment is confirmed. A change between paid plans takes effect at your next renewal; on a rupee plan, or when the Billing page says your bank couldn't switch the subscription to a different plan, email [support@adcopilot.cloud](mailto:support@adcopilot.cloud) to set it up. See [Billing and plans](https://adcopilot.cloud/docs/guides/billing-and-plans). Caps are back-pressure, not data loss. Nothing in your Google accounts is changed or removed by reaching a limit. # Reconnect troubleshooting Source: https://adcopilot.cloud/docs/troubleshooting/reconnect/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/reconnect.md > AdCopilot says Google is no longer accepting its sign-in, or a Google sign-in did not restore access. What to check and how to fix it. Start with [Reconnecting](https://adcopilot.cloud/docs/getting-started/reconnect). The checks below cover the cases that need more than one sign-in. ## What the message means > Google is no longer accepting this connector's sign-in, so it cannot reach > your ads accounts. Reconnect your Google account at … — sign in, one click, > and the connector URL does not change. Google refused the sign-in AdCopilot holds for you. No retry or wait fixes it; only signing in again does. Open the link in the message, or the same link in the email AdCopilot sends when it finds the sign-in refused, and sign in to AdCopilot if it asks. In the dashboard, **Connections** shows the login as **Needs reauth**. ## The reconnect did not stick * **Approve the whole consent screen.** If you untick a permission, AdCopilot cannot use that product. Reconnect and approve the requested access. * **Use the right Google account** — the one that can open the Google Ads account, not a personal one that cannot. * **Check your Google connected apps.** If AdCopilot was removed there, reconnecting grants it again. ## It still cannot see the account * Your access to that Google Ads account may have changed. Check in the Google Ads interface that your Google login can still open it. * Then ask your assistant to list the Google Ads accounts you can act on. If the account is still missing, see [Account not showing up](https://adcopilot.cloud/docs/troubleshooting/account-not-showing). ## A teammate's sign-in If the sign-in belongs to a teammate, AdCopilot says the connection's owner needs to reconnect it, and emails them. Only they can. ## Your assistant, not Google If the problem is a missing tool rather than a Google sign-in, you need to reconnect your AI assistant instead. See [A tool is missing or out of date](https://adcopilot.cloud/docs/troubleshooting/tool-missing). Reconnecting never changes your campaigns. It only restores AdCopilot's access. # A tool is missing or out of date Source: https://adcopilot.cloud/docs/troubleshooting/tool-missing/ Markdown: https://adcopilot.cloud/docs/llms.mdx/docs/troubleshooting/tool-missing.md > Your assistant keeps the tool list from when it connected. How to tell when it is stale — the "Tools revision" stamp and get_org_context(tools=[…]) — how to reconnect so it picks up new tools, and what a Google product you just connected needs. Your AI assistant fetches AdCopilot's tool list when it connects, and keeps that copy. After a release adds tools, the copy can be out of date until you reconnect. ## AdCopilot tells you `get_org_context`, the first call of every conversation, compares your connection's tool list with the current one. When tools are missing it says so: > 2 AdCopilot tools (list\_asset\_links, set\_campaign\_asset\_status) are > available but not in this connection's tool list, which was loaded before > they became available — to use them, in Claude, open Customize → Connectors > (the Claude connect guide has a direct link), choose AdCopilot, press > Disconnect, then connect it again. The fix it names depends on your assistant. See [Reconnect your assistant](https://adcopilot.cloud/docs/getting-started/reconnect#reconnect-your-assistant). ## A product you just connected is missing When you connect a Google product, there is nothing to do in your AI app. When you approve your assistant, AdCopilot asks for every Google product it serves, so the product's tools are already in its list and work on the next request. If they are missing or refused, your assistant's approval does not cover that product: for example, it was approved when AdCopilot asked for Google Ads alone. **Connections** marks such an app **Re-authorization needed**, and AdCopilot says so in the chat. **Revoke** it under **Connections** and approve it when it next asks, or remove the AdCopilot connector in your AI app and add it back. See [Approve your assistant again](https://adcopilot.cloud/docs/getting-started/reconnect#approve-your-assistant-again). ## A description is out of date A description is the tool's instructions. An old copy can make the assistant do the old thing. Every description AdCopilot serves ends with one line: ```text Tools revision: 1a2b3c4d. ``` `get_org_context` reports the current revision. If a description your assistant holds ends with a different revision, or has no such line (some clients cut long descriptions), ask: > Call get\_org\_context with tools=\["full\_audit"] and use that description. `get_org_context(tools=[…])` returns the current text of up to ten named tools, ending with the current revision line. It changes nothing and does not count against your daily operations. When descriptions have changed, `get_org_context` also says which ones: > 1 AdCopilot tool description (full\_audit) changed after this connection's > tool list was loaded — get\_org\_context with tools=\[…] returns the current > text; to refresh the whole list, … Reconnecting your assistant refreshes all of them at once. ## Still missing after reconnecting * **The product is not connected, or is read-only.** Write tools for Google Analytics and Tag Manager need **Enable editing** in **Google products**. See [A Google product is not connected](https://adcopilot.cloud/docs/troubleshooting/google-product-access). * **You are a viewer.** A teammate with the viewer role gets read tools only. * **The workspace is read-only**, after a cancelled or unpaid subscription. See [Billing and payment issues](https://adcopilot.cloud/docs/troubleshooting/billing-payment). * **Some clients load tools lazily.** Ask for the tool by name; the assistant can fetch it. A tool missing from the first list is not proof it is unavailable.