Google Ads negative keyword builder

A free Claude skill. Groups bad search terms into patterns and builds a paste-ready negative list with the right match type and level - then adds it after a preview.

Needs: the Caybl.ai connector with Google Ads connected. Try: “Review my search terms from the last 60 days and build a negative keyword list.”

What you get

  • Paste-ready negative keyword plan
  • Pattern groups (jobs, free, DIY, wrong vertical...)
  • Broad match drift report
  • One-click apply after preview

Install

claude.ai and Claude Desktop

  1. Download the .zip.
  2. In Claude, go to Settings, Capabilities, Skills, and upload it.
  3. Connect Caybl.ai from the connector directory if you haven’t already.

Claude Code

mkdir -p ~/.claude/skills/google-ads-negative-keywords && curl -fsSL https://caybl.ai/skills/google-ads-negative-keywords/SKILL.md -o ~/.claude/skills/google-ads-negative-keywords/SKILL.md
claude mcp add --transport http caybl https://api.caybl.ai/mcp

The skill

This is the full SKILL.md - the same file you download. View raw.

---
name: google-ads-negative-keywords
description: Reviews live Google Ads search terms through the Caybl.ai connector, groups bad queries into patterns, and builds a paste-ready negative keyword plan with the right match type and level - then adds the negatives after a dry-run preview if the user approves. Use for "find negative keywords", "clean up search terms", "broad match is drifting", "irrelevant clicks", or a monthly search-term review. For spend leaks beyond search terms, see google-ads-wasted-spend.
license: MIT
compatibility: Requires the Caybl.ai MCP connector (https://api.caybl.ai/mcp) with Google Ads connected. Write access is needed only to apply negatives.
metadata:
  author: Caybl.ai
  version: "1.0"
  adapted-from: mardab96/google-ads-skills (search-terms-hygiene-google-ads) and eliasmalmsandberg/google-ads-skills (google-ads-negative-keywords), MIT
---

# Google Ads negative keywords

## Requires

The Caybl.ai MCP connector with Google Ads connected (setup: https://caybl.ai/google-ads-mcp). Adding negatives needs write access switched on for the account in Caybl. If the tools aren't available, say so instead of asking for a CSV.

## Before analysis

1. Confirm the goal (leads, sales, pipeline, brand protection) and the policy on **competitor terms** and **informational queries** ("how to", "what is"). Never negate competitor terms without the user's say-so.
2. List the brand terms, product names and high-value categories that must never be blocked.
3. Read what's already excluded: `run_gaql_report` on `campaign_criterion` and `ad_group_criterion` where `negative = TRUE`, so you don't propose duplicates or conflicts.

## Workflow

1. `get_search_terms` for the last 60-90 days (skip the last 7 days for conversion lag).
2. Normalise queries (lowercase, trim), keep the original for the output.
3. **Group by 1-3 word n-grams** before judging term by term - patterns like "free", "jobs", "login", "pdf", "template", "course", "near me", "definition" usually matter more than single queries.
4. Find:
   - zero-conversion spend (single terms and pattern groups),
   - **broad match drift** - queries far from the keyword's intent, wrong vertical, B2B vs B2C mismatch, support/login/jobs/DIY intent,
   - **false positives** to protect - brand, competitor strategy, low-volume high-value, long sales cycle terms.
5. For drifting keywords, check the keyword itself (`run_gaql_report` on `keyword_view`) - sometimes the fix is tightening the match type, not adding negatives.

## Decision rules

- **Evidence floors:** a single term needs 10+ clicks or spend of 1x target CPA (or 1x the account CPA) with zero conversions. A pattern group needs 20+ combined clicks or 2x target CPA. A term that is unambiguously not the business ("free", "jobs" for a paid SaaS) needs no floor.
- **Match type:** exact for a one-off bad query; phrase for a repeated bad phrase; broad only for a concept that is irrelevant in every form.
- **Level:** campaign level when the intent is bad for that campaign only; ad group level for routing queries between ad groups; account-wide (or every campaign) only when no campaign should ever show for it.
- Check each negative against the account's positive keywords - a negative that would block a converting keyword is a conflict; flag it, don't add it.

## Output

### Summary
Search-term spend analysed, estimated reducible spend, number of negative candidates, the main drift patterns, caveats.

### Negative keyword plan (paste-ready)
| Negative | Match type | Level | Campaign / ad group | Source queries | Spend | Clicks | Conv. | Reason | Confidence | Risk |

### Pattern groups
Informational, competitor, wrong vertical, jobs, free/template/DIY, support/login, irrelevant product, outdated product.

### Broad match drift
| Keyword | Match type | Campaign / ad group | Example bad queries | Spend | Conv. | Fix |

### Apply
Offer to add the negatives. Call `add_negative_keywords` (campaign level) or `add_ad_group_negative_keywords` **with `validateOnly: true` first**, show exactly what will be added, and only re-run with `validateOnly: false` after an explicit yes. Report what was added.

## Guardrails
- Don't block profitable variants or anything with assisted or offline conversions.
- Don't assume every zero-conversion query is waste.
- The search terms report doesn't show every query (Google hides low-volume ones) - say so.
- If you adjust a threshold for a small account, say which and why.

Adapted from mardab96/google-ads-skills and eliasmalmsandberg/google-ads-skills (MIT). See NOTICES.md.

More Google Ads skills

Connect your data, then run the skill

Sign in with Google, connect your accounts and add Caybl.ai to Claude. Google Analytics is free.

Get started free →