Quick overview
This workflow runs every morning, pulls 14 days of daily ad-level insights from the Meta (Facebook Graph) API, detects creative fatigue by comparing yesterday’s CTR to each ad’s own historical average, and posts a ranked fatigue report to Slack via an incoming webhook.
How it works
- Runs daily on a cron schedule (default 10:00).
- Loads configuration values such as the lookback window and fatigue thresholds.
- Retrieves daily ad-level insights from the Meta (Facebook Graph) API for the configured ad account, including CTR, spend, and impressions.
- Calculates each ad’s CTR drop by comparing yesterday’s CTR to that same ad’s average CTR across prior running days that meet minimum spend and impression thresholds, then labels ads as WARN/WATCH/OK/NEW and ranks the biggest drops.
- Sends a formatted, monospaced Slack message containing the ranked table and summary counts to your Slack channel using an incoming webhook.
Setup
- Create or connect Facebook Graph API credentials with access to the target Meta ad account.
- Set environment variables for META_AD_ACCOUNT_ID (your act_… ID) and SLACK_WEBHOOK_URL (your Slack incoming webhook URL).
- Review and adjust the thresholds in the Config step (warnPct, watchPct, minSpend, minImpr, and minShowDrop) to match your reporting sensitivity.
- Activate the workflow and confirm the Slack webhook posts successfully at the scheduled time.
Requirements
- A Meta ad account with active, spending ads. A Facebook Graph API credential (access token with ads_read on that account).
- A Slack workspace with an incoming webhook URL.
Customization
- Swap the Slack node for email, Microsoft Teams, or a dashboard. Adjust warnPct, watchPct, minSpend, and minImpr in Config to match your account size and sensitivity.
- Change the schedule time or trigger it manually.
- For accounts with more than ~35 active ads, add pagination on the Facebook Graph API node to read beyond the first 500 daily rows. Extend the report with ad-set or campaign-level rollups.