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.
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
Every hour, ClickRuntime checks your Meta ad account for ads that were rejected or are running with issues.
Ads it has already told you about are skipped.
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
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
- 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
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?
Does it alert when I fix and the ad is later rejected again?
Do I need special access in Meta to read ad status?
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 worksSpot tired ad creatives each morning
Ads that people have seen too often and click less are flagged before they waste more budget.
See how it worksKeep exploring
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.