Install
$ agentstack add skill-fourteenwm-ppc-ai-skills-neg-conflict-finder ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
MCC Negative Keyword Conflict Finder
Identifies every place a negative keyword is blocking a positive keyword you bid on, across all accounts under an MCC, at every level Google supports — ad group, campaign, account-level shared lists, and MCC-level shared lists.
When to Use
- User asks to find or audit negative keyword conflicts
- User suspects old negatives are silently blocking active keywords
- User wants a portfolio-wide negative keyword health check
- User wants to know which positives are being blocked and where the negative lives
What It Does
Runs as a Google Ads Script inside an MCC. For each labeled account it:
- Pulls all positive keywords (ad group level, enabled only)
- Pulls all negative keywords from every level Google supports:
- Ad group negatives
- Campaign negatives
- Account-level shared lists
- MCC-level shared lists (applied via
customer.managerCustomer) - Account-level negative keywords (when the API supports the field path; degrades gracefully when not)
- Runs match-type-aware blocking detection (broad blocks broad/phrase/exact, phrase blocks phrase/exact via subsequence match, exact blocks exact only)
- Writes one row per conflict to a Google Sheet, with the conflicting negative, where it lives, and which positive(s) it blocks
Output Sheet columns:
| Column | Description | |--------|-------------| | Account Name | Google Ads account name | | Conflicting Negative Keyword | The negative that's blocking | | Level & Location | Where the negative lives (e.g., "Shared List: GS Negatives", "Campaign: Brand - Search") | | Blocked Positive Keywords | The positive keyword(s) being blocked |
Setup
- Open the Google Ads Scripts editor at the MCC level (Tools → Bulk actions → Scripts in the legacy UI, or Tools → Scripts under the modern MCC UI)
- Create a new script and paste the contents of
scripts/mcc-neg-keyword-conflict.js - Edit the configuration block at the top:
ACCOUNT_LABEL— set to a label you've applied to the accounts you want to process. Required. The script only iterates labeled accounts.SHEET_URL— optional. Leave blank to have the script create a fresh sheet on each run, or paste an existing Sheet URL to overwrite it.REQUIRE_RECENT_SPEND— optional spend filter (defaulttrue). Skips accounts with no spend in the last 7 days. Set tofalseto process every labeled account.
- Authorize the script when Google prompts (first run only)
- Run — manually first, then schedule daily/weekly under Frequency
Run the Script
There are no CLI commands — this is a Google Ads Script. After pasting and configuring:
- Click Preview to check authorization and config without writing rows
- Click Run to execute fully
- Open the linked Sheet to review conflicts
- Set a Frequency (Daily, Weekly, etc.) for ongoing monitoring
How to Resolve Conflicts
The script identifies — it doesn't remove. Resolution is manual review (intentionally — automated removal of negatives is high-risk). For each row:
- Read the negative + the positive(s) it blocks. If the negative is doing real work (blocking off-brand traffic), keep it and let the positive die.
- If the positive is intentional, remove the negative. Find it at the level shown in
Level & Location:
- Ad group level → Ad Group → Negative Keywords tab
- Campaign level → Campaign → Negative Keywords tab
- Shared list → Tools → Shared Library → Negative keyword lists → [list name]
- MCC shared list → MCC level → Tools → Shared Library
- If neither — kill the conflicting negative. Often these are old negatives from a campaign that doesn't exist anymore.
Limitations
- Search campaigns only. Performance Max, Display, and Video campaigns don't use traditional negatives the same way.
- Enabled keywords only. Paused positives won't show as blocked.
- Account-level negatives may be skipped if Google's
customer_negative_criterionAPI rejects the keyword field path. Other levels still detect normally — the script logs a warning and continues. - Read-only. The script writes to a Sheet but never modifies any account. Review and remove negatives in the UI yourself.
What NOT to Do
- Do NOT remove a negative just because it shows up as a conflict. Some conflicts are intentional (a brand campaign with
[brand_name]as positive andbrand_name reviewsas negative is a deliberate split, not a bug). - Do NOT auto-remove negatives based on this output without reviewing each one.
- Do NOT run on every account in the MCC at once. Use the label filter — narrow to a portfolio or service tier first.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: fourteenwm
- Source: fourteenwm/ppc-ai-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.