atromxintelligence/adcopilot-claude-plugin/adcopilot-review
- community
Checking that the SKILL.md file is still in the repository.
Read a Google Ads account and say what happened, what it cost, what is wasting money and what to change — then propose the change and apply it when the customer says yes. Use whenever the user asks how their ads are doing, for a status, a check, an update, a report or a summary; asks about spend, clicks, impressions, results, cost per result or budget; asks which keywords or searches are wasting money, what is working, what to pause or fix; or asks what they should do next about their ads. This is the everyday skill — reach for it before answering any performance question from memory.
Install
npx vskill@latest install atromxintelligence/adcopilot-claude-plugin/adcopilot-reviewSKILL.md
AdCopilot review
The customer asked how their advertising is doing. Answer the whole question in one pass, through the AdCopilot connector at https://mcp.adcopilot.cloud/mcp. A thin answer is the failure here. Reads are the cheap part; a customer who has to ask four follow-up questions to learn what one answer could have told them has been short-changed.
Call get_org_context with source: "claude-plugin/0.2.16" first, before any other tool — the marker is how the server records that this workspace uses the plugin, and without it the customer keeps being told to install what they already have. Send source exactly as written, the version included: it tells AdCopilot which of this plugin's steps are installed here. In a scheduled run, started by a Claude scheduled task or a Claude Code routine with nobody there to answer, send source: "claude-scheduled" instead, never claude-plugin: claude-scheduled is how AdCopilot knows the run is unattended. 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. Then follow the answer's next_step, playbook and cross_reads — they carry how many reads this answer is sized for and the house rails. Everything below runs inside them.
On an account with campaigns to read — the answer's situation is ADS_DORMANT, ADS_ACTIVE_UNTRACKED or ADS_ACTIVE_TRACKED — the answer also carries question_map: for each kind of question, the read that answers it (wasted spend, search terms and negatives, keywords, ads, budget, results changed, tracking, what to do). Use it to choose the first read for a question that is narrower than the whole account. It is absent when there is nothing to read, so when it is missing the list below stands in for it.
Spend the reads you are given
cross_reads.ads_reads_max is how many Google Ads reads the server sized this situation for: a size for this answer, not a workspace, plan or daily limit. Use all of it. The account's own numbers are what make the answer true, and a number you did not read is a number you must not state. Never trim the read list to be economical — if a read would have changed what you say, make it.
Only when cross_reads.reads_left_today is present is the day itself short. Then ads_reads_max has already been sized to leave room for the fix: spend those reads, then propose. The change they say yes to, and its read-back, are what the rest of the day is for. On such a day, before a call that would use the last of today's operations, say what it covers and ask first.
What you cannot read, say you cannot read. Never estimate a figure, and never carry one over from an earlier turn as if it were fresh.
Follow related_reads
When a lens or search result ends with related_reads, run at most one that bears on the question, then answer from all you hold. Each names its tool, its arguments and a why built from the numbers of the result you just read; skip one that does not bear on what the customer asked. Never repeat a read you hold. Offer, do not chase, the related_reads that read brings back. They are reads only: a change is still only proposed. They count toward this answer's reads. If this answer's reads are spent before a related read, offer it as the next read in one statement, never a second question and never as a limit you hit ("The next read would show how each campaign bids; say the word and I will run it."). Never offer a read for what a result you hold already shows. A read you skipped because it does not bear on the question is neither offered nor mentioned, and the figure in its why stays out of the answer. In a scheduled run, skip them.
The sequence
Open with `full_audit`, with `depth="deep"` and `days` set to the window you are reporting. Pass depth="deep" explicitly. A call that names no depth also runs deep today, but if that run can't finish it falls back to a quick audit (the result says so); an explicit deep never does. A quick audit scores three of the seventy checks over the month to date — not an audit, and not what the customer asked for. Deep attempts all seventy over your window and says which it could not evaluate. Give coverage as the count the result gives, "from N of the M checks that apply", never as a percentage next to the count, and give reasons for the rest only in the result's own words. An unevaluated check is not a pass, and a reason you supply yourself is a guess.
One lens is ONE read and answers what a dozen hand-written queries would. It orders its findings by severity, NOT by money, so re-sort by cost before you choose the three you report. For the cost ranking itself, analyze_waste is the read; analyze_search_terms names the searches that cost money and converted nothing, costliest first, and groups them into negative-keyword themes. Together they usually answer step 3 below, so read it yourself only for what they did not cover.
A question narrower than the whole account starts with the lens that answers it rather than with full_audit: analyze_waste for money spent on nothing, analyze_search_terms for negatives, keyword_opportunities for keywords worth adding or fixing, quality_score_breakdown for ad rank and Quality Score, rsa_asset_report for the ad copy, bidding_audit for how campaigns bid, day_of_week for which days and hours earn, budget_pacing for budgets, change_history for what changed and who changed it, and conversion_setup_audit for what is counted. Do not write a search for what one of these already returns: the lens reads the account the way Google counts it, and a hand-written query reads one slice of it.
Then, in this order, stopping only when this answer's reads are spent:
- The period against the one before it. Campaign metrics by day for the
fourteen days ending on the account's yesterday (search over campaign, with segments.date), folded into two weeks so every headline number has a comparison. No lens returns a time series, so this read is yours to make. End your own search reads on the date_range.end that full_audit and the other lenses carry, and say the dates once. AdCopilot ends those windows on the account's yesterday, the last full day in the account's own time zone (UTC's, when it could not read the zone), so the audit and your reads cover the same days. budget_pacing and change_history are the exceptions: they run through the account's today, so give their dates on their own and never end a search read on them. When a finding names a shorter window, say its dates. If your own reads show a result after that window, say so in the same sentence. A window a finding gives only as a length ends on the result's date_range.end unless it says otherwise.
- Where the money went inside that. Which campaigns and which keywords
carried the spend, and which carried the results (keyword_view) — unless full_audit already ranked it.
- What was paid for that should not have been. The search terms with cost
and no conversions, worst first — usually the largest finding. analyze_search_terms is one read for six query shapes and all six negative-keyword themes: use it, never search_term_view written by hand. Before you give a count of searches, look for their names in every result you hold: analyze_search_terms' "Costliest search terms with no conversion" (the costliest first, with their clicks and cost, and how many there are) and the wasted-spend check's evidence in full_audit or analyze_waste (G16, each search with its clicks and cost). When one lists them, name the top ones with their cost in this answer. When that list says no conversion was recorded anywhere in the account, they cost the most and are not proven waste: say so, and propose blocking one that fits no theme only once tracking is checked. When what you hold only counts them (G16 lists none on an account that counted no result in its window), say how many there are and what they cost, and that the reads count them without naming them. Offer a read for searches no result you hold names only when a related_reads entry's why says that read shows them; one that only names the area, such as wasted spend, is not that promise.
- Whether delivery is being held back.
budget_pacing— one read for the
month-to-date projection against each daily budget. A campaign at its cap every day is turning away traffic the customer is willing to pay for, and they cannot see it from the dashboard.
- Whether results are being counted at all.
conversion_setup_auditis one
read for what is counted and what is aimed at. An account counting nothing makes every other number meaningless, so say that first if it is true.
- Whether anything is switched off by Google, and what changed. Disapproved
ads are a search on ad_group_ad (no lens returns them). When spend, results or cost per result moved against the period before, change_history says what was changed in the account, when, by which Google login and through which channel; when nothing moved, leave it. It keeps thirty days and omits Google Ads Editor changes and some rows, so a quiet log does not prove nothing changed; say that when the numbers moved and the log shows no cause.
Read the account, never the profile's memory of it. A saved note is context for your wording, never a substitute for a read.
The answer
One headline line. Spent, clicks, results, cost per result — each against the period before, in the account's own currency.
The lenses return amounts already formatted for the account (*_display); use those words as they come. A raw search does not — it returns metrics.cost_micros, which is millionths. So take the period comparison from full_audit's own figures where it covers the window, and where you must read it raw, divide by 1,000,000 once, say the currency, and never print a micros number as money.
Then at most three findings, biggest money first. Each one carries the counts behind it: what it cost, over what period, how many clicks or searches. A finding without a number is an opinion. Show at most 5 rows of any list, costliest first, then "and N more; ask to see them".
A finding that says "if X" is not a step until you have checked X. Either make the read it names and say what you found, or carry the condition into your own sentence. Never turn it into an instruction.
A finding may carry its fix in recommended_actions. One whose kind is tool is a ready call, its IDs read from the account: propose it as it stands, an audit's negatives Exact as it built them, with the condition its why gives (a disapproved ad's pause is for an ad they won't fix, never one Google approves on appeal). One whose kind is skeleton is a draft: needs says what only the customer can give, such as the searches to block or the campaign to take budget from. Ask for that, and never fill it in yourself.
Then one recommendation, with the money spelled out both ways — what it costs to act and what it costs to do nothing — as a proposal they say yes or no to. Never apply it first. It is the one question the reply ends on ("Shall I block these 5? Reply yes, or name any to keep."; a yes covers only the rows you showed): never a numbered menu, and never a request to pick the order; recommend it. Anything else that needs their call waits for the next reply. In Claude Code, put that yes/no to them with the AskUserQuestion tool when you have it, with the same options in the same words.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/adcopilot-review/SKILL.md
Popularity
- Repository stars
- 1
- 7-day trend score
- 8
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/atromxintelligence/adcopilot-claude-plugin/adcopilot-review)