Google ads
Router / orchestrator for the claude-google-ads suite. Use when the user wants to do anything with Google Ads but hasn't named a specific step — "help me with Google Ads", "launch Google Ads for my store", "run google ads", or just /google-ads. Reads account-context.yaml, runs setup if missing, figures out where the account is in the lifecycle, and dispatches to the right sub-skill (setup, measurement, audit, plan, builder-*, pusher, tracker, optimizer, assets, experiments). It orchestrates; it does not do the work.From its SKILL.md
npx -y skills add chanktb/claude-google-ads --skill google-adsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- reads credentialsReads from 1 credential source: `.env`.
- 10 stars10 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 1 command, including `python ${CLAUDE_PLUGIN_ROOT}/skills/setup/scripts/validate_context.py ./account-context.yaml`.
SKILL.md
6.2 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Google Ads — Router
The single entry point. Find out where the user is in the campaign lifecycle and hand off to the right sub-skill. Enforce the order so nothing runs on a broken foundation.
STEP 0 — Locate context
Look for account-context.yaml in the working directory (or a --context <path> the user gives).
- Missing → run
claude-google-ads:setupfirst. Nothing else runs without context. - Present → continue.
STEP 0b — Connection precheck (REQUIRED — don't run skills on a half-connected account)
Read the context connections block (or detect live). Before routing, confirm the prerequisites are set up;
the suite's value depends on real data, and it must never run on a gap silently (see the no-fabricate gate):
| Connection | Tier | If missing |
|---|---|---|
| Google Ads (read-only GAQL MCP) | MANDATORY | STOP. Nothing runs. Send the user to setup to connect a Google Ads MCP. |
| Store (Shopify/Woo/BigCommerce) | required for full value | Guide to connect (MCP or an Admin token in a .env). Without it: no real AOV / true-ROAS — those outputs render UNVERIFIED — connect store. |
| Merchant Center (ecom) | required for feed health | Guide to connect. Without it: product performance only, feed health (OOS/disapproval, D14-B) = UNVERIFIED. |
| GA4 | recommended | Guide to connect. Without it: no Ads-vs-GA4 value cross-check. |
| GSC | optional | Note only. |
If Google Ads is missing → stop and run setup. If a value-tier source (store/Merchant/GA4) is missing →
surface a one-line "connect these for full value" banner with the how-to, then proceed at reduced scope —
every output that needed the missing source is flagged UNVERIFIED, never fabricated. Don't quietly skip.
STEP 1 — Assess lifecycle stage
Run the context validator to read readiness, and scan the working dir for prior artifacts:
python ${CLAUDE_PLUGIN_ROOT}/skills/setup/scripts/validate_context.py ./account-context.yaml
Map state → the next sensible step:
| Readiness | Artifacts present | Likely next step |
|---|---|---|
| not setup-complete | — | setup (finish context) |
| setup-complete, no audit | — | audit and/or measurement |
| measurement = FAIL | measurement report | back to tracking fixes (block plan/build) |
| measurement OK, no plan | audit + measurement | plan |
| plan exists, no spec | GOOGLE-ADS-PLAN.md | builder-* for the chosen types |
| spec exists, not pushed | campaign-spec.json | pusher |
| campaign live | — | tracker (new) / optimizer (mature) |
STEP 2 — Route by intent
If the user named a task, map it and dispatch:
- "audit / score / what's wrong / wasted spend" →
audit - "tracking / conversions / GA4 import / double count" →
measurement - "plan / budget / what campaigns / media plan / forecast" →
plan - "build pmax / performance max" →
builder-pmax - "build search" →
builder-search - "branded / brand campaign / conquesting" →
builder-branded-search - "demand gen / youtube / discovery" →
builder-demand-gen - "push / export / upload / go live" →
pusher - "how's it doing / pacing / learning phase / anomaly" →
tracker - "optimize / improve ROAS / negatives / raise tROAS / weekly review" →
optimizer - "experiment / A/B / split test" →
experiments - "ad copy / headlines / assets / creative" →
assetsIf ambiguous, ask ONE clarifying question, then route.
STEP 3 — Full launch (when the user wants the whole thing)
For "set up Google Ads for my business", run the pipeline in order, pausing for input where needed:
setup → measurement [GATE] → audit → plan → builder-* → pusher [approval] → tracker → optimizer
Hard gates (never skip):
- No plan/build before
measurementpasses (FAIL blocks; WARN carries a risk note). build-readywantsbrand_terms(for branded search + PMax exclusion).pusheralways: create PAUSED, human approval, spend cap.
STEP 4 — "Where am I?" summary
When the user just says /google-ads (no task), produce a short status: readiness, what artifacts exist, and the single recommended next action — then offer to run it. Don't dump everything; point to the next step.
Model dispatch (run cheap, decide expensive)
Spend compute by cognitive load, not by habit — see ${CLAUDE_PLUGIN_ROOT}/references/model-tier-dispatch.md.
The router itself is Judge (J) work (lifecycle reasoning, routing, gates). But the heavy collection
each sub-skill needs is Scout/Routine — so as orchestrator, push it down:
- Scout (S,
haiku) — thevalidate_context.pyrun in STEP 1, a single status pull, one URL check. - Routine (R,
sonnet) — assembling the active-campaign set, full data-bundle pulls for audit/optimizer/tracker. - Judge (J, main session) — picking the next lifecycle step, all gates, the "where am I" call.
Delegate S/R via
Agent(subagent_type: "general-purpose", model: …)so the sub-agent keeps MCP + Bash; tell it to return raw, not conclude. Each sub-skill carries its own per-STEP tier table.
Notes
- The router orchestrates; each sub-skill reads the same
account-context.yamland writes to the working directory. Business data never lives in the plugin — it stays in your localaccount-context.yaml. - One working folder per business; nothing scattered. All context + outputs live under a single
<workdir>with dated subfolders, and secrets are recorded as POINTERS (not copied) — see${CLAUDE_PLUGIN_ROOT}/references/workspace-layout.md. If there's no working folder yet,setupcreates it. - Sub-skills are invoked by their namespaced names (
claude-google-ads:setup,claude-google-ads:audit, …).
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most marketing audience skills give in ~1.5k tokens
Counted across 690 of the 894 authors here whose files we hold, read 2026-08-07
- Apply Poppins font to headingsin 41 of 690, across 6 files
- Apply Lora font to body textin 41 of 690, across 6 files
- Use Arial fallback for headingsin 39 of 690, across 4 files
- Use Georgia fallback for body textin 39 of 690, across 4 files
- Maintain text hierarchy and formattingin 39 of 690, across 4 files
- Use accent colors for non-text shapesin 38 of 690, across 3 files
- Use RGB values for precise color matchingin 38 of 690, across 3 files
- Use brand colors for primary text and backgroundsin 36 of 690, across 1 file
- Read product marketing context file before asking questions, starting, or auditingin 35 of 690, across 23 files
- Use active voice instead of passive voicein 26 of 690, across 10 files
- Implement or generate appropriate JSON-LD structured datain 24 of 690, across 17 files
- Prioritize clarity over clevernessin 22 of 690, across 8 files
Said here and by no other author read
- run setup if account context is missing
- require account-context.yaml before proceeding
- verify all mandatory connections before routing
- surface a connection warning banner for missing value-tier sources
- flag outputs as UNVERIFIED if data sources are missing
- validate lifecycle readiness and scan for prior artifacts
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.