Daily
Spot tired ad creatives each morning
Ads that people have seen too often and click less are flagged before they waste more budget.
- Runs
- Daily
- Apps
- Meta Ads
- AI
- Not needed
- Access
- ads_read
Send this to your assistant
Create a ClickRuntime automation: every morning at 7am, check my Meta ads and post to #ads in Slack any ad with a frequency above 3 whose click rate fell more than 15% below its 14-day average.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
An ad that worked beautifully in week one can quietly stop working by week four. The same people see it again and again, frequency climbs from 1.5 to 4, the click rate sags and the cost per result creeps upward. Meta does not warn you, so a media buyer who checks only totals keeps paying for an ad that audiences have learned to ignore, and the budget drains for days before anyone looks at the ad itself.
Each day, ClickRuntime pulls ad-level insights for yesterday and the previous 14 days, compares frequency and click-through rate, and posts the ads that show the fatigue pattern, with frequency up and click rate down, to Slack. Healthy ads are left out of the message.
It is aimed at performance marketers and e-commerce teams that depend on creative testing.
What you get out of it
Wasted spend is cut early
Every day a fatigued ad keeps running costs money for clicks that will not come. A daily flag lets you swap in a fresh creative within a day or two rather than after a full week.
Creative refreshes are planned, not panicked
When you know which ads are wearing out, your designer can prepare replacements ahead of time. That is calmer and cheaper than urgent requests on a Friday evening. The change is calm instead of rushed.
Cost per result stays steadier
Replacing tired ads before performance falls keeps your acquisition cost closer to its earlier level. That makes budgets predictable and profit margins easier to protect. That keeps your profit margin steadier from week to week.
The signal is specific
Frequency alone or click rate alone can mislead. Looking at both against the previous 14 days highlights ads where audiences have clearly seen too much, not just ads having a slow day.
Winning concepts become clear
Seeing how long each creative lasts before it is flagged tells you which angles hold attention. You can brief future ads on that evidence instead of opinion. Over several weeks this becomes a useful creative playbook.
No need to open every ad set
Scanning ad-level numbers by hand takes time. The Slack post only names the ones that need a decision, so you act on three ads instead of searching through fifty. That leaves your attention free for the creative decisions themselves.
How it works
What happens, step by step
Every morning, ClickRuntime pulls yesterday's results for each of your Meta ads alongside the last 14 days.
It flags ads that people are seeing too often and that get noticeably fewer clicks than usual.
The flagged ads are posted to your Slack channel with their frequency and click rate compared with their average, so you know which creative to refresh.
Before it runs live
- Connect Meta 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 Meta Ads steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, notify, http, credentials
ACCOUNT = "act_123456789"
def insights(token, preset):
return {r["ad_id"]: r for r in http.get(f"https://graph.facebook.com/v21.0/{ACCOUNT}/insights", params={
"level": "ad", "date_preset": preset, "fields": "ad_id,ad_name,frequency,ctr,impressions,spend",
"limit": 500, "access_token": token,
}).json()["data"]}
@on_trigger
def run(event):
token = credentials.connection("meta-ads", "main")
yesterday, baseline = insights(token, "yesterday"), insights(token, "last_14d")
flagged = []
for ad_id, y in yesterday.items():
avg_ctr = float(baseline.get(ad_id, {}).get("ctr", 0))
if float(y["frequency"]) > 3 and avg_ctr and float(y["ctr"]) < avg_ctr * 0.85:
flagged.append(f"{y['ad_name']}: frequency {float(y['frequency']):.1f}, CTR {float(y['ctr']):.2f}% vs {avg_ctr:.2f}% avg")
if flagged:
notify.slack("Ads showing fatigue:\n" + "\n".join(flagged), channel="#ads")
return {"flagged": len(flagged)}FAQ
Common questions
How does it decide an ad is fatigued?
Will new ads with little data be flagged?
Does it pause the ads automatically?
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 a weekly Meta Ads campaign report
Every Monday you get a table of last week's spend, clicks, conversions and cost per result for each campaign.
See how it worksGet alerted when ad spend or CPA runs high
If today's spend or cost per purchase passes your limit, Slack hears about it once, not every two hours.
See how it worksGet a plain-English read on this week's ads
A Monday email compares this week with last and explains which campaigns moved and what to look at.
See how it worksKeep exploring
Set up “Spot tired ad creatives each morning” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.