Daily
Catch campaigns that overspend
You get an email when a campaign spent far more yesterday than it usually does.
- Runs
- Daily
- Apps
- Google Ads
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every morning, email me any Google Ads campaign whose spend yesterday was more than 50% above its 7-day average.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
On a Thursday afternoon a marketer raises a campaign's bid strategy to chase more leads, and by Friday it has spent $600 against a normal $150. Google Ads allows daily spend to run up to twice the set budget on a given day, so nothing technically broke. The overspend is only noticed on Monday during the weekly review, when the damage is done and the monthly budget is short.
Each day, ClickRuntime queries Google Ads for campaign spend by date over the last eight days. It compares yesterday with the average of the seven days before and sends an alert when a campaign spent far more than usual. If everything is in range, you hear nothing.
It is especially useful for accounts with several people editing campaigns, since any of them can change a bid strategy without telling the others.
What you get out of it
Overspend caught after one day
The alert fires the morning after a spike, so a runaway campaign costs you a single day rather than a whole weekend. For a small advertiser, that is the difference between a bad day and a blown month.
Monthly budgets stay predictable
Finance can plan around a monthly ad budget only if daily swings are noticed. Quick alerts let you pull spend back before the total drifts, which protects cash for the rest of the month.
Bad edits are traced to dates
The alert names the campaign and the day, which you can match against change history. That makes it quick to find which bid or budget change caused the jump and who needs to reverse it.
Silence when things are normal
You only get a message when something is off, so alerts keep their meaning. People pay attention to a rare, specific notice in a way they never do with a daily report.
Protection while you are away
On holiday or at a conference, nobody is watching the account. A spend alert gives a backstop, so a problem can be handled by a colleague with the details already in hand.
How it works
What happens, step by step
Every day, ClickRuntime pulls the last eight days of spend for each Google Ads campaign.
It compares yesterday's spend with that campaign's usual daily spend.
If a campaign spent far more than usual, you get an email naming it, with yesterday's spend next to its daily average. On normal days nothing is sent.
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 collections import defaultdict
from datetime import date, timedelta
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", [])]
@on_trigger
def run(event):
start, end = date.today() - timedelta(days=8), date.today() - timedelta(days=1)
rows = gaql("SELECT campaign.name, segments.date, metrics.cost_micros FROM campaign "
f"WHERE segments.date BETWEEN '{start}' AND '{end}'")
spend = defaultdict(dict)
for r in rows:
spend[r["campaign"]["name"]][r["segments"]["date"]] = int(r["metrics"].get("costMicros", 0)) / 1e6
alerts = []
for name, days in spend.items():
y = days.pop(str(end), 0)
avg = sum(days.values()) / max(len(days), 1)
if avg and y > avg * 1.5:
alerts.append(f"{name}: ${y:,.2f} yesterday vs ${avg:,.2f}/day average")
if alerts:
notify.email_me("Google Ads spend spike", "\n".join(alerts))
return {"alerts": len(alerts)}FAQ
Common questions
How far above normal triggers an alert?
Does it alert on spend that is lower than usual?
Where does the alert show up?
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 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 worksList search terms that waste budget
A weekly email shows the search terms that spent money and brought no conversions.
See how it worksKeep exploring
Set up “Catch campaigns that overspend” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.