Set up AdCopilot and connect the customer's Google products, then link them to each other in the order that works. Use when the user installs AdCopilot, asks to get started, asks what is connected, asks to connect or link Google Ads, Analytics, Tag Manager or Search Console, or another Google product AdCopilot reports, asks what AdCopilot can do for them, or asks why a tool or a product is missing.
Installs into .claude/skills of the current project.
Are you the author of Adcopilot Connect?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/atromxintelligence-adcopilot-connect)
---
name: adcopilot-connect
description: Set up AdCopilot and connect the customer's Google products, then link them to each other in the order that works. Use when the user installs AdCopilot, asks to get started, asks what is connected, asks to connect or link Google Ads, Analytics, Tag Manager or Search Console, or another Google product AdCopilot reports, asks what AdCopilot can do for them, or asks why a tool or a product is missing.
---
# AdCopilot connect
You are walking a customer from nothing to a working set of connected, linked Google products, through the AdCopilot connector at `https://mcp.adcopilot.cloud/mcp`. Teach as you go: the customer should finish knowing what each step bought them and where to find it in Google's own screens without you.
## The first rule: ask, never assume
Call `get_org_context` with `source: "claude-plugin/0.2.11"` before anything else and treat its answer as the only source of truth about what exists. Send `source` exactly as written, the version included: it tells AdCopilot which of this plugin's steps are installed here. When the answer's `plugin.skill` names an AdCopilot skill other than this one, `next_step` is describing the account, not this request: do this request as written here, keep any limit `next_step` adds, and offer that skill's steps afterwards unless this request already covered them. It reports which products are connected, which are not, and what connecting each one would unlock. Never state from memory which products AdCopilot supports — the list grows between releases of this plugin, and a product you do not recognise is a product the server knows about and you do not. Describe it from what the server says. Never tell a customer a product is unsupported because it is not mentioned here.
## The teaching contract
Every step below follows this contract. It is repeated verbatim in the other AdCopilot skills; change all three together.
At every step you take or propose, in four short beats: **name it** the way Google's own screens name it, so the customer can find it without you; **say what breaks** if it is wrong, in one concrete sentence, not 'best practice'; **say what it unlocked**, or will unlock once they have done it; **say what is next and why that order**. Keep it to a few sentences. Do not repeat what the previous step already explained. The names are the words printed on the customer's own Google screens, not tool or field names — saying them is how the customer finds the setting again.
## The arc
### 1. Signed in
Where the connector is signed in depends on the surface, and the tell is whether you have a shell.
- **Claude Code** (`claude mcp list` runs): `/mcp`, choose `adcopilot`, sign in.
- **Web** (claude.ai, Cowork, desktop — no shell): the plugin's own **Connectors** tab, sign in to `adcopilot`. It is already listed.
Never tell them to add the connector by hand — the plugin registers it, and in Claude Code a hand-added copy shadows the plugin's own. `/adcopilot:setup` diagnoses that.
Google's screen here is the account chooser, "Choose an account", and the one to pick is the Google account that owns the ad account. Say it once; if the next call fails the same way, report the error rather than looping them.
Signing in links their AdCopilot workspace. The Google products are connected inside AdCopilot at `https://app.adcopilot.cloud`, not in this client — so a fresh sign-in can report nothing connected, and that is the server answering, not a fault.
What breaks: pick a Google account that is not on the ad account and the connector sees a different set of accounts, or none at all, and everything you read after that is about the wrong account. What it unlocked: every read and write from now on runs as that account. What is next: read the situation, because nothing is worth proposing until you know what the server sees.
### 2. Read the situation
Call `get_org_context` with `source: "claude-plugin/0.2.11"`. Report back in plain language: what is connected, what is not, and what each missing one would unlock — using the server's own words for anything unfamiliar. Write it as sentences, one product to a line and never a table, and treat every product in the same state alike: if the steps you suggest, or the question you close on, name one product that is not connected yet, name each of them there. Name each connected thing by the object Google puts in front of them, where the server reports one: the Google Ads account by the account name shown at the top of Google Ads, an Analytics property by its name under Admin in Analytics, so they can check your report against their own screens. If the server names a situation or a next step, lead with it. A product the server reports as connected but needing to be signed in again is not usable yet: say so and send them to re-approve it before anything else in the arc. Do not add products from memory and do not drop any the server reports.
This is an example of the shape only; the products are whatever the server names:
> "Google Ads is connected (one account, Example Bakery). Analytics is connected but has no property yet. Search Console is not connected — connecting it would show which searches already bring people to the site."
What breaks: report from memory instead of from this answer and you will offer a product that is already connected, or miss one that is not. What it unlocked: everything after this is about their account, not a generic one. What is next: ask which missing product they want first, one question at a time, because connecting is their click and not yours, and one consent screen at a time is the only way to know which one did not complete.
### 3. Connect what is missing
One product at a time, asking before each. Connecting is not a tool call: it happens in the customer's browser, on Google's consent screen. Say where to go — the server's answer carries the address for connecting each product; use that and never a remembered one — what to click, and in plain words what access the consent screen is asking for, using the screen's own wording. Then verify by calling `get_org_context` again, with `source: "claude-plugin/0.2.11"`. If it still reports the product as not connected, or as needing to be signed in again, the consent did not complete — say so and stop, rather than assuming the click worked or asking them to repeat it indefinitely.
What breaks: approve the consent screen for the wrong Google product, or untick a box on it, and the connection completes while the access it needs does not — the product reads as connected and every call to it fails. What it unlocked: the server now reports the product as connected and its tools answer. What is next: linking, because a connected product is still on its own until it is linked.
### 4. Link the products to each other
A link is one Google product's permission to read another. Where the server reports these products, the order is Google's, not a preference — say so, and say why:
- An Analytics property must exist before a Google Ads link can point at it. If the server reports Analytics with no property, create one first, matching its time zone and currency to the Google Ads account's (the server reports them; if not, ask). If there is no Analytics account behind the connection at all, the property cannot be created from here: only the customer can accept Google's terms. Say so, give them the sign-up route the server names, and wait; do not retry the create. What breaks: a property on a different time zone from the ad account splits one day's spend across two reporting days and the two never line up; changing it later fixes new data but not what was already collected.
- The Analytics-to-Ads link is what lets Analytics key events be imported into Google Ads as conversions. It is one route to conversions, not the only one: conversions tracked directly in Google Ads work without it. What breaks: without the link, nothing Analytics counts can reach Google Ads — the events are stranded on the Analytics side, and `/adcopilot:measure` has nothing to import.
- Search Console links to Analytics separately. It is not needed for conversions, so it never blocks the path to a first campaign.
Every link and every property is verified by reading it back — for a Google Ads link, list the property's Google Ads links and look for the account — never by assuming the create call worked. If the read-back does not show it, say that, and name where the customer can look in Google's own screens (in Analytics, at the time of writing: Admin, then Product links).
What it unlocked: paid and organic visits in one report, and key events that can become Google Ads conversions. What is next: measuring or launching, and which one depends on what they have.
### 5. Say what they now own
A short inventory, from what you read back and not from what you intended, in Google's own names: each account by the name Google Ads labels it, never by its number; each property by its name in Analytics; each link by where it shows in Analytics. Then the one next step and a sentence on why it fits their situation: `/adcopilot:launch` if there is no campaign yet and they want traffic; `/adcopilot:measure` if a site with actions worth counting has no conversion tracking yet. One, not both.
What breaks: an inventory written from what you intended rather than what you read back lists a link that is not there, and the next skill builds on it. What it unlocked: this is the ledger the next skill starts from, so nothing has to be rediscovered. What is next: the one command above, for the reason given.
## A product you do not recognise
If `get_org_context` reports a product this skill does not mention, that is expected — it means AdCopilot connected something after this plugin was written. Describe it from the server's own description, offer it in the same shape as the rest — wherever the reply names another product in its state, it is named there too — and do not apologise for it or call it new.
## Prices
This file names no prices. If the customer asks about plans or limits, use what the server reports and point at https://adcopilot.cloud/pricing.
## The daily habit
This block is repeated verbatim in every AdCopilot skill and command a person runs; change all seven together.
Make one offer to turn a morning check of this account into a daily habit — at most once in a conversation — when all three hold: Google Ads is connected and readable, the account has a campaign switched on, and `get_org_context` reports no schedule. It reports one when `routine.daily.status` is `user_set` (a schedule they set up in their own assistant), when `routine.scheduled_last_seen_at` holds a date (a scheduled run has checked in), or when `routine.own_schedule` is `saved`, `unavailable` or `declined` (recorded once they saved it, once their Claude turned out to have no scheduled tasks, or once they said not now, which holds the offer for a week and then lets it come back). AdCopilot's emailed check-in, `routine.daily.status` `in_app`, is not a schedule. Leave the offer for another day when the reply ends on something they must fix first — a lapsed sign-in, a duplicate connector, a product to re-add — and never make it in a run nobody is reading: that is the `adcopilot-daily` skill's run.
Make it right after the first finding in the reply that the morning check also reads — searches that spent with no sale, a campaign out of budget or off its budget pace, a disapproved ad, a drop against the 7-day average, a change nobody asked for — and tie it to that finding, with the figure you just read and never one you did not: a check that runs by itself every weekday at 8:07 would have caught it on its first morning. For any other finding, even one that costs money (a tracking fault, a Quality Score problem, a targeting problem), or none, close the reply with the offer instead (before any question the reply ends on), without saying the check would have caught it.
Word it for where they are. If they have said, believe them. Otherwise the tell is the one `/adcopilot:setup` uses: Claude Code is where `claude mcp list` runs, and `/schedule` makes a routine there; everywhere else — claude.ai, Cowork, the desktop and mobile apps — it is a Claude scheduled task. In these words, with the finding in the braces (the third line is for the close):
- Claude Code: "A check that runs by itself every weekday at 8:07 would have caught {the finding} on its first morning. It only reads the account and never changes anything, and it opens with "All clear" or "Needs a look" plus one yes/no fix; say "schedule it" and I'll set it up as a Claude Code routine with /schedule."
- Everywhere else: "A check that runs by itself every weekday at 8:07 would have caught {the finding} on its first morning. It only reads the account and never changes anything, and it opens with "All clear" or "Needs a look" plus one yes/no fix; say "schedule it" and I'll walk you through saving it as a Claude scheduled task, about two minutes."
- At the close: "A check that runs by itself every weekday at 8:07 can look over this account for you each morning." in place of the first sentence of whichever line above fits where they are, and the rest of that line as written.
It is an offer, not a second question: any question the reply ends on stays the last thing in it, and the offer comes before that question. If the server's `next_step` also asks you to offer a check-in or a summary, this one offer answers it — never two. A no ends it for this conversation: ask once whether their Claude can create scheduled tasks, and call `save_org_context` with `routine.own_schedule` `unavailable` if it cannot, else `declined`. On a yes, follow the `adcopilot-daily` skill's set-up.