返回 Skills 目录
mbfinotti/advertising-skills已通过检查

SKILL DETAIL

ad-negative-keywords

mbfinotti/advertising-skills/ad-negative-keywords

Build and maintain negative keyword lists from search term reports to cut wasted ad spend in paid search - n-gram query mining to surface irrelevant search terms, the right negative match types and exclusion levels (account, shared list, campaign, ad group), and a review cadence that avoids overblocking queries that convert. Use whenever the user mentions a search term or search query report, irrelevant clicks, junk traffic, wasted ad spend, or wants to exclude or block keywords - even if they never say 'negative keywords'. Covers B2B lead gen and B2C/e-commerce; needs the account's query data. Do NOT use for account-wide underperformance with no query-level evidence - use mbfinotti/advertising-skills@ad-account-diagnostic instead.

安装量 · 180查看来源

Installation

npx skills add https://github.com/mbfinotti/advertising-skills --skill ad-negative-keywords

技能文件

SKILL.md

最近同步 · 2026年9月24日

evals/evals.json›
{
  "skill_name": "ad-negative-keywords",
  "evals": [
    {
      "id": 1,
      "prompt": "I run Google Ads for Brightpath HR, a B2B payroll software company, spending about $12k/month. I'm sure we're bleeding money on junk clicks. Can you just write me a solid negative keyword list to paste in today? Also, we're launching a brand-new campaign for a new product line next Monday with zero history - I want negatives on that one from day one too.",
      "expected_output": "A refusal to name specific negatives for the live account until its search term report is provided, a request for that export plus clarifying questions, and a labelled pre-launch starter list allowed only for the new zero-history campaign.",
      "files": [],
      "expectations": [
        "Declines to name any specific candidate negative keyword for the live account before receiving its search term report",
        "Requests an export of the search term report (search query report) as the prerequisite for the live account",
        "Explains that a list invented without query data has no evidence of what actually matches, and that its cost - blocked converting queries - is invisible",
        "Allows a starter exclusion list only for the brand-new zero-history campaign",
        "Labels the starter list as pre-launch and says to review it against real queries after 7-14 days",
        "Asks what counts as a conversion and for the target CPA, and asks for the account's CPC range",
        "Asks which queries or themes must never be blocked (brand terms, converting themes, deliberate competitor bidding)",
        "Asks whether this is a one-off cleanup or a standing maintenance job"
      ]
    },
    {
      "id": 2,
      "prompt": "First-ever cleanup for Lexon Legal Software (B2B case management, Google Ads). Here's the zero-conversion cut of our 30-day search terms report: $14,200 analyzed non-brand spend, target CPA $250, average CPC around $7. Rows (term - clicks, cost, conversions this window, conversions last 90 days): 'legal software jobs' - 34, $238, 0, 0. 'free legal case template' - 26, $182, 0, 0. 'what is case management software' - 18, $126, 0, 0. 'legal case management pricing' - 11, $77, 0, 4. 'best legal software' - 21, $147, 0, 0. 'casehawk pricing' - 16, $112, 0, 0 (CaseHawk is our main competitor). 'legal case tracker excel' - 8, $56, 0, 0. 'law firm consulting services' - 9, $410, 0, 0 (crazy expensive CPCs on that one). What should I exclude and how?",
      "expected_output": "A full pass in the output shape: gated candidates with match type, level, evidence, category and variants; the prior-converter and strategy-call terms held out of the additions; a watchlist; a summary with wasted spend; and a next review date - delivered as a draft.",
      "files": [],
      "expectations": [
        "Applies a tightened click gate of 10-12 clicks rather than the standard 15-20, because the average CPC is above roughly $3",
        "Marks 'law firm consulting services' as a candidate via the spend gate ($410 sits in the 1.5-2x band of the $250 target CPA) despite only 9 clicks",
        "Places 'legal case management pricing' on the do-not-negate list because it converted 4 times in the prior 90 days, even though it crosses the click gate this window",
        "Treats 'best legal software' as comparison intent to confirm with the user - a strategy call, not an automatic negative",
        "Treats 'casehawk pricing' as a competitor-term strategy call to confirm before negating, since some accounts bid competitor terms deliberately",
        "Puts 'legal case tracker excel' (8 clicks) on a watchlist instead of negating it, and names the gate that would trip it",
        "Recommends phrase as the match type for the theme negatives (job seeker, DIY/free, informational), not exact and not broad",
        "Recommends a weekly recurring pass with a 7-14 day lookback going forward, given monthly spend above roughly $10k",
        "Expands plural, synonym, or stem variants manually for at least one added negative, because negative keywords do not match close variants",
        "Assigns recurring junk themes to a shared exclusion list and reserves account level for universal disqualifiers such as the job-seeker terms",
        "Summary reports spend analyzed and wasted spend found as an amount and a percentage of analyzed spend",
        "Output includes a do-not-negate section, a watchlist, and a next review date",
        "Presents the additions as a draft for approval rather than instructing a silent mass-apply",
        "Each addition carries its evidence (clicks, cost, conversions) and a taxonomy category"
      ]
    },
    {
      "id": 3,
      "prompt": "Google Ads question for my store Trailforge Outdoors. Last month I added about 45 negatives directly from the search terms report screen. This month the same junk is back: I negated 'tent repair kit' but 'tent repair kits' still shows up, and my broad match negative 'free camping checklist' was supposed to at least kill everything with 'free' in it, but searches for just 'free tent' keep appearing. I was about to also add capitalized versions and common typos of every negative. Is Google ignoring my negative keywords?",
      "expected_output": "A diagnosis from negative-match mechanics: default exact when adding from the report, no close-variant expansion on negatives, and broad requiring ALL its words - with a phrase re-add plus manual plural variants as the fix, and no casing/typo variants needed.",
      "files": [],
      "expectations": [
        "Identifies that adding negatives from the report screen used the pre-selected default of exact match, which blocks only the literal query - so the list looks maintained while the waste continues",
        "States that negative keywords do not expand to close variants, so 'tent repair kits' must be added separately from 'tent repair kit'",
        "States that a broad negative blocks only searches containing ALL of its words, so 'free camping checklist' cannot block 'free tent'",
        "Recommends deliberately switching the report additions to phrase match",
        "States that casing and misspellings are matched automatically, so capitalized and typo variants are unnecessary",
        "Warns against fixing the gap with a bare single-word broad negative 'free' without first running the overblocking and conflict check, since it could block converting free-trial-style queries",
        "Concludes the platform is applying the negatives exactly as entered - the observed behavior follows documented match mechanics, not a bug"
      ]
    },
    {
      "id": 4,
      "prompt": "Emergency at Novapoint (B2B project software). Our core non-brand ad group has had zero impressions for three weeks. Every keyword shows 'active', budget untouched, bids unchanged. The only change around that time: our new hire cleaned up search terms and added 'project management' as a phrase negative in the account-level list to stop all the how-to searches. Platform support told us to review our bid strategy. What is going on?",
      "expected_output": "A diagnosis that the account-level phrase negative conflicts with the ad group's own keywords and silently blocks them, with removal/narrowing as the fix, a conflict check on future negatives, and a quarterly conflict sweep - not a bidding change.",
      "files": [],
      "expectations": [
        "Diagnoses the account-level phrase negative 'project management' as conflicting with the ad group's own active keywords",
        "States that negatives always beat positives: a blocked keyword still displays as active but never enters the auction",
        "Recommends removing or narrowing the conflicting negative as the fix",
        "Recommends replacing it with narrower exclusions targeted at the actual informational queries (for example exact or phrase negatives on specific how-to searches), never a theme word that overlaps core keywords",
        "Flags account level as the wrong exclusion level for this term - widest reach, hardest to audit and reverse",
        "Recommends a conflict check against active keywords anywhere in the account before every future negative is added",
        "Recommends a quarterly conflict sweep as the standing safeguard, because this failure mode is silent",
        "Does not attribute the outage to bid strategy, budget, or a learning phase"
      ]
    },
    {
      "id": 5,
      "prompt": "I manage search ads for Fernhaven Kitchens, an e-commerce store doing about $16k/month in ad spend. Annoying discovery: if I sum every row in the search terms report, I only get about $9k. Where did the other $7k go, and how am I supposed to find junk queries I can't even see? I'm comfortable with Python if that helps.",
      "expected_output": "An explanation that platforms hide a large share of search terms (around 40% of spend), plus an n-gram token-mining procedure over the visible export - tokenize, aggregate cost/conversions per token, gate, negate bad tokens as phrase - with a script path for this user.",
      "files": [],
      "expectations": [
        "Explains that the platform hides a large share of search terms - practitioner measurements center around 40% of spend - so the missing $7k is expected, not a tracking bug",
        "Recommends token-level (n-gram) mining of the visible export to recover signal the report no longer shows",
        "Tokenizes queries into unigrams, bigrams, and trigrams",
        "Aggregates cost and conversions per token across every query containing that token",
        "Sorts tokens by cost descending, filters to zero conversions, and applies the same candidate gates as the term-level workflow",
        "Negates bad tokens as phrase negatives",
        "Flags high-converting tokens as expansion leads for the account owner while declining to do the positive keyword research itself",
        "Points this user to the script/tokenizer path given their stated Python ability, noting the spreadsheet pivot is the equivalent no-script alternative",
        "Does not promise to recover the hidden queries themselves - the mining works on the visible export only"
      ]
    },
    {
      "id": 6,
      "prompt": "Our agency runs Meltbury Home Goods, an e-commerce account at $40k/month. After four months of weekly search term cleanups, wasted spend share is down to 6% of non-brand. My director wants it at 0%, and she just bought a 2,300-term 'ultimate negative keyword mega-list' from a PPC forum to bulk-add at account level this week. She also asked whether we should move to daily reviews to squeeze out the rest. What do you recommend?",
      "expected_output": "A recommendation to stop forcing new exclusions: 6% is at the practical floor, the mega-list fails the evidence gate and negative volume does not move CPA/ROAS, effort shifts to the conflict sweep and watchlist, and the cadence lengthens rather than going daily.",
      "files": [],
      "expectations": [
        "States that 6% sits within the 4-8% practical floor of a healthy account and recommends against forcing new exclusions toward 0%",
        "Advises against bulk-adding the purchased mega-list because it was not derived from this account's own search term report",
        "Cites that a large published study of account-level exclusions found near-zero CPA/ROAS difference versus accounts without them - where and how negatives are applied matters more than how many",
        "Warns that the mega-list at account level was never checked against this account's conversion history and active keywords, so it risks silently blocking converting queries with the widest, hardest-to-audit blast radius",
        "Recommends shifting effort to the conflict sweep and the watchlist instead of new exclusions",
        "Recommends lengthening the review interval rather than moving to daily passes",
        "Frames success against the pass threshold: wasted spend share under 10% of non-brand spend AND zero converting terms blocked, verified against the change log and conversion history",
        "States that every negative narrows reach: negate the clearly wrong, never the merely uncertain"
      ]
    },
    {
      "id": 7,
      "prompt": "We just took over paid search for Corvale Systems on Microsoft Advertising. The same junk theme - webinar, course, and certification searches - keeps appearing across all 6 campaigns' query reports and it clears our click thresholds. Two complications: the client keeps account-level settings locked, we can only edit campaigns and ad groups, and my colleague wants to just add broad match negatives covering the whole theme. How should we set this up?",
      "expected_output": "A setup using a shared negative keyword list attached per campaign, the account-level rung reported as deleted by the edit-rights constraint, the broad plan rejected because the platform has no negative broad match, manual variants, and a logged change.",
      "files": [],
      "expectations": [
        "Reports the account-level exclusion rung as deleted from this account's menu because of the missing edit rights - removed by the constraint, not ranked last",
        "Recommends a shared negative keyword list for the recurring cross-campaign theme",
        "Notes that on this platform negative keyword lists attach to campaigns only, never ad groups, so the list must be attached to each of the 6 campaigns",
        "Rejects the broad match plan because this platform has no negative broad match at all - phrase and exact only",
        "States this platform's default negative match type is phrase, so report additions need no switch away from exact",
        "States that close variants of a negative still match on this platform too, so plural and synonym variants must be added manually",
        "Recommends the platform's dedicated negative keyword conflict report for the periodic conflict sweep",
        "Recommends logging the change with date, terms, level, match type, and reason"
      ]
    }
  ],
  "trigger_queries": [
    { "query": "My search terms report is full of junk like 'free template' and 'diy' - clean it up for me", "should_trigger": true },
    { "query": "We keep paying for clicks from job seekers searching our category plus 'careers'. How do I stop that?", "should_trigger": true },
    { "query": "How do I stop my ads showing for searches that never convert?", "should_trigger": true },
    { "query": "here's my search query report export, build me an exclusion list", "should_trigger": true },
    { "query": "Should I use phrase or exact for a negative keyword?", "should_trigger": true },
    { "query": "Do negatives belong at campaign level or in a shared list?", "should_trigger": true },
    { "query": "irrelevant search terms are eating my Google Ads budget", "should_trigger": true },
    { "query": "how to block keywords in google ads", "should_trigger": true },
    { "query": "My PPC budget leaks to 'how to' and tutorial searches - we sell software, not courses", "should_trigger": true },
    { "query": "How often should I review the search query report for new exclusions?", "should_trigger": true },
    { "query": "Is an n-gram analysis of my search terms export worth doing?", "should_trigger": true },
    { "query": "The search terms report only accounts for half my spend - how do I find junk in the hidden queries?", "should_trigger": true },
    { "query": "I added a negative keyword but the plural still triggers my ads. Why?", "should_trigger": true },
    { "query": "We only sell new machines but people searching 'used' keep clicking our ads", "should_trigger": true },
    { "query": "Should I exclude competitor brand names from my search campaigns?", "should_trigger": true },
    { "query": "What can I exclude to cut junk traffic on a Performance Max campaign?", "should_trigger": true },
    { "query": "Can you audit our exclusion list? I think we blocked queries that used to convert", "should_trigger": true },
    { "query": "My ad group shows active but got zero impressions since we cleaned up keywords last month", "should_trigger": true },
    { "query": "wasted spend cleanup for my ecommerce search campaigns", "should_trigger": true },
    { "query": "With only 30 conversions a month, how do I decide which search terms to cut?", "should_trigger": true },
    { "query": "Set up a maintenance cadence for search term cleanup across our accounts", "should_trigger": true },
    { "query": "Stop my shopping ads matching 'repair' and 'user manual' searches", "should_trigger": true },
    { "query": "Our B2B ads get clicked by students hunting course material - fix?", "should_trigger": true },
    { "query": "What keyword exclusions should a brand-new campaign start with when there's no history yet?", "should_trigger": true },
    { "query": "How many clicks with zero conversions before I block a search term?", "should_trigger": true },
    { "query": "cleaning up irrelevant clicks on Microsoft Advertising - where do I start", "should_trigger": true },
    { "query": "Should I just add 'cheap' as a negative across the whole account?", "should_trigger": true },
    { "query": "My Amazon auto campaign keeps matching shopper searches that never convert - what do I do?", "should_trigger": true },
    { "query": "How do I check whether any of my negatives are blocking keywords I'm actively bidding on?", "should_trigger": true },
    { "query": "Why did my CPA double last month across the whole account?", "should_trigger": false },
    { "query": "My ads used to work - run a full account audit", "should_trigger": false },
    { "query": "Target CPA or maximize conversions - which bidding strategy?", "should_trigger": false },
    { "query": "How should I split $50k a month between search and social?", "should_trigger": false },
    { "query": "Is my campaign on pace to hit the monthly budget?", "should_trigger": false },
    { "query": "Pick target keywords for my new SEO content cluster", "should_trigger": false },
    { "query": "Which keywords should I bid on for a brand-new search campaign?", "should_trigger": false },
    { "query": "Write five ad copy variations for my search campaign", "should_trigger": false },
    { "query": "My pixel double-fires and shows duplicate conversions", "should_trigger": false },
    { "query": "The ad platform reports 200 conversions but our CRM shows 120 - reconcile?", "should_trigger": false },
    { "query": "Ads get plenty of clicks but the landing page doesn't convert", "should_trigger": false },
    { "query": "Should I merge my 40 campaigns into 5 to exit learning limited?", "should_trigger": false },
    { "query": "Design a retargeting sequence for cart abandoners", "should_trigger": false },
    { "query": "Build a lookalike audience from my best customers", "should_trigger": false },
    { "query": "What audience segments should my B2B SaaS ads target?", "should_trigger": false },
    { "query": "Exclude existing customers from my prospecting audience", "should_trigger": false },
    { "query": "How do I block bot traffic and invalid clicks on my ads?", "should_trigger": false },
    { "query": "Add IP exclusions so our own employees stop clicking the ads", "should_trigger": false },
    { "query": "Which ad platform should I start on with $5k a month?", "should_trigger": false },
    { "query": "Remove low-performing keywords from my SEO rank tracker project", "should_trigger": false },
    { "query": "Exclude bad website placements from my display campaigns", "should_trigger": false },
    { "query": "When can I scale my winning campaign from $200 to $600 a day?", "should_trigger": false },
    { "query": "What CAC can I afford at a $90 average order value?", "should_trigger": false },
    { "query": "Write negative prompts for the AI images in my ad creatives", "should_trigger": false },
    { "query": "Exclude violent content categories from our CTV video buys", "should_trigger": false },
    { "query": "My Amazon listing dropped in organic search rank - help with listing keywords", "should_trigger": false },
    { "query": "Filter internal office traffic out of GA4 reports", "should_trigger": false },
    { "query": "Is my creative fatigued? CTR is sliding on an ad that ran for months", "should_trigger": false },
    { "query": "Map the buying committee for our enterprise deals so ads reach each role", "should_trigger": false }
  ]
}
references/platform-notes.md›
# Platform notes (optional)

