Weekly
List search terms that waste budget
A weekly email shows the search terms that spent money and brought no conversions.
- Runs
- Weekly
- Apps
- Google Ads
- AI
- Not needed
- Access
- adwords scope, read
Send this to your assistant
Create a ClickRuntime automation: every Monday, email me Google Ads search terms from the last 7 days that spent over $20 with zero conversions.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A home services business pays for a broad match keyword, and the search terms report shows "how to fix a leaky tap", "plumber salary" and "cheap tap washers" quietly eating $300 a month. Each term spends a few dollars, none converts, and the report has thousands of rows. It is the kind of waste that is obvious once you look and invisible until you do.
Every week, ClickRuntime queries the search term view in Google Ads, keeps terms where cost went above your limit and conversions are still zero, and emails the list sorted by spend. You get the worst offenders first, with cost and clicks beside each phrase.
This is the list to take into your negative keyword review, or to hand to a freelancer who manages the account.
What you get out of it
The costliest queries come first
Sorting by spend puts the few terms causing most of the waste at the top. Fixing five rows can recover more money than hours of scrolling through thousands. You spend your review time where the dollars are.
Evidence for tightening match types
If broad match keeps attracting off-topic queries, the list proves it. You can switch to phrase or exact match with the cost figures in hand to justify the change. That turns a hunch into a measured, defensible adjustment.
Recovered budget gets reused
Money no longer lost on irrelevant searches can fund the queries that convert. The account does more with the same monthly budget, which helps when finance is watching ad costs.
Easy handoff to a freelancer
The email is a concrete worklist: add these phrases as negatives. A contractor can act on it in a few minutes, and you can check afterward whether the same terms reappear.
Trends in intent become clear
Repeating themes like salary, jobs or free show what the wrong audience is looking for. That shapes your ad copy so it filters out the wrong clicks before they cost anything.
How it works
What happens, step by step
Every week, ClickRuntime pulls the search terms that triggered your Google Ads.
It keeps the ones that spent more than your limit and brought no conversions.
You get an email listing each wasted search term with its cost and campaign, most expensive first.
Before it runs live
- Connect Google Ads
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
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Ads steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, notify
CUSTOMER_ID = "1234567890"
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", [])]
MIN_COST = 20
@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")
waste = sorted(
((r["searchTermView"]["searchTerm"], r["campaign"]["name"], int(r["metrics"].get("costMicros", 0)) / 1e6)
for r in rows if float(r["metrics"].get("conversions", 0)) == 0),
key=lambda t: -t[2])
waste = [w for w in waste if w[2] >= MIN_COST]
if waste:
notify.email_me(f"{len(waste)} search terms spent with no conversions",
"\n".join(f"${cost:,.2f} {term} ({camp})" for term, camp, cost in waste))
return {"terms": len(waste)}FAQ
Common questions
How much spend should count as waste?
Does a zero-conversion term always deserve to be blocked?
Is this the same as the AI negative keyword suggestions?
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
Get last week's results per campaign
Every Monday you see spend, clicks, conversions and cost per conversion for each campaign.
See how it worksCatch campaigns that overspend
You get an email when a campaign spent far more yesterday than it usually does.
See how it worksFind keywords spending with no conversions
Each week you get the keywords that cost money for a month without converting, and can have them paused.
See how it worksKeep exploring
Set up “List search terms that waste budget” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.