Skip to content

Daily

Spot tired ads and wasted ad spend

Each morning you see which Meta ads are wearing out and which placements cost far more than your average.

Runs
Daily
Apps
Facebook Pages
AI
Yes, uses the built-in AI allowance
Access
ads_read

Send this to your assistant

Create a ClickRuntime automation: every morning at 7am, look at the last 14 days of my Meta ad results, flag ads where click-through is dropping while frequency climbs, list placements costing over 50% above my average, and email me the list ranked by wasted spend.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

Meta ad accounts quietly leak money. An ad that worked at first shows to the same people again and again until frequency climbs and click-through falls, a placement spends budget with no conversions, and a campaign keeps running because nobody looked at ad-level numbers. Ads Manager has the data, but reading breakdowns ad by ad is slow, so many advertisers only check totals. The result is a rising cost per result that no one can explain.

Each morning, ClickRuntime fetches ad-level daily insights and breakdowns, compares each ad with account benchmarks, flags fatigue signals such as rising frequency and falling click-through, and finds spend with no results. Optionally its built-in AI adds a short plain-language commentary, then everything is emailed to you.

It helps freelancers and in-house marketers who manage several campaigns and cannot study every ad each day.

What you get out of it

  • Stop paying for tired ads

    When frequency rises while click-through falls, the audience is bored. Seeing that on the morning report lets you swap the creative before another week of budget produces fewer clicks. Refreshing creative early keeps costs per result steadier.

  • Find wasted spend by placement

    Breakdowns reveal that one placement or age group spends heavily without conversions. Cutting it redirects money to what works, which lifts results without raising the total budget. Small shifts in placement can change the whole month's return.

  • Compare ads against account benchmarks

    An ad's numbers mean little alone. Measuring each against account averages tells you which are truly under- or over-performing, so you make decisions based on the context of your own account.

  • Review in minutes, not an hour

    One email replaces opening Ads Manager, applying breakdowns and exporting. Optional commentary turns the numbers into two or three sentences saying what to look at first. That makes daily monitoring realistic alongside other work.

  • Back budget requests with evidence

    When a client asks why you changed creative, the dated reports show the fatigue signs. That record supports your decisions and shows the value of active optimization. Clients value that kind of paper trail.

How it works

What happens, step by step

  1. Every morning ClickRuntime pulls the last 14 days of results for your Meta ads.

  2. It spots tired ads, where people are seeing them more often but clicking much less than they did at the start.

  3. It also finds placements where each click costs more than 1.5 times your average.

  4. You get an email ranking those ads and placements by how much they cost you, with a short note on what to pause first.

Before it runs live

  • Connect Facebook Pages

What you get

RunsDaily
Spot tired ads and wasted ad spendtoday, 9:00Succeeded
Email · Meta ads: waste and fatiguePause 'Fall promo v2' first; frequency is 4.1 and CTR halved. $412 Fall promo v2 $188 audience_network/rewarded_video

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • 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 Slack
  • Combine it with other Facebook Pages steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
meta_ads_waste_and_fatigue_report.pyexample
from collections import defaultdict
from clickruntime import on_trigger, credentials, http, ai, notify

G = "https://graph.facebook.com/v21.0"
AD_ACCOUNT = "act_1234567890"

@on_trigger
def run(event):
    token = credentials.connection("facebook", "work")
    base = {"access_token": token, "date_preset": "last_14d", "level": "ad", "limit": 500}
    daily = http.get(f"{G}/{AD_ACCOUNT}/insights", params={**base, "time_increment": 1,
                     "fields": "ad_name,ctr,frequency,spend"}).json()["data"]
    by_ad = defaultdict(list)
    for d in sorted(daily, key=lambda d: d["date_start"]):
        by_ad[d["ad_name"]].append(d)
    fatigued = [(name, sum(float(x["spend"]) for x in rows)) for name, rows in by_ad.items() if len(rows) >= 6
                and float(rows[-1]["ctr"]) < 0.8 * float(rows[0]["ctr"]) and float(rows[-1]["frequency"]) > float(rows[0]["frequency"])]
    places = http.get(f"{G}/{AD_ACCOUNT}/insights", params={**base, "level": "account",
                      "breakdowns": "publisher_platform,platform_position", "fields": "spend,clicks"}).json()["data"]
    avg = sum(float(p["spend"]) for p in places) / max(sum(int(p["clicks"]) for p in places), 1)
    costly = [(f"{p['publisher_platform']}/{p['platform_position']}", float(p["spend"]) - int(p["clicks"]) * avg)
              for p in places if int(p["clicks"]) and float(p["spend"]) / int(p["clicks"]) > 1.5 * avg]
    ranked = sorted(fatigued + costly, key=lambda x: -x[1])
    report = "\n".join(f"${waste:,.0f}  {name}" for name, waste in ranked) or "Nothing flagged."
    note = ai.generate(f"In two sentences, what should I change first?\n{report}", max_output_tokens=120).text
    notify.email_me("Meta ads: waste and fatigue", f"{note}\n\n{report}")
    return {"flagged": len(ranked)}

FAQ

Common questions

How does it decide an ad is fatigued?
It looks at trends in frequency and click-through rate over recent days. An ad whose frequency keeps rising while engagement drops gets flagged. The thresholds are adjustable, so a small audience can use stricter limits. Frequency alone is not treated as proof.
Do I need the AI commentary?
No. The commentary is optional. Without it the email contains the tables and flagged ads only. With it, a short note summarizes the biggest issues, written by ClickRuntime's built-in AI, so no separate AI key is needed.
Does it change or pause my ads?
No. It only reads insights and emails a report. Pausing or editing ads stays in your hands, though you can ask for a different version that pauses ads automatically once they exceed a cost limit you set.
What permissions does it need?
ads_read. Nothing else in your accounts is used.
Does it need AI?
Yes. It uses ClickRuntime's built-in AI, so you don't need an OpenAI or Anthropic key. Every plan includes a monthly AI allowance.
How many runs does it use?
One run each time it runs (daily). Checks that find nothing to do and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Spot tired ads and wasted ad spend” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.