Most accounts I take over have the same folder of good intentions: a negative keyword list someone built a year ago, then stopped updating. Meanwhile the search terms report keeps growing by hundreds of new queries a week, and a share of the budget goes to searches nobody would approve if they saw them.
Cleaning that report by hand once a month does not keep up, and doing it properly across accounts took me several hours on some days. For one account I wrote a script that reads the report every week and applies a set of rules we agreed on in advance. Below are the rules; they took longer to agree on than the code took to write. I made up every query below; the real ones belong to the client.
Scripts inside Google Ads
Google Ads has a built-in place for small programs, under Tools, then Bulk actions, then Scripts. A script can read your reports, add negative keywords to a shared list, and run on a schedule you set. It runs inside your account with your permissions, so nothing leaves Google except the message it sends you. The script I use runs once a week, reads the last seven days of search terms, and sends me two Telegram messages: a short report and a plain list of what it excluded, ready to copy.
Five rules, in order
The script checks a query against the first rule, and if it matches, the later rules never see it. That order protects queries that look like waste and bring customers.
Competitor names stay
"Post a listing on BigBoard" looks like a query for another company's site. In this account it is the hottest possible customer: a person who is about to do on a competitor's platform exactly what we want them to do on ours. A competitor campaign exists for those searches, so the script marks them as protected before any other rule can touch them. Put this check first. If the "too generic" rule ran before it, half of these would be gone.
"Where do I post" stays too
"Site to list an apartment", "platform for selling a car", "board for job ads". The person is looking for a place to do the thing we offer, and has not chosen one yet. The script leaves these alone even when they contain no brand and no product word.
Generic queries: report only
"Apartment Chicago", "used cars Texas", "plumber near me". Buyers type these, and so do the sellers we want. The words are the same, and only the rest of their behaviour differs. The script counts them, sorts them by cost, and puts them in the weekly report for me to read. It does not exclude a single one on its own. Conversions turn up in this group, and an automatic rule would have thrown them away.
Missing the core word: out at once
"Post an ad online", "how to write a classified", "free advertising". Nothing in the query says what is being advertised, and in this account that meant someone selling a sofa, not a property. The script excludes these as exact-match negatives without waiting for clicks or cost. The client asked for this specifically: there was no reason to pay for ten clicks to confirm what the query already said.
The grammar tells you who typed it
"Sell my apartment fast" and "apartments for sale" share a root word and describe two different people. The first is an owner who wants to sell. The second is a buyer browsing. In this account the owner is the customer and the buyer is not, so the verb form is a signal to keep and the noun form is a signal to watch. Whatever you sell, look for the same split in your own report: the way people phrase a query often reveals which side of the transaction they are on.
Exact match, and why
Negative keywords behave differently from the keywords you bid on. Google's help page states: "Negative keywords don't match to close variants, so your ad might still show on searches or pages that contain close variations of your negative keyword terms." You "need to add synonyms and singular or plural versions if you want to exclude them." Source: About negative keywords.
The script adds the exact query it saw, and only that. A broad negative built from one bad query can block a good one that shares the words. An exact negative blocks exactly what wasted the money, and the list stays readable when a human checks it.
The Monday message
The report says how many search terms the script read and how many it excluded, lists the protected queries it saw and left alone so I can confirm the competitor rule still fits, shows the generic queries sorted by cost with conversions next to them for a manual decision, and flags any query that spent more than a set amount with no conversion, regardless of category. The second message is the excluded list, one query per line, so the client can paste it into their own records. Everything the script decides is reversible: you remove a negative keyword from the list in one click, and a wrong exclusion shows up in the next weekly report.
Your own five rules
Start with your own version of the five rules, written down before any code exists. Take your last three months of search terms, sort them by cost, and put each expensive query into one of the buckets above: protected, keep, report only, exclude at once. When you can do that for fifty queries without hesitating, you have the rules, and turning them into a script is a small job for a developer or for an AI assistant with access to your account.
My tip: the script does not replace a specialist. I read the generic category myself every week, because buyers and irrelevant searches sit there side by side and their wording does not tell them apart. The script only excludes what cannot be confused with a customer.
If you want to understand what the report is telling you before automating anything, start with Keywords vs Search Terms In Google Ads: What’s The Difference?. And if your search terms report has not been read in months, an account audit starts there.