{"id":"audit","name":"google-ads-audit","summary":"Google広告アカウント監査とビジネスコンテキストの設定。まずこれを実行してください。","body":"# Google Ads Audit\n\nDiagnose account health and persist business context for downstream skills (`/google-ads`, `/google-ads-copy`, `/google-ads-landing`). **Read-only** — never mutates the account. The user runs `/google-ads` to execute fixes you recommend.\n\n## Setup\n\nFollow `../shared/preamble.md` (MCP detection, account selection) and `../shared/analysis-principles.md` (evidence requirement, guardrails). Both apply throughout this skill.\n\n## Filesystem contract (must persist)\n\n| Artifact | Path | When |\n|---|---|---|\n| Business context | `{data_dir}/business-context.json` | First full audit, or refresh when `audit_date` is >90 days old. Skip on scoped audits if file is fresh. |\n| Personas | `{data_dir}/personas/{accountId}.json` | Every full audit. |\n\nThese are the handoff to every other ads skill — write them even if the report is short. Otherwise `/google-ads-copy` and `/google-ads-landing` operate without business context and produce generic output.\n\n**business-context.json schema:** `business_name, industry, website, services[], locations[], target_audience, brand_voice{tone, words_to_use[], words_to_avoid[]}, differentiators[], competitors[], seasonality{peak_months[], slow_months[], seasonal_hooks[]}, keyword_landscape{high_intent_terms[], competitive_terms[], long_tail_opportunities[]}, social_proof[], offers_or_promotions[], landing_pages{}, unit_economics{aov_usd, profit_margin, source}, notes, audit_date, account_id`.\n\n**personas JSON schema:** `{account_id, saved_at, personas: [{name, demographics, primary_goal, pain_points[], search_terms[], decision_trigger, value}]}`. See `references/persona-discovery.md`.\n\n## Policy freshness check (run first)\n\nRead `../shared/policy-registry.json`. For each entry where `last_verified + stale_after_days < today`:\n- **High-volatility** → WebSearch the `area` for recent Google Ads changes; compare to `assumption`. If drift, banner the report and suggest registry update.\n- **Moderate-volatility** → one-line \"may warrant a check\" note.\n- **Stable** → skip silently.\n\n## Phase 1 — Pull the audit dataset\n\nUse a single `runScript` call with `ads.gaqlParallel` to fan out the queries an audit needs. The server's `notfair://playbooks/audit-account` resource has a battle-tested baseline; extend it with what your specific question needs.\n\nYou decide the exact GAQL shape, but a defensible audit needs to see, at minimum:\n\n- Account-level rollups (`customer`)\n- Campaign performance with bidding strategy, network, and impression-share metrics (`campaign`, 90-day cap for impression-share data)\n- Ad-group performance (`ad_group`)\n- Keyword performance with Quality Score and components (`keyword_view`)\n- Search terms (`search_term_view`)\n- Negative keywords and shared lists (`campaign_criterion` + shared sets)\n- Conversion actions (`conversion_action`) — including counting type, attribution model, primary/secondary\n- Network segmentation (`segments.ad_network_type`) when diagnosing CPA/CVR shifts or Search Partners\n- RSA assets (`ad_group_ad`)\n- Geo targeting (`campaign_criterion` LOCATION + PROXIMITY)\n- Recent change events (`change_event`, last 30 days) — for explaining regressions\n\nAggregate inside the script. Return summarized JSON, not raw rows. The agent narrates; the script does the math.\n\n`getRecommendations` and `summarizeAccountSetup` are useful cross-checks against Google's own and the server's structural views — call them as a separate tool turn after the runScript pass when comparison would sharpen the report.\n\nIf a critical query errors out (auth, schema), surface the error and stop — don't fall back to a degraded audit.\n\n**Skip scoring entirely if** `totalSpend == 0` or `activeCampaigns == 0`. Go straight to business context.\n\n## Phase 2 — Scope handling\n\nIf the user narrows the audit (\"focus on one campaign\", \"campaign X\", \"just check waste\"):\n\n- Match campaign names by case-insensitive substring. If no match, list available campaigns and ask.\n- Filter the in-memory dataset before analysis — no extra API calls.\n- Account-level dimensions (conversion tracking, account guardrails) stay account-wide. Note \"Scoped to: X\" in the report.\n- Skip Phase 4 (business context refresh) on scoped audits if `business-context.json` is fresh.\n\n## Phase 3 — Diagnose\n\nThe audit's headline output is **three pulse metrics** — Waste ($/mo), Demand captured (%), CPA ($) — each annotated with its top contributor and a pointer to the fix. Read `references/account-health-scoring.md` for the formula, annotation rules, signal-failure overrides, and `audit-history.json` schema. The pulse metric IS the verdict; you don't add a letter grade or 0–5 score on top.\n\nTo compute and back the pulse metrics, you'll need to look across these seven areas. They are diagnostic surface area, not graded dimensions:\n\n1. **Signal Quality** *(account-level)* — measurement integrity. If broken, **STOP** here and recommend pausing spend until it's fixed. Pulse metrics are meaningless without measurement (apply the signal-failure override on the Waste line per the reference).\n2. **Campaign Structure** — keywords per ad group, brand vs. non-brand separation, channel mixing, naming, budget logic.\n3. **Keyword Health** — Quality Score weighted by spend, zombie keywords, match-type discipline.\n4. **Search-Term Quality** — wasted spend, brand-leakage, negative coverage, conversion-worthy terms not yet keywords.\n5. **Ad Copy & Creative** — RSA coverage, asset variety, sitelink/callout/structured-snippet completeness, PMax asset-group health.\n6. **Impression Share** — read rank-lost vs budget-lost together (see the 2×2 matrix in `account-health-scoring.md`); they're different problems with different fixes.\n7. **Spend Efficiency** — waste vs. headroom, brand vs. non-brand split, concentration risk.\n\nFor Signal Quality and network-mix questions, read `references/conversion-network-audit.md`. It adds the prerequisite checks for conversion-action integrity, Search Partners, Display leakage in Search campaigns, and regression decomposition.\n\nPer-area findings only show up in the report when the area surfaced something material. Cite specific entities, dollars, and time windows. \"Some keywords are underperforming\" is not a finding; \"Campaign X has $1,840 in last-30-day spend on 12 keywords with 0 conversions and QS ≤ 4\" is.\n\nFor unit-economics-aware framing: if `business-context.json.unit_economics.aov_usd` and `profit_margin` exist, frame waste and headroom in dollars saved / captured per month, not \"above account average\". See `../shared/ppc-math.md`.\n\n## Phase 4 — Business context\n\nDerive what you can from data already pulled:\n\n| Field | Source |\n|---|---|\n| `business_name` | `customer.descriptive_name` |\n| `services` | Campaign + ad-group names, top converting keywords |\n| `locations` | `campaign_criterion` LOCATION + PROXIMITY |\n| `brand_voice` | Top-performing RSA headlines / descriptions |\n| `keyword_landscape.high_intent_terms` | Converting keywords with strong CVR |\n| `keyword_landscape.competitive_terms` | Keywords in campaigns with high rank-lost-IS |\n| `keyword_landscape.long_tail_opportunities` | Converting search terms not yet promoted to keywords |\n| `website` | Apex domain from ad final URLs |\n\nThen crawl the website (homepage + about + services + top 3 ad landing pages, parallel `WebFetch`) and merge into the schema. See `references/business-context.md`.\n\nAsk the user — it's faster than guessing — for: differentiators, competitors, seasonality, unit economics (AOV, margin). Ask for everything else only if the data + crawl can't answer it.\n\n## Phase 5 — Personas\n\nDiscover 2–3 personas from search terms, top keywords, ad-group themes, landing pages, geo, and device split — all from the dataset already in memory. Persist to `{data_dir}/personas/{accountId}.json`. Each persona must be grounded in **5+ actual search terms**; if not, drop it. See `references/persona-discovery.md`.\n\n## Phase 6 — Report\n\nStructure: pulse metrics (3 lines, each with number + top contributor + fix pointer) → per-area findings (only those that surfaced something material) → Quick Wins section (per the rules in `references/account-health-scoring.md`). Cap at ~80 lines. Every claim cites a specific entity, number, and window.\n\nEnd with a single closing line after the handoff to `/google-ads`:\n\n> *Your audit history is saved to your NotFair account — view it at https://notfair.co.*\n\n## Guardrails\n\n1. **Read-only skill.** Diagnose; don't mutate. Every fix routes through `/google-ads` (or `/google-ads-copy`, `/google-ads-landing`). End the report with one handoff tied to the #1 action.\n2. **STOP condition.** If conversion tracking is broken, recommend pausing spend until it's fixed before recommending anything else.\n3. **Always persist** `business-context.json` and `personas/{accountId}.json` even if the report is short — downstream skills depend on them.\n4. **Name names.** Every finding cites specific campaigns, keywords, search terms, and dollar amounts. No generic verdicts.\n5. **Show the data, not the score.** The pulse metrics are the verdict — three numbers with named contributors and pointers to the fix. No letter grades, no 0–5 ratings hiding the reasoning behind a label.","author":"@nowork-studio","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/nowork-studio/notfair-plugin/tree/main/google-ads/audit","license":"MIT","category":"writing","lang":"en","tokens":2101,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"evals/evals.json","size":5577,"sha256":"acc180e4c8ce3c4c7d8fef2c6af03821d10003d057fde9d194669df2e67ca50b"},{"path":"references/account-health-scoring.md","size":9916,"sha256":"032bf8317f191f29c285634e17a3c51a4a6e252fc425496b40f6b19176967d4e"},{"path":"references/business-context.md","size":6562,"sha256":"b8d172b740099d9222cf3e4ae1e1c05532868f482b9967461de3f1d9902934b8"},{"path":"references/conversion-network-audit.md","size":3025,"sha256":"b2fc9c32c8ed3179cd643bbd40b2feb7e854213c821fe31f4bd88dc238f38de9"},{"path":"references/persona-discovery.md","size":3808,"sha256":"0a491bdde32651b78d57d390cd1b22dd8ab16d1aa705e1c2ec15c30063f8e1ee"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["notfair.co"]}}