Vendor-specific mechanics for the main workflow. Load this file only when the user names their platform; the SKILL.md workflow stands on its own without it. Limits and defaults drift - verify in-account before building at scale.

## Google Ads

- Negatives never match close variants: excluding broad `flowers` blocks "red flowers" but NOT "red flower". Add plurals, synonyms, and stems manually.
- Casing and misspellings are covered automatically.
- When adding a negative from the search terms report UI, the pre-selected match type is exact - the trap flagged in the skill's failure modes. Switch to phrase before saving.
- Levels and limits:
  - Up to 10,000 negatives per Search or Performance Max campaign (PMax raised from 100 in March 2025).
  - 20 shared lists per account, 5,000 keywords per list.
  - Account-level list applies to all eligible Search and Shopping inventory including PMax.
  - Display/Video considers at most 1,000 account-level negatives and treats them as thematic exclusions, not literal blocks.
- Performance Max and standard Shopping have no positive keywords - negatives (plus brand exclusions in PMax) are the primary query control. PMax negatives became self-serve in December 2024. Shared-list support arrived August 2025.
- Search term visibility is partial since September 2020. Practitioner measurements put hidden terms around 40% of spend (ranging 20-80%). This is what makes the n-gram pass necessary rather than optional.
- Formatting rules:
  - Max 80 characters and 10 words per negative.
  - A query longer than 16 words can bypass a negative whose match falls after the 16th word.
  - Usable symbols are `&`, accents, and `*` - accented and unaccented count as different negatives.
  - Most other punctuation errors out.
