# Applying negatives and monitoring the result

## What the conflict check covers

`node scripts/negatives.mjs conflicts --negatives proposed.csv --keywords keywords.csv --existing lists.csv --terms search-terms.csv`

- CONFLICT: a negative (proposed or existing) blocks the text of an enabled keyword it applies to. The keyword can no longer serve on its own text.
- CONVERTING: a proposed negative blocks a search term that had conversions in the report period.
- DUPLICATE: a proposed row repeats an earlier row word for word (same match type, list and scope). Delete the later copy; the earlier one is checked as normal.
- REDUNDANT: another negative with the same or wider scope already blocks everything this one blocks, and the line names it. Of two proposed rows that cover each other, only the later one is reported. Drop the redundant row only when the row it names stays in the approved file. When that row has its own CONFLICT or CONVERTING line, the output says so: if that row is dropped or narrowed, keep the redundant one. Re-run the check after every drop.
- PAUSED: blocks a keyword that is paused, or sits in a paused ad group or campaign. Fine unless someone plans to re-enable it.
- IMPACT: per proposed negative, the in-scope search terms it would have blocked, with clicks, cost, conversions and value. A seed term with zero rows is normal. Two negatives can block the same term (`free invoice template` is hit by both `free` and `template`), so the rows do not add up. The "IMPACT total" line counts each search term once; quote that line to the approver and use it on day 28.
- Row numbers in the output count data rows after the header of the proposed file.
- Rows whose status column says removed are skipped, in every input file.
- Exit code 1 when there is any CONFLICT or CONVERTING line. Do not propose a change set until it exits 0 or every remaining line has a written owner decision.

What it cannot see:

- What a phrase or broad keyword matches by meaning. The check tests the keyword's own text, not every search Google would match to it.
- Close variants on the keyword side. An exact keyword can match a same-meaning search that the negative does not literally contain, and the reverse.
- Misspellings. Google's page (2026-10-17) says negatives account for misspellings, but the check matches literal words only. Look for misspelled forms of each negative among the keywords and the converting search terms by eye.
- Negatives that were not in the input. A clash with a shared list is invisible if the list's keywords were not passed with `--existing`.
- Words after the 16th in a long search. Google says an ad may still show in that case; the script treats those words as unchecked, an approximation.
- Google's handling of symbols beyond the published rules.

Fixes, in order of preference:

- A campaign negative meant to keep searches out of one ad group: move it to that ad group.
- A broad or phrase negative that hits a converting term: make it longer (phrase on the bad multi-word theme) or exact on the specific bad terms.
- A negative that only blocks a few bad terms and many good ones: drop it and negate those terms as exact.

## Google Ads Editor import

What the help pages say (2026-10-17):

- Account, Import, then choose a file or paste text. Import is greyed out while other proposed changes are pending; keep or reject them first.
- Check the column headers in the preview. The preview shows up to 100 rows but every row is imported.
- After Import, Editor lists errors and warnings. Review imported changes shows the rows as proposed changes: Keep proposed changes, Reject proposed changes, or decide row by row. Nothing reaches Google until the user posts.
- English headers are recognised automatically; capitalisation and spaces do not matter. Unrecognised headers can be mapped in the preview.
- Match type values in Editor are broad, phrase, exact, negative broad, negative phrase and negative exact. Keywords can instead carry symbols (quotes, brackets, a leading minus for negatives), but mixing symbols with a match type column that disagrees is an error. The script writes plain text plus the type column.
- Editor's CSV columns page documents a "Campaign negative" type for campaign-level negatives, and states that negative items cannot be paused.

What worked in practice (Editor 2.13, October 2026):

