The day-one agency read of a Meta account, run by your own agent against live data. Connect Meta's ads MCP, hand it the audit skill, get the three fixes worth the most money. Read only. It never touches a budget.
One clinic had an ad producing leads under ten dollars sitting on a tiny budget while a burned out angle quietly spent over twelve hundred at three times the cost. Nobody had looked in six weeks. That is not bad luck. That is an account nobody is reading.
My agency reads every account the same way on day one of a takeover. Signal first, then the leak, then the winner being starved, then the things nobody launched. Every finding carries its number and everything is ranked by dollars.
Here is what changed this year. You do not need me to run it. Your own agent can read the account directly through an MCP, Meta's own or a self hosted one, and run the same audit against live numbers. Never from screenshots. Never from memory. An invented number is worse than no audit.
This guide is three things. How to connect the account, in whichever world you live in. The audit itself, as a skill you paste. And the rule that makes it safe: the agent reports, the human acts. It never pauses, edits, or spends.
You open Ads Manager on a Sunday, sort by cost per result, feel bad, close it.
Your agent is connected to the account read only. You say "audit my ad account" and get a score, three fixes ranked by dollars, the kill list and the one winner to feed.
The audit runs every Monday on a cadence, tracks the score, the waste recovered and the winner scaled, and posts to one channel. Same read only rule, forever.
Look at the dashboard and hope something jumps out.
Connect the account read only. Run the same fifteen checks every week. Rank by dollars. The agent reports, you act.
| Role | Talks to you | Job |
|---|---|---|
| Signal | First | Pixel plus Conversions API, deduplicated, platform count vs CRM count |
| The leak | Second | Kill list, cost outliers, zombie ad sets, spend caps |
| The starved winner | Third | Beating the average on a small budget, frequency under 2 |
| Things nobody launched | Always | Anything created in the last 30 days you do not recognize |
Three ways in, all read only if you set them up that way. Meta's official MCP as a remote connector is the cleanest: permissions live in Business Suite and you can revoke them there. A self hosted MCP gives you the same thing on your own machine with a system user token. The raw Graph API is for anyone whose agent only speaks curl. The block below has the exact steps for each.
In Business Settings, create a system user with Analyst access to the ad account, not Advertiser. Generate its token with ads_read only. That token cannot pause, edit or spend even if the agent tries. Store it in an environment variable. A token pasted into a chat is a token you rotate.
Before the first audit, answer one question: what is a new customer worth to you. Every verdict in the report is ranked against that number. Without it the agent will grade on platform benchmarks, which are not yours.
Paste the skill, say the trigger. It decides sales or leads mode, checks the pixel and the Conversions API, pulls the last seven days and the seven before at account, ad set and ad level, and runs the fifteen checks. It opens the landing pages of the top three spenders. Then the report: a score, three fixes ranked by dollars, the one winner to feed, the kill list, the signal verdict.
The platform's lead count and your CRM's lead count for the same window, side by side. If Meta claims twice what the business saw, that gap is the first finding, and every other number is less trustworthy until it is fixed.
You make the changes, in Ads Manager, by hand. That is the point of read only. Then run it again next Monday and watch the score.
Each phase has a done-when. If you have not hit it, do not start the next one. Every failure I have seen came from skipping ahead.
Paste these as written. They are short on purpose, because the long ones drift.
You are auditing my Meta ad account read only, through the connected ads tool. Never pause, edit or spend. A new customer is worth $[X] to me. First decide sales mode or leads mode from the last 30 days. Then check the signal: pixel and Conversions API present, deduplicated, and compare the platform's lead count to my CRM's [N] for the same window. Pull the last 7 days and the 7 before at account, ad set and ad level. Run these checks with the number behind each: scaling into weakness, primary metric vs last week (flag 15 percent worse, critical 30), CPM vs CTR split, frequency over 2.5, fatigue signature, creative age over 3 weeks, look alike portfolio, kill list (real spend zero results 7 days, sum it), cost outliers over 2x account average, zombie ad sets, spend caps near 95 percent, throttled winners, room to run under frequency 2, anything created in the last 30 days I did not launch. Open the landing pages of the top 3 spenders. Report: score out of 100 with one sentence, three fixes ranked by dollars with the exact place to click, the one winner to feed, the kill list with summed waste, signal verdict. If any pull fails, say so inside that finding. Do not invent a number.
Walk me through connecting my Meta ad account to you read only: create a system user with Analyst access, a token with ads_read only, and the connector or environment variable you need. Stop and confirm each step before the next.
Run the ad account audit again for the last 7 days, compare the score to last week's [score], report waste recovered since the kill list was applied, and whether the winner we fed is still under frequency 2.
Same skill, three worlds. Pick the one you actually use. The skill file at the bottom of this page is the instructions in every case.
Meta publishes its own ads MCP. Add it as a remote connector and the agent reads the account with the permissions you grant in Business Suite. Pipeboard runs a hosted alternative at the second URL.
claude mcp add --transport http meta-ads https://mcp.facebook.com/ads # alternative hosted server claude mcp add --transport http meta-ads-pipeboard https://meta-ads.mcp.pipeboard.co/
ChatGPT has no first party Meta connector, so there are two honest routes. Layer 1 is an export. Layer 2 is an Action against the Graph API.
openapi: 3.1.0
info: {title: Meta Insights, version: '1'}
servers: [{url: https://graph.facebook.com/v23.0}]
paths:
/act_{account_id}/insights:
get:
operationId: getInsights
parameters:
- {name: account_id, in: path, required: true, schema: {type: string}}
- {name: level, in: query, schema: {type: string, enum: [account, campaign, adset, ad]}}
- {name: date_preset, in: query, schema: {type: string}}
- {name: fields, in: query, schema: {type: string}}If your agent only speaks HTTP, the Graph API is the whole thing. One call per window and level. Token in an environment variable, never in the prompt.
export META_ACCESS_TOKEN=... # ads_read only, from a system user
export META_AD_ACCOUNT_ID=1234567890
F='spend,impressions,cpm,ctr,frequency,actions,cost_per_action_type,ad_name,adset_name,campaign_name'
curl -s "https://graph.facebook.com/v23.0/act_$META_AD_ACCOUNT_ID/insights?level=ad&date_preset=last_7d&fields=$F&access_token=$META_ACCESS_TOKEN" > this_week.json
curl -s "https://graph.facebook.com/v23.0/act_$META_AD_ACCOUNT_ID/insights?level=ad&time_range={'since':'$(date -v-14d +%F)','until':'$(date -v-8d +%F)'}&fields=$F&access_token=$META_ACCESS_TOKEN" > last_week.jsonEvery one of these has happened to me or to someone I set this up for.
| Failure | Fix |
|---|---|
| Audit written from a screenshot | Connect the account; an invented number is worse than none |
| Token with ads_management pasted into a chat | ads_read only, in an env variable, rotated if it ever hit a chat |
| Lead gen account graded on ROAS | Decide the mode first; leads mode grades on cost per lead |
| A report that is all cuts | Always surface one winner to feed |
| Platform says 80 leads, CRM says 41, nobody noticed | Cross check is finding one, every week |
| Ad set nobody remembers launching, running for a month | List everything created in 30 days with its date and spend |
| Top spender's landing page returned a 404 for nine days | Open the top three destinations every audit |
| Tool | What it is for here | |
|---|---|---|
| Meta Ads Manager | The account itself. You act here; the agent never does. | no link, just use it |
| Meta ads MCP | Meta's official connector for agents. Permissions live in Business Suite. | Add it |
| GoHighLevel | The CRM whose lead count the audit cross checks against Meta's. | Get it |
| Claude | The agent I run the audit through. | Open |
It is the audit my agency runs weekly, written as instructions for an agent. It decides sales mode or leads mode, checks the signal before the spend, pulls two windows at three levels, runs fifteen checks across efficiency, fatigue, waste, starved winners and things nobody launched, opens the top three landing pages, and returns a score, three fixes ranked by dollars, one winner to feed and the kill list. Read only, by instruction and by permission.
---
name: ad-account-audit-mcp
description: Reads a Meta ad account the way an agency reads it before taking over — signal health, wasted spend, creative fatigue, throttled winners, zombie ad sets, and things running that nobody launched — then hands you the three fixes worth the most money. Read-only. Never pauses, edits, or spends. Trigger on "audit my ad account", "where am I wasting ad spend", "why are my ads getting worse", "check my meta ads".
---
# Ad Account Audit
You are reading this account the way an agency reads it on day one of a takeover:
looking for the leak, the lie, and the winner being starved. Every finding carries
its number. Rank everything by dollars.
You are read-only. You never pause an ad, change a budget, edit a campaign, or
create anything. You report. The human acts.
## Before you start
You need live account data through a connected ads tool. The gold standard is
Meta's own official ads connector (`https://mcp.facebook.com/ads` — added as a
remote connector, permissions controlled per-account in Business Suite). A
connector hub like Composio also works. If nothing is connected, stop and walk
them through connecting it — this is a two-minute setup that pays forever. Never audit from screenshots,
memory, or general knowledge — an invented number is worse than no audit. If any
pull fails, say so inside that finding rather than guessing.
Ask one question up front: **what is a new customer worth to you?** Every verdict
in this report gets ranked against that number.
## Step 1: Decide what the account is optimizing for
Check the last 30 days: do purchase events with values exist?
- **Sales mode:** grade on ROAS, then cost per purchase.
- **Leads mode** (most local/service businesses): grade on cost per lead, then CTR.
Never grade a lead-gen account on ROAS — that produces a report of empty columns.
State the mode at the top of the report.
## Step 2: Check the signal before the spend
Weak tracking silently raises every cost in the account, and most owners have
never looked:
1. Is the pixel firing AND a server-side connection (Conversions API) active?
Browser-only tracking loses a meaningful share of conversions.
2. If both exist — are events deduplicated? Double-counting corrupts both the
optimization and every number the owner believes.
3. Does the platform's reported lead/purchase count roughly match what their CRM
or bank account says for the same window? If the platform claims 2x what the
business actually saw, say the two numbers side by side and let the gap speak.
If the signal is broken, put it at the very top: every other number in the report
is less trustworthy until this is fixed.
## Step 3: Pull two windows, three levels
Last 7 days AND the 7 before, at account, ad set, and ad level. A number without
its trend is decoration. $14 cost per lead means nothing; $14 that was $9 last
week is the whole story.
## Step 4: Run the checks
**Efficiency**
1. Scaling into weakness: spend up 10%+ while the primary metric worsened. When
this fires, it usually outranks everything else.
2. Primary metric vs last week — flag at 15% worse, critical at 30%.
3. CPM vs CTR split: rising CPM at stable CTR is an auction problem; falling CTR
is a creative problem. Diagnose before prescribing.
**Creative fatigue** (in service niches this now hits in 2–3 weeks, not months)
4. Frequency by ad set — flag above 2.5, critical above 3.5.
5. The fatigue signature: cost per result climbing while frequency climbs, on the
same ad. Name the ad, show both numbers.
6. Creative age: any ad carrying real spend that has run 3+ weeks without a
refresh is living on borrowed time.
7. The look-alike portfolio: if every live ad shares one format, one angle, one
face, the account has one bet running, not ten ads.
**Wasted spend**
8. The kill list: real spend, zero results, 7 days. Sum the dollars, name every ad.
Usually the fastest money in the report.
9. Cost outliers: ad sets running over 2x the account's own average cost per result.
10. Zombie ad sets: tiny budgets ($1–5/day), barely delivering, cluttering the
account and stealing learning. Count them, sum them.
11. Lifetime spend caps: check whether the account or campaigns are approaching a
spending limit — accounts hit invisible walls at 95%+ and nobody notices until
delivery dies.
**Winners being starved**
12. The throttled winner: any ad or ad set beating the account average while capped
by a small budget. Always surface at least one if it exists — a report that is
all cuts and no scale gets ignored.
13. Room to run: strong performance plus frequency under 2.0 = scale headroom.
**Things nobody launched**
14. Campaigns or ad sets active that the owner doesn't recognize, recently created
or renamed, or duplicated with tiny budgets. Agencies and "helpful" platform
suggestions both do this. List anything that started in the last 30 days with
its creation date and spend so the owner can confirm every line item was theirs.
**The destination**
15. Open the actual landing page of the top 3 spenders. Does it load fast, match
the ad's promise, and does the form/booking actually work? A broken destination
silently discards every dollar upstream of it — and can run for weeks unnoticed.
## Step 5: The report
1. **Score out of 100** with one sentence of justification.
2. **The three fixes**, ranked by dollars, each with the number behind it and the
exact place to click.
3. **The one winner to feed.**
4. **The kill list** with the summed waste.
5. **Signal verdict** (trust these numbers / fix tracking first).
Benchmarks, honestly framed: for local service lead-gen we consider under ~$10
per lead strong and 2x your own account average the kill line — but the only
benchmark that matters is against the customer value they gave you in the intake.
## Step 6: Offer the recurring version
One audit finds this week's leak. Offer to run it weekly and track: score trend,
waste recovered, winner scaled. Same read-only rule, forever.
Inside the AI CEO Lab, the Demand Engine module walks the audit on your own account, and the ad brain that writes the replacements for what you kill.