ad-fatigue-detector
Skill0 starsChanged 3 months agoMITView on GitHub
Diagnoses whether an ad is genuinely fatigued, never worked in the first place, is a victim of an account-wide or seasonal shift, or simply hasn't had enough data yet — and says which, with the evidence. Use whenever someone mentions creative fatigue, ad fatigue, frequency, "my ads stopped working", declining CTR or CPM creep, "should I refresh this creative", performance dropping off, or asks why a Meta / TikTok / YouTube / display ad that used to work no longer does. On Google or Microsoft Search, use this only for ad-copy decay on a specific ad — a broader search decline is usually query mix, bids, or Quality Score, so search-term-miner or quality-score-fixer fits better.
In this repository6 other files it gives its agents.
- budget-pacerSkill
- competitor-ad-teardownSkill
- daily-auditorSkill
- negative-keyword-builderSkill
- quality-score-fixerSkill
- search-term-minerSkill
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 30
Run these in order and stop at the first that fits.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Ad Fatigue Detector
"My ads are fatigued" is the most over-diagnosed condition in paid social. Four very different problems produce the same symptom — results got worse — and each needs an opposite response:
| Diagnosis | What actually happened | Right response |
| Too early | Not enough data; normal variance read as a trend | Do nothing. Wait. |
| Never worked | It was weak from day one; there's no decline to explain | Kill it. This isn't fatigue, it's a dud. |
| Account-wide shift | Everything got worse together — auction, season, tracking, landing page | Don't touch the creative. Fix the real cause. |
| Genuine fatigue | This ad worked, then decayed while others held | Refresh the creative. |
Getting this wrong is expensive in both directions: refreshing creative that was fine wastes a production cycle and resets learning, while blaming the auction for a genuinely dead ad burns budget for weeks.
Getting the data
You need time-series data, not totals. A single lifetime row cannot show a trend, and the whole diagnosis is about trend.
- Connected account (Meta / TikTok / Google connector or MCP) — pull daily or weekly rows per ad for at least the last 30 days, ideally 60. Request: date, ad name, spend, impressions, clicks, conversions, and frequency where the platform provides it (Meta and TikTok do; Google Search does not).
- File or paste — an export broken down by day or week. In Meta Ads Manager the breakdown is Reports → Export table data with Day as a breakdown; a lifetime-only export can't be used for this and you should ask for the day breakdown rather than guessing.
- Critically: get the account or campaign totals too, not just the one ad in question. Without a baseline you cannot tell fatigue from a market-wide shift, and that distinction is the entire value of this skill.
- Establish the target. Ask for (or confirm) the target CPA or ROAS before diagnosing. Step 2's "never worked" verdict is meaningless without it — there is no principled line between "never worked" and "worked, then decayed". If they don't know, build one from unit economics and say you've done so.
The diagnostic sequence
Run these in order and stop at the first that fits.
1. Is there enough data? (the impatience check)
An ad needs meaningful volume before any trend is real. Reasonable floors: at least 2 weeks running, 50+ conversions total or 1,000+ clicks, and enough spend to have exited the platform's learning phase (Meta's rule of thumb is ~50 optimization events per week per ad set).
Below those, the honest answer is "there is no signal here yet" — say that plainly. Also flag the specific impatience pattern of judging an ad inside its learning phase, when performance is expected to be unstable and usually improves.
2. Did it ever work? (the dud check)
Compare the ad's first stable week (after learning) against its target. If it never hit target CPA/ROAS, there was never a peak to decay from. This is a creative that didn't land — kill it and move on. Calling it "fatigue" implies a refresh of the same angle will help, and it won't.
3. Did everything decline together? (the baseline check — the one people skip)
Compute the change for the ad and for the account (or at least the campaign) over the same window. Compare:
- Ad CPA up 40%, account CPA up 38% → not fatigue. The auction got more expensive, or a tracking break, seasonality, or a landing page change hit everything. Refreshing creative will not fix it, and you'll conclude the new creative "also fatigued".
- Ad CPA up 40%, account CPA flat → this ad specifically decayed. Continue to step 4.
Also sanity-check CPM separately: if CPM rose sharply while CTR held, that's auction pressure, not creative wear.
4. Does it match the fatigue signature?
Genuine creative fatigue has a recognizable shape. Look for these together, not individually:
- Frequency climbing past roughly 3–4 on a 7-day lookback for prospecting (retargeting tolerates much higher — 6–8 over 7 days is normal, so don't flag retargeting on frequency alone). Read this from the trailing-window pull, never from day rows: daily frequency is almost always near 1.0 and structurally cannot cross the threshold.
- CTR decaying meaningfully — 25%+ measured as the ad's best 7-day window against its most recent 7 days — while the audience stays the same size. Use 7-day windows rather than single days so one bad day can't masquerade as a peak.
- CPA/CPM rising as a consequence, following the CTR decline rather than preceding it.
- Reach saturating — the ad is cycling the same people rather than finding new ones. This needs reach and audience size, which are not in a standard export: pull reach from the platform and ask for the audience definition. If you have neither, say you're judging on frequency and CTR alone.
CTR falling before frequency rises usually isn't fatigue; suspect an audience or placement change instead.
5. Quantify how far along it is
If it is fatigue, say where in the curve it sits and roughly how long is left at current spend, based on the rate of decline. "CTR is down 31% over three weeks and still falling — you have maybe 10 days before it's under target" is far more useful than "fatigued: yes".
What to produce
Lead with the verdict in one sentence, because that's the decision:
FATIGUE DIAGNOSIS — [ad name], [date range]
VERDICT: [Genuine fatigue | Never worked | Account-wide shift | Too early to tell]
Evidence:
CTR [first period] → [recent period] ([%] change)
Frequency [first] → [recent]
CPA [first] → [recent] ([%] change)
Account CPA over the same window: [%] change ← the control
Volume: [conversions] conv / [clicks] clicks over [days] days
WHAT TO DO: [one specific action]Then two or three lines of reasoning, and only if the verdict is genuine fatigue, what to change: which element to vary first (hook/opening 3 seconds usually carries most of the effect on video, primary image on static), and what to hold constant so the test stays readable.
Judgment worth applying
Frequency alone proves nothing. It's the most cited and least reliable fatigue signal. High frequency with stable CTR means the ad is still working on a small audience — that's fine. Only frequency plus CTR decay means wear.
Broad audiences fatigue slower than you think; small ones burn out fast. Always report frequency against audience size, not as an absolute.
Seasonality is often mistaken for fatigue — post-holiday drops in January, summer B2B slumps. If last year's data is available, check whether the same dip happened then.
Refreshing the whole creative is usually overkill. Fatigue is often specific to the hook. Recommend the smallest change likely to work before a full production cycle.
A refresh resets learning. New creative re-enters the learning phase with unstable performance for days. Say so — otherwise the person panics at day 3 of the replacement and the cycle repeats.
Never pause or edit live ads directly, even with write access. Present the diagnosis and the recommended action, and let the person execute or explicitly approve it.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

