Free n8n flow

Creative fatigue monitor

This workflow looks at ads that spent recently, checks whether the click rate fell off that ad's own pace, and sends the ranked list to Slack. It does not pause ads and it does not change budgets. It is free. There is no form on this page. You import it into your own n8n and run it there.

The flow file and setup help are in #freebies on our Discord.

How it works

The schedule node is named Every day at 10:00. The cron in the file is 0 10 * * *, so it fires at 10:00 on the clock of your n8n instance. Change that expression if you want a different hour.

Config sets the bar

The Config node holds the knobs. Defaults in the file:

  • apiVersion is v21.0.
  • window is last_14d. Insights are daily rows across that window.
  • warnPct is 0.3 and watchPctis 0.2. A 30% drop against the ad's own delivering days is the warn line. 20% is watch.
  • minImpr is 200 and minSpendis 20. That 20 is a US dollar floor. The flow scales it to the ad account currency, so an INR account is not judged on a tiny rupee day. The Slack note prints that account's currency. Days under those floors are not used as the baseline, so a dayparted ad is not judged on days it barely ran.
  • minShowDrop is 0.1. The Slack note lists ads whose click rate fell at least that far.

It scans accounts, then scores ads that spent

Fetch + Detect Fatigue uses $env.META_ACCESS_TOKEN. If $env.META_AD_ACCOUNT_IDS is set (comma-separated ids), it scans that list. If it is empty, it walks active ad accounts the token can see. It pages through ad-level daily insights so a long account is not cut at the first 500 rows.

An ad is in scope when its latest day spent at least minSpend. The drop is that latest click rate against the average of earlier days that cleared the impression and spend floors. The node labels rows and ranks the biggest drops.

Slack gets the report

Slack: Fatigue Report posts to $env.SLACK_WEBHOOK_URL. That is an incoming webhook, not a bot token in the file.

What you need

  • Meta. META_ACCESS_TOKEN with ads read access. Optional META_AD_ACCOUNT_IDS if you do not want every active account on the token.
  • Slack. An incoming webhook URL in SLACK_WEBHOOK_URL.
  • Thresholds. Edit Config if 30% warn, 20% watch, or the spend floors are wrong for the account.

This file reads secrets with $env. n8n 2.x blocks that by default. If a node stops with an env access error, use the n8n env access fix.

How to use it

Four steps. The file in #freebies is rup-creative-fatigue-monitor.json.

1

Get the file

Join Discord and open #freebies. The flow file and setup help are there.

2

Import into n8n

In n8n, use Import from File and pick the JSON from #freebies.

3

Connect what it asks for

Set META_ACCESS_TOKEN and SLACK_WEBHOOK_URL. Add account ids if you want a fixed list. Adjust Config if the defaults are too loud.

4

Run it

Run Every day at 10:00 once. Slack should get a ranked note, or a quiet report if nothing fell far enough. Turn the workflow on when the daily cron should keep going.

Questions

Does this pause the ad?

No. It sends a Slack report. Pausing, swapping creative, or moving budget stays with you.

What is it comparing?

Each ad's latest-day click rate against that same ad's average on earlier days in the window that actually delivered. It is not a comparison with a different ad.

Which accounts does it scan?

META_AD_ACCOUNT_IDS if you set it. Otherwise every active ad account the token can list.

A small note

Goat O Mate is a community of builders shipping marketing and AI automations together.

Join Discord