- File: UTF-16 LE with BOM, tab separated, LF line ends, `.csv` extension, the same as Editor's own export. `node scripts/negatives.mjs editor --negatives approved.csv --out negatives-import.csv` writes it.
- Columns: `Campaign`, `Ad Group`, `Keyword`, `Criterion Type`. Campaign negatives use `Campaign Negative Broad`, `Campaign Negative Phrase` or `Campaign Negative Exact` with `Ad Group` blank; these imported cleanly.
- Ad group negatives: the script writes `Negative Broad`, `Negative Phrase` or `Negative Exact` (the help page's match type names) with `Ad Group` filled. These were not part of the imports seen in practice, so check them in the import preview.
- If the user's Editor version rejects a value, export one existing negative of that kind and copy its exact headers and values.
- Run Get recent changes before importing. Import one file at a time and review before keeping. If anything looks wrong, Reject proposed changes and start again from the complete corrected file, never by importing fixes on top of a half-kept import: imports add rows, they do not replace sets.
- Editor's check only proves the format. Run Check changes, then Post.

Not in the import file. The editor command writes one text file per shared list (`negatives-import-list-<name>.txt`) and one for the account-level list (`negatives-import-account-level.txt`), one keyword per line with match type symbols (`jobs`, `"what is"`, `[invoice automation jobs]`), and prints the row count to check after pasting:

- Shared lists: create or edit them in the web interface shared library (Tools, Shared library, Exclusion lists, Negative keyword lists tab). Paste the keywords, then Apply to campaigns. A manager account list must be applied from each client account's shared library.
- Account-level negatives: the account settings "Negative keywords" section. Count first: the limit is 1,000. The help page says broad, phrase or exact can be chosen there but does not show the entry format; check in the interface whether pasted symbols set the match type before pasting.
- Performance Max: web path from the help page is Campaigns, Keywords, Negative keywords tab, the plus button, select the Performance Max campaign, then type keywords or select a list. Editor 2.10 and later can do campaign-level negatives for Performance Max, 2.11 and later can attach lists.
- Brand exclusions: Performance Max campaign Settings, Additional settings, Brand exclusions. For Search, the brand settings sit in the AI Max settings panel, and adding a new brand list needs AI Max turned on for the campaign.

## Without Editor

- Campaign and ad group negatives: follow the section "Add negative keywords to ad groups, campaigns, and negative keyword lists" on Google's "Add negative keywords to campaigns" page. On 2026-10-17 it said to pick all campaigns or one campaign or ad group, choose Edit exclusions, enter keywords one per line with match type symbols for Search, and click Done. Lists are attached from Campaigns, Audiences, keywords, and content, Search keywords, the "Negative search keywords" tab and the plus button. Verify the path live before giving it to the user.
- The search terms report also has an "Add as negative keyword" button (Campaigns, Insights and reports, Search terms, tick the terms). It offers ad group, campaign or a negative keyword list, and "Get negative keyword ideas using the search terms report" says negatives added to a Search campaign this way default to negative exact match (2026-10-17).
  - That adds the whole query. One bad search is blocked and the pattern behind it keeps spending under new wording.
  - Use it only for rows the sheet already marks as exact. For n-gram negatives, enter the keyword from the approval sheet with its symbols instead.
  - Detect the habit in an inherited account: long exact negatives that read like full search terms, and the same n-gram still clicking under new terms after each pass.

## Rollback

- Negatives cannot be paused. Undoing one means removing it.
- Before posting, Editor can reject or revert the proposed rows.
- After posting, keep the dated import file and approval sheet. To undo, filter Editor's negative keyword view by the same text and type, remove those rows, Check changes and Post.
- A shared list the change created and applied can be removed from the campaigns in one step. A list that already existed and got new keywords cannot: removing it from campaigns also drops every older negative in it. Remove only the added keywords from that list in the shared library; edits to a list apply to every campaign using it.

## Monitoring

- Same day: Get recent changes in Editor (or re-run the existing-negatives queries) and confirm the counts per campaign and per list match the approved sheet.
- Day 7: download search terms for the days since posting.
  - A negated theme with new clicks means a variant was missed (plural, synonym, word order for phrase) or the negative sits in the wrong scope. Add the variant.
  - Any `Added / Excluded` row is a clash to fix the same day.
- Day 28: compare the 28 days after with the 28 days before, same weekday mix, per affected campaign.
  - Clicks and cost should fall by roughly the "IMPACT total" line scaled to 28 days.
  - With about 30 or more conversions in each 28-day window: if conversions fall by more than 20% while the blocked terms had no conversions, assume a conflict until proven otherwise. Re-run the conflict check with fresh keyword and list exports, check keyword statuses, and read the change history.
  - With fewer conversions, a 20% move is normal noise. Compare against the range of the previous eight weeks, and rely on the two signals below.
  - A keyword that drops to near zero impressions after the change is the clearest sign of a clash, at any volume. So is any new `Added / Excluded` row.
- Auto-apply: check whether "Remove conflicting negative keywords" or "Add broad match keywords" are set to apply automatically. Turning either off is an account setting change for the owner to approve.
- Cadence: re-mine every 30 days, or sooner when spend since the last pass reaches 10 times the target CPA. Mine weekly in the first month of a new campaign and after switching keywords to broad match or turning on AI Max.
- Limits: before each pass, count account-level negatives (limit 1,000), keywords per list (5,000), lists (20) and negatives per campaign (10,000). Remove REDUNDANT entries before adding more.
- Record: propose a dated entry for `martech-context/decisions.md` with the lists changed, counts added, the competitor, location and existing-customer decisions and who approved them.
