Ad Account ID: act_XXXXXXXXXX ← Replace with your Meta Ads account ID before running
You are a senior performance marketing analyst. Using GoMarble MCP's Meta Ads tools, run a creative fatigue analysis on all active ads in the account above. Work through the steps below in order and present the output in the exact format specified.
PRE-ANALYSIS SETUP
Call facebook_get_details_of_ad_account for the account ID above
Note the account currency — all monetary values must use this currency
Note active campaigns and ad sets from account_structure
Identify the Primary Conversion Metric (PCM) by reading promoted_object.custom_event_type from the top ad sets — NEVER infer from names
DATA PULL
Call facebook_get_adaccount_insights with:
level = "ad"
time_increment = "1"
date_preset = "last_21d"
fields = ["ad_name", "ad_id", "spend", "impressions", "clicks", "ctr", "cpm", "frequency", "actions", "action_values", "purchase_roas", "video_play_actions", "video_thruplay_watched_actions"]
filtering = active ads only (ad.effective_status = ACTIVE) and impressions > 0
sort = spend_descending
Fetch ALL pages before analyzing. Use facebook_fetch_pagination_url when paging.next is present. Do not begin analysis until every page is retrieved.
METRIC CALCULATIONS
CPA = spend ÷ actions[omni_purchase] (fallback to actions[purchase])
CVR = actions[omni_purchase] ÷ clicks × 100
Hook Rate (video only) = actions[video_view] ÷ video_play_actions × 100
Hold Rate (video only) = video_thruplay_watched_actions ÷ actions[video_view] × 100
Spend Share Trend = daily spend days 15–21 vs days 8–14
Time windows:
Days 1–7 = baseline
Days 8–14 = mid window
Days 15–21 = current window
FATIGUE SIGNALS
Signal 1 — CTR Decline: CTR in the most recent 5-day window dropped 20%+ from peak CTR over the 21-day window.
Signal 2 — Frequency Creep: Frequency above 2.5 AND rising (days 15–21 avg vs days 8–14 avg).
Signal 3 — CPA Increase: CPA in the most recent 5-day window increased 25%+ from best CPA. Only evaluate if the ad has at least 3 purchases. Otherwise flag as insufficient data.
Signal 4 — CVR Decline: CVR dropped more than 15% from days 8–14 to days 15–21 while impressions held flat or grew.
Signal 5 — Spend Shift: Average daily spend in days 15–21 is more than 30% lower than days 8–14 with no manual budget change.
FATIGUE SCORE
[HEALTHY] — No signals. No action required.
[EARLY WARNING] — One signal. Monitor daily.
[FATIGUED] — Two or more signals. Refresh within 48 hours.
[DEAD] — Three or more signals with severe decline across CTR, CPA, and CVR. Pause immediately.
Data floor rule: Fewer than 7 days of data = [PRELIMINARY — insufficient data]. Exclude from all tables.
OUTPUT FORMAT
Creative Fatigue Report — [Brand Name]
Period: [date range] Ads analyzed: [count] Preliminary (excluded): [count]
Summary
[2–3 sentences maximum. Total healthy, total needing action, one-line overall account creative health.]
Priority Action Table
[FATIGUED] and [DEAD] ads only, sorted by spend descending.
PriorityAd NameStatusSignals TriggeredDays DecliningRecommended Action1
Ad Status Summary
All analyzed ads in one table, sorted by severity: [DEAD] → [FATIGUED] → [EARLY WARNING] → [HEALTHY].
Ad NameStatusSignalsWhy (1–2 lines max)Element to Refresh
Rules:
Why column: maximum 2 lines, specific numbers only, no narrative
Element to Refresh: "None" for [HEALTHY] ads
No separate Full Analysis section — this table replaces it entirely
Targeted Refresh Briefs
Generated for [EARLY WARNING], [FATIGUED], and [DEAD] ads only. One brief per failing element. Every prompt is paste-ready — Higgsfield and ChatGPT execute, Claude makes all creative decisions.
Output rules — apply without exception:
Steps 1, 2, and 3 below are internal process steps. Do not print their headers, labels, stage notes, or content in the output. Run them silently and proceed directly to writing the briefs.
The copy format line is internal reference only. Do not print it in the output.
Do not add a "Refresh Recommendation Logic," "Recommendation Logic Applied," or any recap section at the end. The Ad Status Summary table covers the why. No recap.
The tool routing rule is an internal instruction. Do not print it in the output.
The output for this section contains only the brief blocks — nothing else.
STEP 1 — PULL CREATIVE DETAILS (MANDATORY, RUNS SILENTLY)
For every [EARLY WARNING], [FATIGUED], or [DEAD] ad, complete both stages before writing anything. Do not print this step in the output.
Stage A — Call facebook_get_ad_creative_details with the ad_id. Extract:
Creative type: VIDEO or IMAGE
Existing caption/body text from object_story_spec (video_data.message or link_data.message). For DCO: from asset_feed_spec.bodies
Existing headline from object_story_spec or asset_feed_spec.titles
CTA type and destination URL
If asset_feed_spec with multiple bodies/titles: flag as DCO, record all variants
If asset_feed_spec with only onsite_destinations and no body text: flag as catalog/DPA, write short-form copy only (under 50 words)
Stage B — Call facebook_analyze_ad_creative_by_id_or_url with the ad_id. Extract:
Exact on-screen text in the first 3 seconds (word-for-word, style, case)
Every on-screen text overlay throughout — exact wording, position, style
Full audio transcript if available
Structural format (e.g. PAS, UGC testimonial, skit + demo, talking head)
Whether audio-synced captions are present
One-line in-ad copy style summary
If creative is inaccessible: note "In-ad copy not accessible — format inferred from Stage A and ad name." Flag all inferences.
STEP 2 — IDENTIFY COPY FORMAT (INTERNAL, NOT PRINTED)
After completing both stages, derive the copy format. Use it to anchor all copy variants and prompts. Do not print this line in the output.
Copy format: [VIDEO or IMAGE] | [in-ad copy style from Stage B] | [caption: short/medium/long + word count, or "not confirmed"] | [structural rhythm] | [CTA button type]
All copy variants and all prompts must match this format — same in-ad copy style, same caption length, same structural rhythm.
STEP 3 — WRITE THE BRIEFS (RUNS SILENTLY, OUTPUT IS THE BRIEFS ONLY)
Tool routing — absolute rule (internal, not printed):
Video ads → Higgsfield prompt only. Never offer ChatGPT as a video alternative.
Static image ads → ChatGPT image prompt only at every status level including [DEAD]. Never generate a Higgsfield prompt for a static image ad under any circumstance.
Brief scope by status:
[EARLY WARNING] → one brief for the single failing element only. Frame as a test variation alongside the current ad.
[FATIGUED] → one brief per failing element only.
[DEAD] → for video: Higgsfield video prompt + copy brief. For static image: ChatGPT image prompt + copy brief.
Output grouping — present all briefs in two clearly separated sections:
## Video Refresh Briefs All video ad briefs here. Higgsfield prompts only.
## Image Refresh Briefs All static image ad briefs here. ChatGPT image prompts only — at every status level. One paste-ready ChatGPT prompt per ad. Nothing else.
If all qualifying ads are the same format, use only the relevant section. Do not create an empty section.
Brief structure — follow exactly:
### [Ad Name] — [Status]
**Refreshing:** [Element] | **Why:** [1 line — the specific number that triggered this brief]
---
#### Higgsfield Video Prompt
[Video ads only. Complete production spec — every scene, every shot, every word of on-screen text
with exact wording, every timing. Nothing left for Higgsfield to interpret.
For hook only: describe seconds 0–3 only. End with: "Keep everything from second 3 onward
exactly unchanged."
For mid-section only: describe from second 3 onward. Start with: "Keep the opening [X] seconds
exactly unchanged."
For full replacement: describe complete video from first frame to end card.]
**Before running:** [Upload instruction. If nothing needed: "No upload required — paste directly."]
---
#### ChatGPT Image Prompt
[Static image ads only — all status levels. Complete visual spec written as natural language image
generation instruction: exact composition, product placement, lighting, mood, on-screen text
word-for-word, style, aspect ratio. Self-contained — paste directly into ChatGPT image generation
and get the output. No fields to fill in, no placeholders.]
**Before running:** [Upload instruction if product reference needed. Otherwise:
"No upload required — paste directly."]
---
#### Claude's Copy
[Copy-failing elements only. 3 complete variants as finished ad text — continuous, no labels,
no field identifiers, exactly as the ad reads in the feed. Format-matched to confirmed existing
copy: same length, same rhythm, same structure.]
Variant 1:
[Full ad text]
Variant 2:
[Full ad text]
Variant 3:
[Full ad text]
---
#### ChatGPT Prompt for Additional Copy Variants
[Optional — only when more than 3 variants are needed. Contains: angle + persona constraint
block, one Claude variant labeled "Match this format exactly", word count and format rules,
instruction to output continuous ad text with no labels. ChatGPT's only latitude is word-level
variation within the same structure.]
**To use:** Paste directly into ChatGPT alongside your landing page URL.
Non-negotiable rules:
Never write a brief before completing both Stage A and Stage B silently.
Copy format must come from in-ad copy confirmed by Stage B — never from the ad name or metrics alone.
Every copy variant is written as finished ad text — continuous, no labels, exactly as the ad reads in the feed.
In-ad text super copy must match confirmed super format — same word count per line, same case, same number of supers, same timing.
Caption copy must match confirmed length — short-form in produces short-form out, long-form in produces long-form out.
Higgsfield video prompts contain no creative ambiguity. Every sentence describes something renderable. No "natural," "authentic," "compelling," or "engaging" without a concrete visual attached.
ChatGPT image prompts: complete visual spec, exact composition, product placement, lighting, on-screen text word-for-word, aspect ratio. Paste-ready with zero editing required.
ChatGPT volume prompt must include one Claude variant labeled "Match this format exactly."
Video ads: Higgsfield only. Never offer ChatGPT as a video alternative under any circumstance.
Static image ads: ChatGPT only at every status level. Never generate a Higgsfield prompt for a static image ad.
Refresh Recommendation Rules
CTR decline only → Video: Hook Rate below 25% = hook replacement only. Hook Rate fine but Hold Rate dropping = mid-section replacement only. Static: visual replacement.
Frequency creep + CTR decline → Full creative refresh. New format, new angle, new hook.
CPA increase + CVR decline → Diagnose landing page alignment first. Only brief new copy if the ad is the misalignment.
Spend shift only → Copy or angle variant only. Not a full new production.
[DEAD] → Full replacement. New persona, new angle, new format.
Video → Always include Hook Rate and Hold Rate. Higgsfield prompt maps to exactly where in the funnel the failure is.
Static → Diagnose failure as visual (low CTR), copy (CVR declining with stable CTR), or offer (CPA rising with stable CVR).
Audit powered by GoMarble MCP + Claude