Install
openclaw skills install skills-sh:mbfinotti/advertising-skills/ad-creative-fatigueCreative Fatigue Read a creative's performance-over-time data and decide whether it is genuinely wearing out, how confident that call is, and what to do about it. The core discipline is refusal: many things can cause a declining metric, and creative wear-out is only one of…
openclaw skills install skills-sh:mbfinotti/advertising-skills/ad-creative-fatigueRead a creative's performance-over-time data and decide whether it is genuinely wearing out, how confident that call is, and what to do about it. The core discipline is refusal: many things can cause a declining metric, and creative wear-out is only one of them. Most refresh decisions are made too early, off one metric, against no baseline.
This skill runs a differential diagnosis in a fixed order, confounder screen before the fatigue call, never after:
Two further tensions stay live throughout:
There are no universal thresholds here: every trigger is derived from the creative's own trailing baseline and the account's own history. Named practitioner numbers appear only as attributed starting reference points.
This skill ends at the verdict and the recommended action.
mbfinotti/advertising-skills@ad-copy-variants, mbfinotti/advertising-skills@ugc-ad-scripts, and mbfinotti/advertising-skills@ad-creative-brief.mbfinotti/advertising-skills@ad-creative-test-plan.mbfinotti/advertising-skills@ad-hook-analyzer (here, hook rate is only read as a decay signal on ads already running).mbfinotti/advertising-skills@ad-account-diagnostic.mbfinotti/advertising-skills@retargeting-funnel.mbfinotti/advertising-skills@paid-media-scaling and mbfinotti/advertising-skills@ad-budget-pacing.Ask before diagnosing anything. One question per message; offer multiple-choice answers where possible; skip anything already answered or visible in supplied data.
Run the Interview; collect every answer before touching the data.
Fix the unit of analysis. Analyse at creative and concept level, never at campaign averages: forty rows for forty variants of five concepts hides the real pattern, and one fatigued ad dragging an ad-set average looks like a campaign-wide problem. Where the platform rotates variants automatically (Advantage+-style delivery, dynamic creative), read the asset-level breakdown - automated rotation masks individual asset decay. Conversely, a creative silently losing budget share with no manual change is itself a decay signal.
Build the creative's own baseline. Never compare single days.
Sourced methods to offer as starting defaults, picked per the user's data granularity and overridden by their own history - the two are not ranked against each other, since both cost the same single export and only granularity decides:
Exclude known outages and match the comparison window's day-of-week composition to the baseline's. If your harness can read the export or run the calculation, compute it; otherwise emit the exact export steps and spreadsheet formulas (columns, moving-average ranges, delta formula (current - baseline) / baseline) for the user to run and report back.
Run the confounder screen, before any fatigue talk. Work through references/confounders.md and mark every confounder pass (ruled out) or fail (present):
Any fail that explains the decline ends the fatigue inquiry: the verdict is confounded (or saturating for the audience case) and the fix targets the actual cause. Structure/targeting/tracking root causes hand off to mbfinotti/advertising-skills@ad-account-diagnostic.
Measure decay against the baseline using references/signal-reference.md. Apply the field's consensus decision rule: no single metric confirms fatigue - require at least two signals moving together across two or more consecutive periods (Segwise; AdSights). Weight leading signals (link CTR decay, hook-rate decay on video, falling first-time-impression ratio, silent budget-share loss) over lagging ones. Frequency is a lagging, confirming signal only - Meta's own analytics team notes reported frequency is measured at ad/ad-set level while fatigue happens at creative level, and is a period average, not the marginal effect of the next impression. Do not build the call on frequency.
Apply the Confidence Gate (below). If it fails, the verdict is insufficient data - state what extra spend or days would clear it and stop; refuse to recommend a refresh on noise.
Separate fatigue from saturation before finalising. The discriminating logic:
Where the user can run it, the definitive test is Meta's own:
Their fixes are opposite, new creative versus audience expansion, so the split matters.
Issue the verdict from the Verdict Ladder, then pick the remedy from the Action Ladder - top of its efficiency ordering first, re-ranked against the Interview's deadline, one-off-versus-compounding and effort-ceiling answers - and fill one Fatigue Verdict block per creative (shape below; worked versions in references/examples.md).
Set the re-check date (one full comparison window after any action) and log the decision for the Measuring section's scorecard.
If your harness has persistent memory, memorize the account's baselines, per-creative verdicts, actions taken, and re-check dates, so the next run starts from history instead of re-deriving it.
Deliver one block per creative analysed:
FATIGUE VERDICT - <creative id/name>, <date>
platform : <platform> | funnel stage: <cold prospecting | retargeting>
window : <comparison window> vs baseline <baseline definition>
volume : <spend> spent, <impressions> impressions, <conversions> conversions in window
signals
<signal> : <current> vs <baseline> (<+/-x%>) [leading|lagging]
<signal> : <current> vs <baseline> (<+/-x%>) [leading|lagging]
...
confounder screen
budget/bid change : pass | FAIL - <note>
learning-phase reset : pass | FAIL - <note>
audience saturation : pass | FAIL - <note>
auction CPM inflation : pass | FAIL - <note>
seasonality/window mix : pass | FAIL - <note>
tracking breakage : pass | FAIL - <note>
attribution-window skew : pass | FAIL - <note>
placement/device mix : pass | FAIL - <note>
statistical noise : pass | FAIL - <note>
landing page/offer change: pass | FAIL - <note>
sibling-mix shift : pass | FAIL - <note>
confidence : high | medium | low - <one-line basis: gate math, signal count, window length>
verdict : fatigued | saturating | confounded | insufficient data | healthy | wear-in
action : <chosen action-ladder rung + who produces the asset, if any>
ruled out : <every rung the account's stated constraints delete, each with the constraint that deleted it - or "none">
expected : <what should recover, by roughly how much, based on which evidence>
re-check : <date - one full comparison window after action>
No verdict may be issued below the data floor, and the floor is the user's own math, not a copied constant:
p ± 2 × sqrt(p × (1-p) / n), with n the impressions (or clicks, for CVR) in the comparison window. A "decline" still inside that band is noise, whatever it looks like on a chart.When the gate is not met: report insufficient data, compute the additional days or spend needed (days ≈ what it takes for n to make the noise band narrower than the observed delta at current traffic), and refuse to recommend a refresh. Killing a creative on an underpowered read is the most expensive false positive this skill exists to prevent.
Each verdict maps to its own action - they never all collapse to "make new creative". These verdicts are deliberately not ranked against each other: the evidence picks exactly one, so an efficiency ordering over them would be false precision. The ranking happens one level down, inside the Action Ladder.
| Verdict | Meaning | Action |
|---|---|---|
fatigued | Two-plus signals decayed vs own baseline, confounders ruled out, gate cleared | Action Ladder, highest return per unit of effort first - rung 1 unless the evidence rules it out |
saturating | The audience pool is depleting - falling first-time-impression ratio, flattening reach, CVR degrading with costs | Audience expansion, fresh seed, or exclusions - not new creative; Action Ladder rung 6, promoted to first under this verdict; see mbfinotti/advertising-skills@ad-audience-targeting |
confounded | A non-creative cause explains the decline | Fix the actual cause; hand structural/tracking causes to mbfinotti/advertising-skills@ad-account-diagnostic |
insufficient data | Confidence Gate not met | Report the gap, state days/spend needed, re-check then; no refresh |
healthy | Signals inside the noise band of the creative's own baseline | Leave it alone; note next scheduled review |
wear-in | Performance improving with exposure - plausible for brand objectives (Les Binet); Meta found no wear-in for direct response, so treat a DR "wear-in" read with suspicion | Leave it alone; do not rotate it on a frequency number |
Ranked by return per unit of effort - what each rung buys, against what it costs you to ship it. Not by price: the cheapest rung and the one worth doing first are rarely the same rung, and "buys a week" is not the same purchase as "restores the ad".
Default to rung 1 and take the highest-placed rung the evidence supports. Move one rung down the list when the rung above has already been tried and the decay resumed, or when the signal pattern rules it out - hook, hold rate and CVR decaying together means the whole ad is spent, not its opening.
What the efficiency order starves. New concept is high on value and high on effort, so a ratio buries it at rung 7 every round - and it is the only rung that fixes an exhausted concept, which no hook swap or iteration can touch. Promote it above everything else when iteration stops recovering performance across successive attempts on the same concept: that pattern says the concept is spent rather than its execution, and every cheaper rung above is then buying nothing. Audience expansion has the same value-and-effort shape but is not starved here, because the saturating verdict already promotes it to rung 1 by rule - its failure mode is the reverse, reaching for it under fatigued, where it wastes a good audience.
Every ordering above is a default, not a law: it shifts with the account's context and with who executes it. Re-rank against what you already know about this account, and against the Interview's deadline and mandate answers:
saturating verdict overrides the whole order: audience expansion becomes rung 1 and creative work is wasted effort.The effort ceiling does something different: it deletes rungs from this account's ladder rather than demoting them.
Name each deleted rung and the constraint that deleted it on the verdict's ruled out line, then take the highest-ranked survivor. A rung merely parked at the bottom of the list is still on the list, and comes back later as scope nobody agreed to fund.
mbfinotti/advertising-skills@ad-copy-variants, mbfinotti/advertising-skills@ugc-ad-scripts, or mbfinotti/advertising-skills@ad-creative-brief.mbfinotti/advertising-skills@retargeting-funnel.saturating verdict.saturating it is rung 1.mbfinotti/advertising-skills@ad-creative-test-plan.Pointers only - metric mechanics and platform quirks live in references/signal-reference.md.
The method (own-baseline, confounder screen, two-signal rule, verdict ladder) is identical in both. What differs is data volume, exposure mechanics, and which signals carry the call.
B2B:
saturating verdict more often than fatigued.B2C/ecommerce:
Both: warm/retargeting audiences tolerate far higher exposure than cold. Ben Heath reports Meta results commonly holding at frequency 10+ on warm audiences versus a drop-off he sees around 2.0-2.5 on cold. Always split cold from warm before reading any exposure number.
The skill's own KPI is decision quality, tracked on a rolling log of every verdict:
As a starting floor (this skill's practical target, not a researched constant), iterate until at least 60% of refreshes beat the retired creative and under 20% of retirements were false positives. Tighten both from the account's own history once a dozen decisions are logged.
If refreshes stop recovering performance across several concepts at once, stop refreshing: that pattern is an offer, landing-page, or product problem no new creative will fix.
| Trap | Why it burns | Fix |
|---|---|---|
| Calling fatigue from one metric, one bad day | Noise and weekends mimic decay; retires healthy creatives | Two signals, two-plus periods, vs the creative's own baseline |
| Reading a learning-phase reset as decay | Any significant edit restarts volatile delivery for days | Check last-edit date first; wait a full window post-edit before judging |
| Treating a frequency number as causal | Frequency is lagging, ad-set-level, and an average - a creative at 3.0 can be spent, another at 5.0 healthy | Frequency confirms; link CTR, hook rate, and first-time-impression ratio lead |
| Campaign averages hiding per-creative decay | One fatigued ad drags the average; the rest get refreshed for nothing | Per-creative, per-concept reporting; asset breakdowns under auto-rotation |
| Blaming creative for Q4/auction CPM inflation | CPM up with CTR flat is the auction, not the ad | CPM is diagnostic only when paired with falling CTR |
| Reading CVR collapse with healthy CTR as fatigue | That pattern is landing page, offer, or tracking - no creative will fix it | CTR healthy + CVR down → funnel check before creative check |
| Trailing-window "decay" from attribution lag | Recent days always under-report conversions; every trailing window looks like decline | Compare windows of equal conversion-lag maturity |
| Fixing saturation with new creative | Opposite remedies: fatigue wants creative, saturation wants audience | Run the fatigue-vs-saturation split (step 7) before acting |
| Editing the live ad to "refresh" it | Edits reset learning and destroy the baseline mid-measurement | Launch new ads alongside; pause, never edit, a measured creative |
| Treating Google Ad Strength as a fatigue signal | It scores diversity/completeness, not performance | Use asset performance labels; ignore Ad Strength for this call |
| Hook-swapping a creative with elevated negative feedback | The algorithmic penalty rides the asset ID, not the hook | Ship the iteration as a new asset ID |
| Recommending refresh volume beyond production capacity | An unexecutable plan defaults to letting everything decay | Delete every Action Ladder rung beyond the Interview's effort ceiling, name each on the verdict's ruled out line, then take the highest-ranked survivor |
| Retiring a producer with nothing staged | The ad set goes dark or re-enters learning on a gap | Stage the replacement, ramp it, then retire |
mbfinotti/advertising-skills@ad-copy-variants - to produce replacement assets for a fatigued verdictmbfinotti/advertising-skills@ugc-ad-scripts - to produce replacement assets for a fatigued verdictmbfinotti/advertising-skills@ad-creative-brief - to produce replacement assets for a fatigued verdictmbfinotti/advertising-skills@ad-creative-test-plan - for pre-launch test design on replacement creativesmbfinotti/advertising-skills@ad-account-diagnostic - for structural/tracking root causes when the confounder screen failsmbfinotti/advertising-skills@retargeting-funnel - for frequency-cap architecture design under a fatigued verdict7ede9c641c67