Weekly
Find search terms that waste ad spend each week
Every week, Slack lists the search terms that cost money without a single conversion, with suggested negative keywords.
- Runs
- Weekly
- Apps
- Google Ads, Slack
- AI
- Yes, uses the built-in AI allowance
- Access
- Ads read (developer token); Slack chat:write
Send this to your assistant
Create a ClickRuntime automation: every Monday, find Google Ads search terms from the last 7 days that spent more than £20 with no conversions. Post them to #paid with AI-suggested negative keywords.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A small business runs broad match campaigns and pays for clicks on searches that have nothing to do with what they sell. The search terms report would show it, but nobody has time to read thousands of rows each week, so the waste continues month after month.
A weekly list of the worst offenders, with suggested negatives, turns a tedious report into a five-minute job that saves real money.
What you get out of it
Stop paying for the wrong clicks
Search terms that cost money and never convert are listed every week.
Negatives suggested for you
AI proposes negative keywords that block the waste without blocking good traffic.
Five minutes, not an afternoon
The list is short and sorted by cost, so you start with the biggest savings.
The team sees it
Posting in Slack makes wasted spend visible and easy to discuss.
How it works
What happens, step by step
Every Monday, ClickRuntime asks Google Ads for last week's search terms with their cost and conversions.
It keeps the terms that spent more than your threshold without a conversion, most expensive first.
AI suggests negative keywords for them, taking care not to block searches that could convert.
The list and the suggestions are posted to your #paid Slack channel.
Before it runs live
- Connect Google Ads
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Google Sheets
- Combine it with other Google Ads and Slack steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, http, credentials, ai, notify
CUSTOMER_ID = "1234567890"
THRESHOLD = 20
def gaql(query):
headers = {"Authorization": f"Bearer {credentials.connection('google', 'ads')}", "developer-token": credentials.secret("GOOGLE_ADS_DEVELOPER_TOKEN")}
batches = http.post(f"https://googleads.googleapis.com/v21/customers/{CUSTOMER_ID}/googleAds:searchStream", headers=headers, json={"query": query}).json()
return [row for b in batches for row in b.get("results", [])]
@on_trigger
def run(event):
rows = gaql("SELECT search_term_view.search_term, campaign.name, metrics.cost_micros, metrics.conversions "
"FROM search_term_view WHERE segments.date DURING LAST_7_DAYS AND metrics.conversions = 0")
waste = sorted(((int(r["metrics"]["costMicros"]) / 1e6, r["searchTermView"]["searchTerm"], r["campaign"]["name"]) for r in rows
if int(r["metrics"].get("costMicros", 0)) / 1e6 >= THRESHOLD), reverse=True)[:25]
if not waste:
return {"terms": 0}
listing = "\n".join(f"• £{c:,.2f} \"{t}\" ({camp})" for c, t, camp in waste)
advice = ai.generate(listing, system="Suggest negative keywords (with match type) that would block these wasted search terms "
"without blocking relevant searches. One line each.", max_output_tokens=500).text
notify.slack(f"*Search terms with spend and no conversions (last 7 days)*\n{listing}\n\n*Suggested negatives*\n{advice}", channel="#paid")
return {"terms": len(waste), "wasted": round(sum(c for c, _, _ in waste), 2)}FAQ
Common questions
Will it add the negatives itself?
What spend threshold should I use?
Does it cover Performance Max?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Post daily Google Ads results to Slack with drop alerts
Every morning Slack shows yesterday's spend, clicks and conversions per campaign, and warns you when a number changed sharply.
See how it worksGet a daily news digest in Slack
Each morning your team gets a short summary of what's new on the sites and blogs you follow.
See how it worksFollow your stocks and crypto in Slack
During market hours you get a short update on the tickers you care about, with a heads-up on big moves.
See how it worksKeep exploring
Set up “Find search terms that waste ad spend each week” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.