← ToffuCONTENT HISTORY
WHAT CHANGED
Update to Toffu
Snapshot Oct 29, 2026 · 19:06 UTC · version 1.3.0
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Toffu and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Find tired Meta ads with Toffu, from frequency, CTR decline and CPA drift. Use when the user asks which ads to refresh, kill or keep, why Meta performance is dropping, or wants a creative fatigue audit.",
"included_files": [],
"name": "meta-ads-creative-fatigue",
"skill_md_contents": "---\nname: meta-ads-creative-fatigue\ndescription: Find tired Meta ads with Toffu, from frequency, CTR decline and CPA drift. Use when the user asks which ads to refresh, kill or keep, why Meta performance is dropping, or wants a creative fatigue audit.\n---\n\nUse the Toffu tools. Never apply a change the user has not confirmed.\n\n1. Call `get_account_context`. If a platform has several accounts, ask which one. Pass the ids as `account_ids` to `query_campaign_performance`, and as `account_id` to the other tools.\n2. Read data with `query_campaign_performance` (daily rows: `time_increment` \"1\"), `list_campaigns`, `list_ad_sets` and `list_ads`.\n3. To change something, call `propose_update_campaign`, `propose_update_ad_set` or `propose_update_ad`, and show the preview. Call `apply_change` only after the user confirms that change.\n\nPull ad rows with `query_campaign_performance` `level` \"ad\" and `platforms` [\"meta_ads\"], once for the last 7 days and once for the last 30. CTR = clicks / impressions; CPA = spend / conversions. Read each ad's status from `list_ads`.\n\n# Meta Ads Creative Fatigue Detection\n\nUse when the user asks \"which ads are tired\", \"what should we refresh\", \"why is performance dropping\", \"creative fatigue audit\", or wants a kill/keep/refresh recommendation per ad.\n\n## Signal stack (all three must be checked, not just frequency)\n\n1. **Frequency**: lifetime impressions per unique reached user. Pull `frequency` from the ad-level insights. Flag at >= 3.0 for prospecting, >= 5.0 for retargeting.\n2. **CTR decay**: compare last-7-day CTR to trailing-30-day CTR. Decay >= 25% is a fatigue signal even when frequency is fine.\n3. **CPA drift**: last-7-day CPA vs trailing-30-day CPA. Drift >= 30% upward, with conversions > 0 in both windows, confirms fatigue. Drift on a base of 0 conversions is noise.\n\nA single signal is suggestive. Two signals = confirmed fatigue. Three = act today.\n\n## Procedure\n\n1. Pull ad-level insights for the date range with fields: `ad_id`, `ad_name`, `impressions`, `reach`, `frequency`, `clicks`, `ctr`, `spend`, `actions`, `cost_per_action_type`. Group by ad.\n2. Compute the three signals per ad. Use date_preset=last_7d and last_30d in two calls.\n3. Cross-reference with `effective_status` — exclude PAUSED/ARCHIVED ads from the \"act today\" list.\n4. Output one row per ad with: name, lifetime spend, last-7d CTR, 30d CTR, % CTR change, last-7d CPA, 30d CPA, % CPA change, frequency, signal count (0-3), recommendation.\n\n## Recommendations vocabulary\n\n- **Keep**: 0 signals, performance flat or improving.\n- **Watch**: 1 signal, frequency under threshold. Re-audit in 7 days.\n- **Refresh creative**: 2 signals. Same offer/audience, new hook/visual. Don't pause yet — duplicate first.\n- **Kill**: 3 signals OR spend > 2x target CPA in last 7 days with no conversions. Pause and reallocate budget.\n\n## Pitfalls\n\n- Don't act on frequency alone for retargeting. High frequency on a tight retargeting pool is expected.\n- Don't compare CTR across placements. Reels CTR is structurally lower than Feed; use placement-stratified breakdowns when the ad is mixed-placement.\n- Don't kill an ad with high frequency and stable CTR/CPA. Saturation, not fatigue, is the diagnosis. Expand audience instead.\n- Always present the data as a sortable table, sorted by signal count descending then spend descending.\n"
}SHA-256 of public snapshot: 38e36057200bb84f16120509e0229b7fe1da3e90ad71a4a1bb39ec450f63424e