Skip to content

Hourly

Hear about rejected Meta ads within the hour

When Meta disapproves an ad or flags an issue, you get its name and the reason in Slack.

Runs
Hourly
Apps
Meta Ads
AI
Not needed
Access
ads_read

Send this to your assistant

Create a ClickRuntime automation: every hour, check my Meta ad account for ads that are disapproved or have issues and post each new one to #ads in Slack with the ad name and the reason Meta gives.

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

When Meta rejects an ad, the ad simply stops delivering. A store running a weekend sale launches its best creative on Friday, Meta flags it for a policy issue on Friday night, and nobody notices until Monday, when the campaign has spent nothing for two days. Limited ads are even harder to spot, since they keep running with reduced reach and no obvious sign that something is wrong.

Every hour, ClickRuntime lists ads whose effective status is disapproved or with issues, skips the ones it has already reported, and posts the ad name and Meta's issue reason to Slack. The same ad is not announced twice, so the channel shows only new problems.

It is especially useful for teams that launch time-sensitive promotions, and for agencies that manage many accounts at once.

What you get out of it

  • Sales are not lost to silent rejections

    An ad that is disapproved during a limited-time sale loses its entire window if nobody notices. Hourly checks mean you can appeal or replace it while the promotion is still running.

  • The reason is in the message

    Seeing Meta's stated issue, such as a text-in-image or a restricted-content flag, lets you decide whether to edit the creative or appeal. You do not need to open Ads Manager to find out what went wrong.

  • Limited ads are caught too

    An ad with issues may still deliver but reach fewer people. Alerting on that status gives you the chance to fix problems before they quietly reduce the results of an entire campaign.

  • Account health is protected

    Repeated policy problems can put an ad account at risk. Seeing each rejection promptly helps your team learn what triggers them and avoid patterns that could lead to restrictions. That keeps the whole account in better standing.

  • Agencies stay ahead of clients

    If you manage ten accounts, you cannot check each one hourly. Alerts let you tell a client that an ad was rejected and already replaced, instead of being asked why spend dropped.

  • No repeat noise

    Remembering the IDs of ads already reported prevents the same rejection from filling the channel every hour. The people watching see each problem once and can respond to it. That is easier on everyone who watches the channel.

How it works

What happens, step by step

  1. Every hour, ClickRuntime checks your Meta ad account for ads that were rejected or are running with issues.

  2. Ads it has already told you about are skipped.

  3. Each new one is posted to your Slack channel with the ad name and Meta's reason, so you can fix it quickly.

Before it runs live

  • Connect Meta Ads

What you get

RunsHourly
Hear about rejected Meta ads within the hourtoday, 9:00Succeeded
Slack · #adsDisapproved: Autumn sale - carousel 3 Ads may not make claims about personal health outcomes.

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

  • Act only on the items that match your own rules, and skip the rest
  • 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

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.
disapproved_or_limited_ads_alert.pyexample
from clickruntime import on_trigger, report_fetched, state, notify, http, credentials

ACCOUNT = "act_123456789"

@on_trigger
def run(event):
    token = credentials.connection("meta-ads", "main")
    ads = http.get(f"https://graph.facebook.com/v21.0/{ACCOUNT}/ads", params={
        "fields": "name,effective_status,issues_info,ad_review_feedback",
        "effective_status": '["DISAPPROVED","WITH_ISSUES"]', "limit": 200, "access_token": token,
    }).json()["data"]
    alerted = set(state.get("alerted") or [])
    new = [a for a in ads if a["id"] not in alerted]
    report_fetched(len(new))
    if not new:
        return {"summary": "No new problem ads"}
    for ad in new:
        feedback = ad.get("ad_review_feedback", {}).get("global", {})
        reason = "; ".join(feedback.values()) or "; ".join(i.get("error_message", "") for i in ad.get("issues_info", []))
        notify.slack(f"{ad['effective_status'].replace('_', ' ').title()}: {ad['name']}\n{reason}", channel="#ads")
        alerted.add(ad["id"])
    state.set("alerted", list(alerted))
    return {"posted": len(new)}

FAQ

Common questions

What is the difference between disapproved and with issues?
A disapproved ad has been rejected and does not run. An ad with issues may still run but has a problem Meta wants you to fix, such as a restriction on delivery. The alert covers both, and the message shows which one applies.
Does it alert when I fix and the ad is later rejected again?
Each ad is remembered after it is reported. If the same ad is fixed and then flagged again, you can have it reported again once it returns to a healthy status, so that new problems are not hidden.
Do I need special access in Meta to read ad status?
You need to connect with a Meta user or system user token that has access to the ad account. Reading ad status is part of standard reporting access, and ClickRuntime treats the token as a secret.
What permissions does it need?
ads_read. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it checks. Checks that find nothing new 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 “Hear about rejected Meta ads within the hour” from your assistant

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