- Conflict tooling: the platform's "conflicting negative keywords" recommendation misses shared-list conflicts - pair it with a script or third-party conflict check rather than trusting it alone. Never auto-apply it.
- Data pull via API (GAQL): `keyword_view` segmented by date returns one row per keyword per day per match type - deduplicate on (ad group, keyword text, match type) and aggregate metrics, or drop the date segment, before computing thresholds.

## Microsoft Advertising

- Default negative match type is phrase (opposite of Google's exact default when adding from a report).
- No negative broad match at all - phrase and exact only.
- Negative keyword lists attach to campaigns only, never ad groups: one list per campaign, 20 lists per account, 5,000 keywords per list.
- Close variants are not filtered by negatives here either: plurals, synonyms, and misspellings of a negative still match - add variants manually, same as Google.
- A dedicated negative keyword conflict report exists - use it for the quarterly conflict sweep.

## Amazon Ads

- Only negative phrase and negative exact exist - no negative broad.
- Opposite of Google on variants: Amazon negatives DO block close variations of the phrase. Fewer manual variants needed.
- Negative product/ASIN targeting blocks specific product detail pages - a lever Google has no equivalent for. Use it against poorly converting placements and competitor pages.
- Three distinct reports:
  - The advertising Search Term Report - actual shopper queries, the input for this skill's workflow.
  - Search Query Performance in Brand Analytics - organic search behavior, brand-registered sellers only.
  - Search Term Impression Share - your share per query, 30-day lookback.
- Common use of negative exact: stop auto and manual campaigns from cannibalizing each other on the same query.
- Cadence practitioners use: weekly above ~$10k/month ad spend, bi-weekly below.
- The 15-20-click zero-order gate (10-12 for CPCs above ~$3) originated in this ecosystem and transfers directly.

## Cross-platform reminders

- Never assume one platform's match-type defaults or variant behavior on another - the three above disagree on both.
- The skill's match-type ranking (`phrase > exact > broad`) survives a platform with no negative broad match: broad already sits last, so Microsoft and Amazon simply lose the bottom rung. The level ranking does move - where shared lists attach to campaigns only, the shared-list rung loses the ad-group reach the default order assumes, and a recurring theme inside one campaign drops to the campaign rung.
- Keep one master exclusion taxonomy per business, but maintain per-platform lists: syntax, limits, and levels don't port automatically.
references/worked-example.md›
# Worked examples

Two filled-in passes in the skill's output shape - one B2B lead gen, one e-commerce - followed by a negative example. Figures are illustrative. Always substitute the account's own numbers.

## Example 1 - B2B lead gen (project management software, $18k/month, target CPA $220, avg CPC $6)

High CPC → click gate tightened to 10-12. Lookback: 14 days, $8,400 analyzed.

### Summary

- Spend analyzed: $8,400 (14 days, non-brand campaigns)
- Wasted spend found: $1,270 on zero-conversion candidates (15.1% of analyzed spend)

### Additions

| Term                       | Match type | Level                       | Evidence                | Category           | Variants added                                                        |
| -------------------------- | ---------- | --------------------------- | ----------------------- | ------------------ | --------------------------------------------------------------------- |
| project manager jobs       | phrase     | account                     | 41 clicks, $246, 0 conv | job seeker         | project manager job, project management jobs, project manager careers |
| project manager salary     | phrase     | account                     | 28 clicks, $168, 0 conv | job seeker         | project manager salaries, project management salary                   |
| free project plan template | phrase     | shared list "DIY-free"      | 34 clicks, $204, 0 conv | DIY/free           | free project plan templates, free project planning template           |
| what is a gantt chart      | phrase     | shared list "informational" | 22 clicks, $132, 0 conv | informational      | what are gantt charts, gantt chart meaning                            |
| project management course  | phrase     | shared list "informational" | 19 clicks, $114, 0 conv | informational      | project management courses, project management training               |
| construction daily log app | exact      | campaign "Non-brand core"   | 11 clicks, $72, 0 conv  | wrong product tier | (none - surgical exact block)                                         |

Level choice follows the ranking: shared lists carry the two recurring themes (DIY/free, informational) because every future campaign inherits them by attachment. Job-seeker terms went to account level as universal disqualifiers - no campaign in this account ever wants them - and the single stray construction query stayed at campaign level, where a wrong call costs one container.

### Do-not-negate

- "project management software pricing" - 12 clicks, 0 conversions this window, but 3 conversions in the prior 90 days. Fails the overblocking review.
- Queries naming a rival product plus "alternative" - competitor-adjacent, and the account deliberately bids competitor comparisons. Strategy call: keep.

### Watchlist

- "project tracker excel" - 7 clicks, $44, 0 conv. Trips the 10-click gate at ~3 more clicks; likely DIY intent but too little data.
- "best project management tool" - 9 clicks, $61, 0 conv. Comparison intent; early-funnel, may assist later conversions. Re-check next pass.

### Next review

Weekly cadence - next pass in 7 days, 14-day lookback.

## Example 2 - e-commerce (running-gear store, $45k/month, target ROAS 400%, avg CPC $0.90)

Low CPC → standard 15-20 click gate. Conversion volume is high enough to gate on conversions directly. Lookback: 7 days, $10,900 analyzed.

### Summary

- Spend analyzed: $10,900 (7 days)
- Wasted spend found: $760 on zero-conversion candidates (7.0% of analyzed spend - near the 4-8% practical floor; be conservative)

### Additions

| Term                       | Match type | Level                       | Evidence               | Category                                          | Variants added                                    |
| -------------------------- | ---------- | --------------------------- | ---------------------- | ------------------------------------------------- | ------------------------------------------------- |
| used running shoes         | phrase     | account                     | 62 clicks, $56, 0 conv | wrong product tier                                | used running shoe, second hand running shoes      |
| running shoe repair        | phrase     | shared list "services"      | 38 clicks, $34, 0 conv | wrong product tier                                | running shoes repair, shoe repair running         |
| how to clean running shoes | phrase     | shared list "informational" | 44 clicks, $40, 0 conv | informational                                     | how to wash running shoes, cleaning running shoes |
| running shoes for toddlers | phrase     | campaign "Adult footwear"   | 29 clicks, $26, 0 conv | wrong product tier (catalog has no toddler sizes) | toddler running shoes, kids running shoes         |

### Do-not-negate

- "cheap running shoes" - 51 clicks and 4 conversions at target ROAS. "Cheap" is junk in many accounts but converts here (the store carries a budget line). Taxonomy signals are priors, not verdicts.

### Watchlist

- "trail running shoes review" - 12 clicks, $11, 0 conv. Comparison intent; below the click gate. Re-check next pass.

### Next review

Weekly cadence - next pass in 7 days.

## Negative example - what not to do

The request: "cut wasted spend, here's the report" on the B2B account above.

The bad pass:

- Added broad negative `free` account-wide → also blocks "risk-free project management software trial" and every query containing "free trial", which converted 9 times last quarter. No overblocking review was run. (Violates: the overblocking review, workflow step 5.)
- Added broad negative `free template` expecting it to also block "free" alone - it doesn't. A broad negative only blocks searches containing ALL its words, so single-word "free …" queries kept spending. The mechanics were assumed, not checked. (Violates: the match-type mechanics, Core mechanics.)
- Added `project management` as a phrase negative to kill informational queries → conflicts with the account's own core keywords. Negatives beat positives, so the main ad group silently stopped serving while showing "active". (Violates: the conflict check, workflow step 5.)
- Accepted the platform's default match type (exact) on 30 report additions → each blocked only its one literal query. Plural and reworded variants kept matching, and the next report looked identical. (Violates: the default-match-type check, Core mechanics.)
- Negated every term with a single click and no conversion → hundreds of exclusions on no statistical basis, reach collapse on an account whose true waste was ~7% of spend. (Violates: the negation gates, workflow step 3.)
SKILL.md›
---
name: ad-negative-keywords
description: "Build and maintain negative keyword lists from search term reports to cut wasted ad spend in paid search - n-gram query mining to surface irrelevant search terms, the right negative match types and exclusion levels (account, shared list, campaign, ad group), and a review cadence that avoids overblocking queries that convert. Use whenever the user mentions a search term or search query report, irrelevant clicks, junk traffic, wasted ad spend, or wants to exclude or block keywords - even if they never say 'negative keywords'. Covers B2B lead gen and B2C/e-commerce; needs the account's query data. Do NOT use for account-wide underperformance with no query-level evidence - use mbfinotti/advertising-skills@ad-account-diagnostic instead."
license: MIT
metadata:
  author: Maya-Beth Finotti
  version: "1.1.8"
---

# Negative Keywords

Build and maintain a negative keyword list from search term reports, so paid-search budget stops leaking to irrelevant queries - without blocking the queries that convert.

The mechanics - match types, exclusion levels, thresholds, cadence - are identical for B2B lead gen and B2C/e-commerce. Two things differ by segment:

- Which junk categories dominate (see taxonomy).
- The decision data: B2B's sparse conversions force click/cost gates, B2C volume allows conversion-based gates.

## Evidence gate

- Never propose specific negative keywords for a live account without its search term report (also called search query report).
- Missing report → request an export, explain the overblocking review below, and name zero candidate negatives in the meantime.
- Exception: a brand-new campaign with no history may get a starter exclusion list - label it "pre-launch starter, review against real queries after 7-14 days".

A list invented from imagination has no evidence of what actually matches, and its cost, blocked converting queries, stays invisible.

## Clarifying questions

Ask once, briefly, before analyzing. Skip anything already answered. This is a tactical pass, not an interview.

1. What counts as a conversion, and what is the target CPA or ROAS?
2. What date range does the report cover, and roughly what did the account spend over it?
3. What CPC range does the account run? (Sets the click threshold.)
4. Which queries or themes must never be blocked - brand terms, converting themes, deliberate competitor bidding?
5. Which levels can you edit: account/shared list, campaign, ad group?
6. By what date must the saving show up in the account's numbers?
7. Is this a one-off cleanup, or a standing maintenance job you want to keep compounding?
8. What is the effort ceiling per pass - minutes available, who else has to approve a change, and can you reverse an account-level exclusion yourself?

Re-rank this skill's two option menus (exclusion level, cadence) against those answers:

- A hard date promotes the fast local rungs - ad group or campaign negatives applied in this pass.
- A standing-maintenance mandate promotes the compounding rungs - shared exclusion lists plus the quarterly conflict sweep.
- A tight effort ceiling or a slow approval path demotes account-level exclusions, which cost the most to audit and the most to reverse.

Every ordering below is a default, not a law: it shifts with the account and with who executes it. Re-rank against what you already know about this user - an in-house scripting ability makes the n-gram pass and the conflict sweep far cheaper than the default order assumes, and a shared list already built and attached makes that rung near-free. Where an answer rules a rung out entirely rather than moving it, delete it by name (see step 7).

## Core mechanics

Read before adding anything - most negative-keyword damage traces to these rules.

- Positive keywords expand automatically to close variants.
- Negative keywords do NOT expand to close variants. Add plurals, synonyms, and word stems as separate negatives yourself.
- Casing and misspellings are matched automatically.
- Negative match types, ranked by waste blocked per unit of overblocking risk: `phrase > exact > broad`.
  - Phrase (default) - blocks the words in that order; extra words around them still block. Best ratio: one entry kills a whole junk theme, and a wrong call costs that theme, not the account.
  - Exact - blocks only that literal query. Safest and narrowest: use it for a surgical block next to converting siblings. It needs one entry per variant, so a list built mostly of exacts becomes a standing job.
  - Broad - blocks any search containing ALL the words, in any order. Widest reach and widest blast radius: one bad broad negative silently zeroes a converting theme. Reserve for terms that are wrong in every recombination.
- Axes disagree:
  - reach: `broad > phrase > exact`
  - overblocking risk: `broad > phrase > exact`
  - upkeep effort: `exact > phrase > broad`
- Move up to broad only when the term is wrong in every recombination AND the conflict check against active keywords comes back clean. Move down to exact when the term sits one word away from a converting query.
- Check the platform's default match type when adding from a report - some default to exact, which blocks the fewest searches. Switch to phrase deliberately.
- Negatives always beat positives: a blocked active keyword still displays as active but never enters the auction.

## Workflow

1. Pull the search term report for the lookback window.
   - 7-14 days for a recurring weekly pass.
   - 30-90 days for a first cleanup or a low-volume account.
2. Sort by cost descending. Filter to zero conversions. This surfaces the spend producing nothing.
3. Mark a term as a candidate when it crosses either gate:
   - 15-20 clicks with zero conversions (tighten to 10-12 when CPC is high, roughly $3+).
   - Spend of 1.5-2x target CPA with zero conversions, regardless of click count.
   - Low-volume B2B: conversion data is too sparse to gate on - rely on the click/cost gates plus clear irrelevance from the taxonomy.
4. Classify each candidate with the taxonomy below. A merely uncertain term is not a candidate - leave it to collect more data.
5. Run the overblocking review on every candidate:
   - Ever converted in account history (the term or a close sibling)? Do not negate.
   - Would the chosen match type also block a plausible converting query? Narrow the match type or wording.
   - Conflicts with an active keyword anywhere in the account? The negative silently zeroes that keyword.
6. Set the match type per the ranking in Core mechanics, then expand variants manually: plural/singular, synonym, and stem forms.
7. Pick the level, ranked by waste blocked per unit of blast radius: `shared exclusion list > ad group or campaign > account`.
   - Shared exclusion list (default) - for a recurring theme across campaigns. Costs about an hour once: name it by taxonomy category, attach it, document it. After that every new campaign inherits it by attachment, so the payoff compounds. Reversible by detaching, and the blast radius stops at what you attached.
   - Ad group or campaign - for a query genuinely local to one container. Near-zero effort, near-zero blast radius, and near-zero durability: the same term resurfaces in the next campaign and gets negated again from scratch.
   - Account level - for universal disqualifiers and brand-safety terms only. Widest reach, and the worst reversibility of the three: it suppresses everywhere, including campaigns built later by someone who never saw the list, and nothing in those campaigns points back at it.
   - Axes disagree:
     - reach: `account > shared list > ad group`
     - setup effort: `shared list > account == ad group`
     - effort to audit later: `account > shared list > ad group`
     - reversibility: `ad group > shared list > account`
   - Account and ad group tie on setup effort because both are the same act - paste the term into one container's negative list, near-zero either way. Everything that separates them lands after setup, on reach, audit and reversal.
   - What the efficiency order starves: the account-level exclusion. It buys the widest reach of the three and it is the one rung nobody can audit or reverse cheaply, so a ratio always picks something smaller. Promote it anyway for a universal disqualifier or a brand-safety term - the terms whose cost of leaking once is higher than the cost of an over-wide block - and the third time the same term needs negating in a new container.
   - Move down when the term is only wrong for one product line, geography, or campaign intent.
   - Delete, don't demote: with no edit rights at account level, that rung leaves this user's menu and is reported as deleted, not ranked last. Same for the shared list on a platform that has no shared-list object at all - plan on per-container negatives and a written re-application step, rather than a rung the account cannot express.
8. Deliver in the output shape below. On a live account, present a draft for approval - never mass-apply silently.
9. Log the change (date, terms, level, match type, reason) and schedule the next pass per the cadence.

## Query mining for hidden terms

Platforms hide a large share of search terms - practitioner measurements center around 40% of spend. Token-level mining recovers signal the report no longer shows:

1. Export all visible search terms with cost, clicks, conversions.
2. Tokenize each query into unigrams, bigrams, and trigrams.
3. Aggregate cost and conversions per token across every query containing it.
4. Sort tokens by cost descending, filter zero conversions, apply the same gates as the main workflow.
5. Negate bad tokens as phrase negatives. Flag high-converting tokens as expansion leads for the account owner - positive keyword research is out of this skill's scope.

- Can run scripts: a short tokenizer over the export is the fast path.
- Can't run scripts: do the same aggregation in a spreadsheet - split words into columns, pivot, sum cost per token. Same logic, smaller scale.

These two are deliberately unranked: capability decides, not efficiency. The tokenizer is only cheaper for someone who already writes scripts, and the spreadsheet produces the identical aggregation.

## Cadence

Axes disagree:

- value (waste caught per hour): `recurring search-term pass > quarterly conflict sweep > monthly list audit`
- standing cost: `recurring pass > monthly list audit > quarterly conflict sweep`

Get the top rung running before adding either other one. The sweep is the cheapest commitment on the page and still outranks the audit on value.

- Recurring search-term pass - budget 30-45 minutes.
  - Weekly, 7-14 day lookback: higher-spend accounts (~$10k+/month), or anything new or in a learning phase.
  - Bi-weekly to monthly: stable lower-spend accounts.
  - Several near-empty passes in a row → lengthen the interval.
- Quarterly conflict sweep - a full conflict check against active keywords, plus the match-type review (are broad negatives over-blocking?). Four short runs a year that catch the most expensive failure in this skill: a negative silently zeroing a keyword that was serving.
- Monthly list audit - prune stale entries from shared exclusion lists, merge duplicates. Hygiene only: defer it while the recurring pass is still surfacing real waste.

## Irrelevant-query taxonomy

Same categories for B2B and B2C; the weighting differs.

| Category              | Signals                                                   | Hits hardest                                           |
| --------------------- | --------------------------------------------------------- | ------------------------------------------------------ |
| Competitor            | competitor brand names                                    | both - strategy call, confirm before negating          |
| Job seeker            | jobs, careers, salary, hiring, intern, resume             | B2B                                                    |
| DIY / free intent     | free, diy, template, cheap, open source                   | B2B                                                    |
| Informational         | what is, how to, meaning, tutorial, course, pdf           | B2B                                                    |
| Wrong geography       | cities/countries not served                               | both                                                   |
| Wrong product tier    | used, refurbished, wholesale, mini, for kids, replacement | B2C                                                    |
| Comparison / research | reviews, best, vs, comparison                             | both - often early-funnel, not junk; judge per account |
| Unsafe / brand-unsafe | adult, illegal, tragedy-adjacent                          | both                                                   |

- Treat competitor and comparison terms as strategy calls, never automatic junk - some accounts bid them deliberately. Ask first.
- B2C/e-commerce adds attribute mismatches (size, color, gender, model) the catalog can't serve.

## Output shape

Deliver every pass as:

1. Summary: spend analyzed, wasted spend found (cost on zero-conversion candidates), % of total, and any exclusion level deleted from this account's menu with the constraint that deleted it.
2. Additions table: term | match type | level | evidence (clicks, cost, conversions) | category | variants added.
3. Do-not-negate list: candidates that failed the overblocking review, with the reason.
4. Watchlist: uncertain terms left to collect data, each with the gate that would trip it.
5. Next review date.

See [references/worked-example.md](references/worked-example.md) for a filled-in B2B pass and an e-commerce pass, plus a negative example of what not to do.

## Failure modes

- Overblocking: every negative narrows reach, and a healthy account's true waste is often only 4-8% of spend. Negate the clearly wrong, never the merely uncertain.
- Negating a converting term: the single most expensive mistake - the overblocking review exists for it. Check conversion history first, always.
- Forgetting the close-variant asymmetry: a negative blocks "running shoes" but not "running shoe". Lists without manual plural/synonym variants quietly leak.
- Default match-type trap: adding from the report at a default of exact blocks almost nothing - the list looks maintained while the waste continues.
- Conflicts with active keywords: a negative above an active keyword silently zeroes it. Run the quarterly sweep. Re-check whenever adding broad negatives.
- Volume worship: more negatives is not better. A large published study of account-level exclusions found near-zero CPA/ROAS difference versus accounts without them - where and how negatives are applied matters more than how many.
- Query-length blind spot: very long searches can slip past negatives positioned late in the phrase - never rely on negatives alone for brand safety.

## Objective and measurement

- Primary KPI: wasted spend share = cost on zero-conversion irrelevant terms / total analyzed spend, recomputed each pass on the same lookback window length.
- Pass threshold: after 90 days on cadence, wasted spend share under 10% of non-brand spend AND zero converting terms blocked (verify against the change log and conversion history).
- Secondary KPIs:
  - CPA/ROAS delta across adjacent equal-length windows.
  - Reclaimed non-brand spend - practitioners report 10-20% reclaimed within 90 days on previously unmanaged accounts.
- Already at 4-8% wasted share? The account is near its practical floor: shift effort to the conflict sweep and watchlist, and lengthen the cadence rather than forcing new exclusions.

## References

- [references/worked-example.md](references/worked-example.md) - worked B2B and e-commerce passes in the output shape, plus a negative example.
- [references/platform-notes.md](references/platform-notes.md) - optional vendor-specific notes (defaults, limits, keywordless surfaces). Load only when the user names their platform.
- mbfinotti/advertising-skills@ad-bidding-strategy - bid strategy decisions.
- mbfinotti/advertising-skills@ad-spend-allocation - budget allocation across campaigns.
- mbfinotti/advertising-skills@ad-budget-pacing - campaign pacing and spend distribution.
- mbfinotti/advertising-skills@ad-account-diagnostic - account-wide underperformance diagnosis.
- mbfinotti/advertising-skills@paid-landing-page-audit - landing page optimization.
- mbfinotti/advertising-skills@ad-copy-variants - ad copy and creative testing.