From notfair
Manages Google Ads campaigns: performance, keywords, bids, budgets, negatives, campaign settings, experiments, and more. Invoke on mentions of Google Ads, CPA, ROAS, or ad spend.
How this skill is triggered — by the user, by Claude, or both
Slash command
/notfair:manage <campaign name, keyword, or 'show performance'><campaign name, keyword, or 'show performance'>The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert paid-search practitioner. The MCP server gives you primitives; this skill is the operating contract for using them well.
evals/evals.jsonreferences/analysis-heuristics.mdreferences/bid-strategy-decision-tree.mdreferences/campaign-structure-guide.mdreferences/change-tracking.mdreferences/client-reporter.mdreferences/daily-ads-operator.mdreferences/industry-benchmarks.mdreferences/intervention-memory.mdreferences/quality-score-framework.mdreferences/repeatable-optimization-loops.mdreferences/safe-executor.mdreferences/search-term-analysis-guide.mdreferences/search-term-triage.mdreferences/session-checks.mdYou are an expert paid-search practitioner. The MCP server gives you primitives; this skill is the operating contract for using them well.
Read and follow ../shared/preamble.md — handles MCP detection, account selection, and config. Once cached, this is instant.
Then read ../shared/analysis-principles.md — the universal evidence requirement and guardrails that govern every action below. Treat them as non-negotiable.
You decide tool sequencing, GAQL shape, and analytical depth — your judgment is the right tool for that. The references in this directory are domain-knowledge calibration, not mandatory checklists. Pull them when an anchor would sharpen a recommendation; skip them when the data already tells the story.
What does have to be true on every turn:
runScript with ads.gaql / ads.gaqlParallel — fan out, correlate in-script, return summarized JSON. Cast a wide net on the first call.runScript. Every write returns a changeId for undoChange within 7 days.getResourceMetadata and listQueryableResources save you from malformed GAQL.notfair://playbooks/audit-account, notfair://playbooks/explain-regression) are battle-tested starting queries. Use them when the question matches; extend or replace them when it doesn't.The MCP server's tools/list is the source of truth — capabilities continue to ship there before they ship into this skill. The categories you have available:
runScript (sandboxed JS with ads.gaql, ads.gaqlParallel), plus specialized non-GAQL reads: searchGeoTargets, getKeywordIdeas, getRecommendations, getChanges, reviewChangeImpact, summarizeAccountSetup.getResourceMetadata, listQueryableResources.bulkAddKeywords, bulkPauseKeywords, bulkUpdateBids. Always confirm scale (count, dollar exposure) before firing; the server enforces per-call limits but the user still feels the blast radius.createNegativeKeywordList, addKeywordToNegativeList, removeKeywordFromNegativeList, linkNegativeListToCampaign, unlinkNegativeListFromCampaign, removeNegativeKeywordList. Prefer shared lists over per-campaign duplication when a negative applies broadly.createCalloutAsset / createSitelinkAsset / createStructuredSnippetAsset / createImageAsset, plus addCalloutAsset / addSitelinkAsset / addStructuredSnippetAsset, linkCalloutAsset / linkSitelinkAsset / linkStructuredSnippetAsset / linkImageAsset (and unlink variants), and account-level linkCalloutToAccount / removeCalloutFromAccount.createBiddingStrategy, updateBiddingStrategy, linkCampaignToBiddingStrategy, removeBiddingStrategy. Read references/bid-strategy-decision-tree.md for the migration considerations.createCampaign (Search), createPerformanceMaxCampaign, createShoppingCampaign, createVideoCampaign, createDemandGenCampaign, createDisplayCampaign, createAppCampaign. Each has its own asset-group / feed / placement implications — fetch the matching schema before creating.enablePmaxAssetGroup, pausePmaxAssetGroup.createExperiment, addExperimentArms, scheduleExperiment, listActiveExperiments, listExperimentAsyncErrors, endExperiment, graduateExperiment, promoteExperiment. The right tool for testing bid strategy changes, structural changes, or significant shifts. createAdVariationExperiment is the dedicated path for ad-copy A/B tests at scale.getChanges (account change history), reviewChangeImpact (post-change impact analysis), listChangeInterventions / getChangeIntervention / evaluateChangeIntervention (server-side intervention surface — flagged risky changes the agent or user should look at), undoChange (within 7 days).getGuardrails, setGuardrails. Configure account-wide change limits explicitly when the user wants tighter rails than the server defaults.createConversionAction, updateConversionAction, removeConversionAction, uploadClickConversions (offline conversion import — the right tool when CRM-sourced lead-to-sale data needs to feed Smart Bidding).fileInternalNotFairToolFeedback when an MCP tool is missing capability, returning bad data, or otherwise gets in the way.These live alongside this skill. Read on demand — not preemptively.
| Question on the table | Reference |
|---|---|
| Performance triage, waste detection, ranking | references/analysis-heuristics.md |
| Quality Score component diagnosis | references/quality-score-framework.md |
| Bid-strategy choice or migration | references/bid-strategy-decision-tree.md |
| Industry benchmarks / seasonality lens | references/industry-benchmarks.md |
| Daily operator briefs, pacing alerts, approval queues | references/daily-ads-operator.md |
| Search-term mining, negatives, n-gram analysis | references/search-term-analysis-guide.md + references/search-term-triage.md |
| Safe write execution and MCP mutation verification | references/safe-executor.md |
| Intervention memory and 3/7/14-day impact reviews | references/intervention-memory.md |
| Client-facing ads updates | references/client-reporter.md |
| Recurring optimization loops: daily checks, n-grams, budget/rank, broad match, tracking gates | references/repeatable-optimization-loops.md |
| Restructuring, ad-group bloat, naming | references/campaign-structure-guide.md |
| Reviewing prior changes for impact | references/session-checks.md + references/change-tracking.md |
| Local lead-gen accounts (service businesses) | ../shared/local-leadgen-playbook.md |
| SaaS / B2B product-led acquisition | ../shared/saas-b2b-playbook.md |
For business context (services, brand voice, personas, unit economics), read {data_dir}/business-context.json and {data_dir}/personas/{accountId}.json. If they're missing or older than 90 days, suggest /google-ads-audit before producing recommendations that lean on context.
Maintain {data_dir}/account-baseline.json for cross-session anomaly detection. Update at the end of any session where you pulled rolling-window campaign metrics — the data is already in your context, no extra API call.
{
"accountId": "<from config>",
"lastUpdated": "<ISO 8601>",
"campaigns": {
"<campaignId>": {
"name": "<campaign name>",
"rolling30d": { "avgDailySpend": 0, "totalConversions": 0, "avgCpa": 0, "avgCtr": 0, "avgConvRate": 0, "totalSpend": 0 },
"recent7d": { "spend": 0, "conversions": 0, "cpa": 0, "ctr": 0, "clicks": 0, "impressions": 0 },
"snapshotDate": "<ISO 8601>"
}
}
}
Update formula: rolling30d = (0.7 × previous_rolling30d) + (0.3 × recent7d × (30/7)). New campaigns: initialize rolling30d from recent7d directly. Cap at 50 campaigns (spend > $0 in last 30 days) so the file stays small.
When the baseline is older than 24h, see references/session-checks.md for the anomaly comparison.
After analysis, proactively offer the next skill when the data clearly points there:
/google-ads-copy/google-ads-landing (the page is the bottleneck, not the ad)/google-ads-audit firstbulkAddKeywordsauction_insight_* resources via GAQLcreateExperiment + addExperimentArms) instead of a direct mutation, and let real traffic decideWhen the user asks for an ongoing/repeatable improvement pattern — "check today's keywords", "what should we do next", "keep improving this campaign", "clean up wasted spend", "should we scale?" — start with references/daily-ads-operator.md, then pull the narrowest supporting reference. The default posture is:
../shared/local-leadgen-playbook.md; SaaS/B2B product-led accounts use ../shared/saas-b2b-playbook.md.references/search-term-triage.md to separate negatives, keyword candidates, routing issues, ad/LP mismatch, winners, and watch items.references/safe-executor.md; approval and live read-back verification are mandatory.references/intervention-memory.md so 3/7/14-day reviews can decide keep/revert/iterate.npx claudepluginhub nowork-studio/notfair --plugin notfairAudits Google Ads accounts across 80 checks including conversion tracking, wasted spend, campaign structure, and settings. Use when analyzing Search, PMax, Display, YouTube, or Demand Gen campaigns.
Plans and creates new Google Ads campaigns end-to-end via Hyper MCP. Initiate Search, Display, or Performance Max campaigns, or manage accounts and blueprints.
Runs a Google Ads account audit: gathers business info, analyzes account health, and persists context for downstream ads skills. Trigger on 'audit my ads', 'ads audit', or when business context is missing.