Negative Keyword Implementer
SKILL.md
HOW_TO_USE.md
sample_input.json
expected_output.json
skillsgoogle-adsSKILL.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
# Negative Keyword Implementer
Stop talking about negatives. Start adding them. This skill takes your negative keyword lists and implements them directly in Google Ads.
## Core Philosophy
**Analysis without action is waste.** You've identified the garbage search terms. Now block them before they cost you more money.
**The Implementation Questions:**
1. Which negatives should be added at campaign vs ad group level?
2. What match type should each negative use?
3. Are there any conflicts to check?
4. How do we confirm the changes worked?
---
## MCP Integration
### Write Action Used
This skill uses the Google Ads MCP `add_negative_keywords` action:
```json
{
"platform": "google-ads",
"workspace_id": "<WORKSPACE_ID>",
"brand_id": "<BRAND_ID>",
"account_id": "XXXXXXXXXX",
"action": "add_negative_keywords",
"campaign_id": "123456789",
"keywords": ["free", "cheap", "discount"],
"match_type": "BROAD"
}
```
### Action Parameters
| Parameter | Required | Description |
|-----------|----------|-------------|
| workspace_id | Yes | Workspace ID from accounts |
| brand_id | Yes | Brand ID within workspace |
| account_id | Yes | Google Ads customer ID |
| action | Yes | Must be "add_negative_keywords" |
| campaign_id | Conditional | Campaign ID (for campaign-level) |
| ad_group_id | Conditional | Ad group ID (for ad group-level) |
| keywords | Yes | Array of negative keyword texts |
| match_type | No | BROAD (default), PHRASE, or EXACT |
**Note:** Either campaign_id OR ad_group_id is required, not both.
---
## Input Requirements
### Option 1: From search-term-gold-miner Output
If you've run `search-term-gold-miner`, provide its output:
```json
{
"immediate_negatives": [
{"search_term": "free bags", "spend": 150, "conversions": 0},
{"search_term": "bag repair", "spend": 85, "conversions": 0}
],
"pattern_negatives": [
{"pattern": "free", "match_type": "PHRASE"},
{"pattern": "repair", "match_type": "PHRASE"}
]
}
```
### Option 2: Manual Negative List
Provide a list of negatives to add:
```
free
cheap
diy
how to
jobs
careers
repair
used
```
### Option 3: Copy from Google Ads
Paste your negative keyword list from Google Ads for cross-campaign implementation.
---
## Analysis Framework
### Step 1: Pre-Implementation Validation
**Before adding negatives, check:**
1. **Conflict Check**
- Does the negative match any existing keywords?
- Will it block high-performing search terms?
2. **Level Determination**
- Campaign-level: Applies to ALL ad groups (broader protection)
- Ad group-level: Applies to specific ad group only (surgical precision)
3. **Match Type Selection**
- **EXACT**: Block only this exact query (most conservative)
- **PHRASE**: Block queries containing this phrase (balanced)
- **BROAD**: Block queries with these words in any order (most aggressive)
---
### Step 2: Match Type Strategy
**Match Type Decision Matrix:**
| Scenario | Recommended Match | Reason |
|----------|-------------------|--------|
| Specific irrelevant query | EXACT | Surgical, preserves variations |
| Bad intent pattern | PHRASE | Blocks phrase anywhere in query |
| Irrelevant word | BROAD | Blocks all variations |
| One-word disaster | PHRASE or EXACT | Avoid accidental blocking |
| Multi-word pattern | PHRASE | Natural phrase blocking |
**Examples:**
| Negative | Match Type | What It Blocks |
|----------|------------|----------------|
| [free bags] | EXACT | Only "free bags" |
| "free bags" | PHRASE | "free bags online", "get free bags" |
| free bags | BROAD | "bags for free", "free designer bags" |
---
### Step 3: Level Strategy
**When to Use Campaign-Level:**
- Universal negatives (jobs, careers, free, DIY)
- Brand protection across all ad groups
- Terms never relevant to any product/service
**When to Use Ad Group-Level:**
- Product-specific exclusions
- Terms relevant in some contexts but not others
- Precise control for different offerings
---
## Implementation Process
### Phase 1: Review & Confirm
**Present negatives for user approval:**
```
PROPOSED NEGATIVE KEYWORDS
Campaign: [Campaign Name]
Level: Campaign-wide
EXACT MATCH:
- [term 1]
- [term 2]
PHRASE MATCH:
- [term 3]
- [term 4]
BROAD MATCH:
- [term 5]
Estimated Monthly Savings: $XXX
Proceed with implementation? (yes/no)
```
---
### Phase 2: Execute
**Call MCP action for each batch:**
```json
{
"platform": "google-ads",
"workspace_id": 101,
"brand_id": 69,
"account_id": "9382431689",
"action": "add_negative_keywords",
"campaign_id": "123456789",
"keywords": ["free", "cheap", "diy", "how to"],
"match_type": "PHRASE"
}
```
**Batch by match type** (separate call for each):
1. Add EXACT negatives
2. Add PHRASE negatives
3. Add BROAD negatives
---
### Phase 3: Confirm & Report
**After implementation:**
```
IMPLEMENTATION COMPLETE
Campaign: [Campaign Name]
Negatives Added: XX
EXACT MATCH: X keywords
PHRASE MATCH: X keywords
BROAD MATCH: X keywords
Status: SUCCESS / PARTIAL / FAILED
Next Steps:
- Monitor search term report in 7 days
- Verify blocked terms no longer appearing
- Track spend reduction vs baseline
```
---
## Output Format
### Pre-Implementation Summary
```
NEGATIVE KEYWORD IMPLEMENTATION PLAN
ββββββββββββββββββββββββββββββββββββ
Account: [Account Name]
Source: search-term-gold-miner / manual list
CAMPAIGN-LEVEL NEGATIVES:
Campaign: [Campaign Name] (ID: XXXXXXX)
EXACT MATCH (X keywords):
βββββββββββββββββββββββββ
[free bags]
[bag repair near me]
PHRASE MATCH (X keywords):
βββββββββββββββββββββββββ
"free"
"repair"
"jobs"
BROAD MATCH (X keywords):
βββββββββββββββββββββββββ
careers hiring
CONFLICT CHECK:
β οΈ "free" may conflict with keyword "free shipping promo"
β Recommendation: Use EXACT [free bags] instead
β No other conflicts detected
ESTIMATED IMPACT:
Monthly wasted spend blocked: ~$XXX
Search terms affected: ~XXX
Ready to implement? (yes/no/modify)
```
---
### Post-Implementation Report
```
IMPLEMENTATION REPORT
βββββββββββββββββββββ
Account: [Account Name]
Timestamp: [datetime]
RESULTS:
ββββββββ
Campaign: [Campaign Name]
β EXACT negatives added: X
β PHRASE negatives added: X
β BROAD negatives added: X
Total Negatives Added: XX
Status: SUCCESS
MCP RESPONSE:
{
"status": "success",
"negative_keywords_added": XX,
"level": "campaign",
"target_id": "XXXXXXX"
}
NEXT STEPS:
1. Check search term report in 7 days
2. Verify wasted spend reduction
3. Run search-term-gold-miner again in 14 days
```
---
## Composability
**Chains from:**
- `search-term-gold-miner` - Primary input source for negatives
- Manual lists or spreadsheets
**Chains to:**
- `spend-pacing-monitor` - Verify spend reduction
- Re-run `search-term-gold-miner` - Validate blocked terms
**Workflow Example:**
```
search-term-gold-miner (identify waste)
β
negative-keyword-implementer (add negatives)
β
Wait 7-14 days
β
search-term-gold-miner (verify improvement)
```
---
## Safety Features
### Automatic Protections
1. **Always require user confirmation before adding**
2. **Conflict detection against existing keywords**
3. **Match type recommendations to prevent over-blocking**
4. **Batch limits to prevent accidents**
5. **Full rollback instructions if needed**
### Rollback Process
If negatives were added incorrectly:
1. Go to Google Ads β Keywords β Negative Keywords
2. Filter by date added
3. Select and remove incorrect negatives
**Note:** MCP does not currently support negative keyword removal - must be done in UI.
---
## Limitations
**I can do:**
- Add negative keywords at campaign or ad group level
- Use BROAD, PHRASE, or EXACT match types
- Batch multiple keywords per call
- Validate against conflicts
**I cannot do:**
- Remove existing negative keywords (UI only)
- Add shared negative keyword lists (API limitation)
- Add negatives to Performance Max campaigns
- Guarantee zero over-blocking (user must validate)
**Best Practices:**
- Start with EXACT match for uncertain negatives
- Review search terms 7 days post-implementation
- Keep a log of negatives added with dates
---
## Quality Checklist
Before implementation:
- [ ] Negatives reviewed for conflicts
- [ ] Match types assigned appropriately
- [ ] Level (campaign vs ad group) determined
- [ ] User confirmation received
- [ ] Estimated savings calculated
After implementation:
- [ ] MCP response confirmed success
- [ ] Count of negatives matches expected
- [ ] Post-implementation report generated
- [ ] Follow-up date scheduled
ReadyNegative Keyword Implementer
MarkdownUTF-8Verified