# Meta Ads Account Audit — Powered by GoMarble MCP
## Setup
**Ad Account ID:** act_XXXXXXXXXX
← Replace this with your Meta Ads account ID before running
---
You are a senior performance marketing analyst. Using GoMarble MCP's Meta Ads tools, run a complete 10-point audit on the ad account above. Work through each section in order. Do not skip any section. Present a clean, structured report at the end with findings + action items for each.
---
## PRE-AUDIT SETUP
Before starting the audit, do the following:
1. Call `facebook_get_details_of_ad_account` for the account ID above
2. Note the account currency (all monetary values must use this currency)
3. Note the top spending campaigns and ad sets from account_structure
4. Identify the Primary Conversion Metric (PCM) by reading `promoted_object.custom_event_type` from the top ad sets — NEVER infer this from names
---
## AUDIT SECTION 1: Account Health + Pixel Check
**What to do:**
- Pull account-level spend, impressions, clicks, CTR, CPM, and conversions for last 30 days using `facebook_get_adaccount_insights` at level="account"
- Then pull the same metrics for the previous 30-day period (days 31–60) for comparison
- Pull the pixel list using `facebook_list_pixels` — check `last_fired_time` for each pixel
**Flag and report:**
- Spend spikes or drops greater than 30% week-over-week
- Any pixel where `last_fired_time` is more than 48 hours ago (broken or misfiring pixel)
- CTR or conversion rate drops greater than 20% vs prior period
- Any campaign with zero conversions in the last 14 days despite active spend
**Output:** Account health status (Healthy / At Risk / Critical), pixel status for each pixel, and a summary of any anomalies found
---
## AUDIT SECTION 2: Creative Fatigue
**What to do:**
- Pull ad-level insights with `time_increment=1` (daily) for the last 21 days using `facebook_get_adaccount_insights` at level="ad"
- Fields needed: `ad_name`, `ad_id`, `impressions`, `ctr`, `cpm`, `frequency`, `spend`
- Filter: active ads only (`ad.effective_status = ACTIVE`) and impressions > 0
- Fetch ALL pages before analyzing
**Flag and report:**
- Ads where frequency has crossed 3.0 AND CTR has dropped more than 20% compared to the first 7 days of the window
- Ads where CTR in the last 7 days is less than 50% of their CTR in days 1–7 of the window
- Sort flagged ads by spend (highest first)
**Output:** Fatigue score per ad (High / Medium / Low), current frequency, CTR trend direction, and recommended action (refresh creative / pause / monitor)
---
## AUDIT SECTION 3: Silent Budget Killers
**What to do:**
- Pull ad-level insights for last 30 days using `facebook_get_adaccount_insights` at level="ad"
- Fields needed: `ad_name`, `ad_id`, `adset_name`, `campaign_name`, `spend`, `impressions`, `ctr`, `cpm`, `actions`, `action_values`, `purchase_roas`
- Filter: active ads only, impressions > 0
- Sort by spend descending
- Fetch ALL pages
**Flag and report:**
- Ads with spend in the top 50% of the account BUT zero conversions in the last 30 days
- Ads where spend > 2× the ad set's average CPA target with zero conversions
- Ads where ROAS is less than 0.5 (spending more than double what they return)
- Calculate total wasted spend across all flagged ads
**Output:** Kill list table — ad name, spend, conversions, CPA/ROAS, and recommended action (pause immediately / reduce budget / watch)
---
## AUDIT SECTION 4: Audience Overlap
**What to do:**
- Pull all active ad sets using `facebook_list_adsets` — retrieve targeting details for each
- Group ad sets by the campaign they belong to
- For each campaign, compare targeting across its ad sets:
- Same age range + same geo + same interests/behaviors = high overlap risk
- Same custom audiences included without exclusions between ad sets = overlap confirmed
**Flag and report:**
- Ad set pairs within the same campaign that share identical or near-identical targeting with no exclusion audiences separating them
- Any campaign where zero ad sets have exclusion audiences configured
- Estimate the overlap risk level (High / Medium / Low) per campaign
**Output:** Overlap risk summary per campaign, flagged ad set pairs, and recommended fix (add exclusion audiences / consolidate ad sets / separate into different campaigns)
---
## AUDIT SECTION 5: Learning Phase Trap
**What to do:**
- Pull all active ad sets using `facebook_list_adsets`
- Check the `learning_stage_info` field for each ad set — this contains status and reasons
**Flag and report:**
- Any ad set with status = `LEARNING` — note how long it has been in learning
- Any ad set with status = `LEARNING_LIMITED` — this is the trap. Note the specific reason code:
- `LOW_VOLUME` → not enough conversion events (fewer than 50/week)
- `NOT_ENOUGH_BUDGET` → budget too low relative to bid/CPA
- `AD_APPROVAL_ISSUE` → ads not approved
- `CAMPAIGN_GROUP_BUDGET_OPTIMIZATION` → CBO distributing budget away
- `ADS_ON` → too few active ads
- Any campaign where more than 50% of its ad sets are learning limited
**Output:** Learning phase status table — ad set name, status, reason, days in current status, and specific fix for each reason code
---
## AUDIT SECTION 6: Funnel Spend Ratio
**What to do:**
- Pull campaign-level insights for last 30 days using `facebook_get_adaccount_insights` at level="campaign"
- Fields needed: `campaign_name`, `campaign_id`, `spend`, `impressions`, `ctr`, `cpm`, `actions`, `purchase_roas`
- Separately pull ad set targeting details using `facebook_list_adsets` to classify each ad set as:
- **Cold (TOF):** Broad/interest/lookalike targeting with no custom audience
- **Warm (MOF/BOF):** Custom audiences (website visitors, engagers, video viewers)
- **Hot (Retargeting):** Past purchasers, cart abandoners, existing customers
**Calculate and report:**
- % of total spend going to Cold vs Warm vs Hot audiences
- Healthy benchmark: approximately 60–70% Cold / 20–30% Warm / 10–20% Hot for a scaling account
- Flag if more than 80% of spend is cold (under-investing in retargeting) or more than 50% is hot (over-indexed on a shrinking audience pool)
- Show ROAS or CPL by funnel tier
**Output:** Funnel spend breakdown, tier-by-tier ROAS/CPL, and whether the ratio is Balanced / TOF-Heavy / BOF-Heavy with recommended rebalancing action
---
## AUDIT SECTION 7: New vs Returning Customer Split
**What to do:**
- Pull account-level and campaign-level insights for last 30 days using `facebook_get_adaccount_insights`
- Use `breakdowns=["user_segment_key"]` to segment delivery by Meta's internal customer classification:
- **New Audience** — users with no prior interaction with your brand
- **Engaged Audience** — users who have interacted with your brand but not purchased
- **Existing Customers** — users who have previously purchased
- Fields needed: `campaign_name`, `campaign_id`, `spend`, `impressions`, `clicks`, `ctr`, `cpm`, `actions`, `action_values`, `purchase_roas`
- Filter: active campaigns only (`campaign.effective_status = ACTIVE`) and impressions > 0
- Run first at account level for the overall split, then at campaign level to see which campaigns are skewing toward existing customers
**Flag and report:**
- % of total account spend reaching New vs Engaged vs Existing audiences
- Any campaign where more than 40% of spend is going to Existing Customers — this signals the algorithm is re-converting your existing base rather than acquiring new buyers, inflating reported ROAS while true acquisition is lower than it appears
- Any campaign where Existing Customer ROAS is significantly higher than New Audience ROAS — indicates over-attribution risk (existing customers would likely have repurchased organically)
- Compare CPA/CPL for New Audience vs Existing Customers — if acquisition CPA is dramatically higher, it signals the account is running out of cold audience efficiency
- For Advantage+ Shopping Campaigns (ASC) specifically: flag if Existing Customer spend share exceeds Meta's recommended cap (typically 10–30% of ASC budget, configurable in campaign settings)
**Why this matters:** Meta's default reporting blends new customer acquisition cost with re-purchase cost. If 50% of your "conversions" are existing customers re-buying, your true new customer acquisition CPA is roughly 2× what's reported. Scaling decisions made on blended metrics will over-invest in retention at the expense of growth.
**Output:** Customer split table (spend %, impressions %, ROAS, CPA by segment — New Audience / Engaged Audience / Existing Customers), campaign-level flags for Existing Customer over-indexing, and recommended action:
- If Existing Customer % is high → add existing customer exclusion audiences to prospecting campaigns, or set ASC existing customer budget cap
- If Engaged Audience CPA is high relative to New Audience → review retargeting depth and frequency before increasing MOF spend
- If New Audience CPA is unacceptably high → diagnose creative fatigue or audience exhaustion (cross-reference Sections 2 and 6)
- If data is insufficient for the breakdown → note that `user_segment_key` requires a connected pixel with purchase event history; flag for manual verification in Meta Ads Manager's Breakdown menu
---
## AUDIT SECTION 8: Placement Breakdown
**What to do:**
- Pull account-level insights broken down by placement using `facebook_get_adaccount_insights`
- Use `breakdowns=["publisher_platform", "platform_position"]`
- Fields needed: `spend`, `impressions`, `clicks`, `ctr`, `cpm`, `actions`, `purchase_roas`
- Date range: last 30 days
- Filter: impressions > 0
**Flag and report:**
- Rank all placements by spend
- Calculate CPA or ROAS for each placement
- Flag any placement where:
- Spend > 10% of total account spend AND ROAS is less than 50% of account average ROAS
- CPM is more than 2× the account average CPM with no conversion advantage
- Specifically call out Audience Network performance — this placement frequently underperforms for conversion objectives
**Output:** Placement performance table (spend, CTR, CPM, CPA/ROAS per placement), top 3 placements to consider excluding or deprioritizing, and recommended placement exclusion list
---
## AUDIT SECTION 9: Creative Angle & Format
**What to do:**
- Pull ad-level insights for last 30 days using `facebook_get_adaccount_insights` at level="ad"
- Fields needed: `ad_name`, `ad_id`, `spend`, `impressions`, `ctr`, `cpm`, `cpc`, `actions`, `action_values`, `purchase_roas`, `video_play_actions`, `video_thruplay_watched_actions`
- Filter: active ads, impressions > 0, sort by spend descending
- Fetch ALL pages
**Group and compare:**
- Group ads by format: Video vs Single Image vs Carousel vs Collection
- For each format group: calculate average CTR, CPM, CPA/ROAS, and total spend share
- Within the top-spending ads, use `facebook_analyze_ad_creative_by_id_or_url` on the top 3 ads by spend to analyze creative angle, hook quality, persona, and messaging
**Flag and report:**
- The winning format by ROAS/CPA
- The losing format that is consuming disproportionate spend
- For video ads: calculate Hook Rate (3-sec views / plays × 100) and Hold Rate (ThruPlays / 3-sec views × 100) and flag any video with Hook Rate < 25% or Hold Rate below account average
- Creative angle patterns from the top performers (what message/angle/persona is winning)
**Output:** Format performance comparison, hook/hold rate table for video ads, creative angle summary for top ads, and recommended format + angle to double down on
---
## AUDIT SECTION 10: Attribution Window Audit
**What to do:**
- Pull account-level and campaign-level insights with multiple attribution window comparisons using `facebook_get_adaccount_insights`
- Use `action_attribution_windows=["1d_click", "7d_click", "1d_view"]` to retrieve conversion counts under each window
- Fields needed: `campaign_name`, `campaign_id`, `spend`, `actions`, `action_values`, `purchase_roas`
- Date range: last 30 days
- Do this at both account level (for overall picture) and campaign level (to identify which campaigns are most affected)
**Calculate and report:**
- For each campaign, compare: conversions reported under 7d_click vs 1d_click
- **Attribution Inflation Ratio = 7d_click conversions ÷ 1d_click conversions**
- Ratio > 3× means the campaign is heavily reliant on long-window attribution — the "last 7 days" may include conversions driven by other touchpoints
- Compare view-through conversions (1d_view) vs click-through conversions (1d_click)
- Any campaign where view-through conversions exceed 30% of total reported conversions is likely over-attributed — especially retargeting and Advantage+ Shopping campaigns
- Flag campaigns where reported ROAS looks strong but shifts significantly when moving from 7d_click to 1d_click window
**Why this matters:** Meta's default reporting uses 7-day click + 1-day view attribution. If your ROAS is 4× on paper but drops to 1.8× on 1d_click only, your business decisions are being made on inflated data. This is the single most common reason reported Meta performance doesn't match actual revenue in Shopify or your CRM.
**Output:** Attribution comparison table per campaign (conversions and ROAS under each window), Attribution Inflation Ratio per campaign, view-through % of total conversions, and a "true performance" ranking of campaigns using 1d_click as the conservative baseline — flagging any campaign whose scaling decision should be revisited
---
## FINAL REPORT FORMAT
After completing all 10 sections, compile and present the findings in this structure:
---
### META ADS ACCOUNT AUDIT REPORT
**Account:** [Account ID]
**Currency:** [Account Currency]
**Audit Period:** Last 30 days
**Audit Date:** [Today's date]
---
**OVERALL ACCOUNT HEALTH:** [Healthy / At Risk / Critical]
**TOP 3 IMMEDIATE ACTIONS:**
1. [Most urgent action]
2. [Second most urgent action]
3. [Third most urgent action]
---
Then present each of the 10 sections with:
- **Status:** [Green / Yellow / Red]
- **Key Finding:** 1–2 sentence summary
- **Data:** The specific numbers that support the finding
- **Action Required:** The exact change to make, with entity names
End the report with a **Priority Action List** — all recommended changes ranked by estimated impact, with the specific ad set, campaign, or ad name called out for each.
---
*Audit powered by GoMarble MCP + Claude*