AI CEO Lab← All free guides
On this page
Ads · Audits

Meta Ads Audit: The Checklist I Run Before I Touch A Budget

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.

Meta Ads Audit: The Checklist I Run Before I Touch 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.

The three levels

Level 1 · Manual

You open Ads Manager on a Sunday, sort by cost per result, feel bad, close it.

Level 2 · AI + connections

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.

Level 3 · Agents on cadence

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.

Connections for this guide: A Meta ad account you administer. One of three doors into it: Meta's official ads MCP as a remote connector, a self hosted MCP with a system user token, or the Graph API with a token in an environment variable. Your CRM for the cross check. The audit skill below.

The mental model

Wrong

Look at the dashboard and hope something jumps out.

Right

Connect the account read only. Run the same fifteen checks every week. Rank by dollars. The agent reports, you act.

RoleTalks to youJob
SignalFirstPixel plus Conversions API, deduplicated, platform count vs CRM count
The leakSecondKill list, cost outliers, zombie ad sets, spend caps
The starved winnerThirdBeating the average on a small budget, frequency under 2
Things nobody launchedAlwaysAnything created in the last 30 days you do not recognize

Connect, then audit

1. Pick your door

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.

2. Make the access read only

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.

3. Tell it what a customer is worth

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.

4. Run the audit

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.

5. Cross check the CRM

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.

6. Act on the top three, nothing else

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.

Starter prompts

Paste these as written. They are short on purpose, because the long ones drift.

The prompt: run the audit

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.

The connect prompt

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.

The weekly prompt

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.

Give it to your agent, three ways

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.

An agent with connectors (Claude Desktop, Claude Code, Grok Bot)

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.

  1. Claude Desktop or claude.ai: Settings, Connectors, Add custom connector, URL https://mcp.facebook.com/ads, then sign in with the Meta account that administers the ad account and grant read access.
  2. Claude Code: run the command below, then /mcp to authenticate.
  3. Grok Bot: add the same URL as a connector for your chief of staff or, if you prefer local, point it at the self hosted server from the API block.
  4. Paste the audit skill from the bottom of this page into the agent's instructions or save it as a skill file. Say "audit my ad account".
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 (a project or a custom GPT)

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.

  1. Layer 1: in Ads Manager, set the date range to the last 14 days, breakdown by day, level Ad, columns: spend, impressions, CPM, CTR, frequency, results, cost per result, creation date. Export CSV. Create a ChatGPT Project, paste the audit skill as the project instructions, upload the CSV, and say "audit my ad account, leads mode, a customer is worth $X".
  2. Layer 2: create a custom GPT, add an Action with the OpenAPI stub below pointing at graph.facebook.com, set authentication to API key in the query as access_token, and paste the ads_read system user token there. The GPT can then pull insights live. It is still read only because the token is.
  3. Either way, ask it for the same report: score, three fixes by dollars, winner to feed, kill list, signal verdict.
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}}

Anything with an API (a token and a curl call)

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.

  1. Business Settings, System Users, add a user with Analyst access to the ad account, generate a token with the ads_read permission only.
  2. Export it once in your shell as META_ACCESS_TOKEN and your account id as META_AD_ACCOUNT_ID (the number after act_).
  3. Run the two calls below, last 7 days and the 7 before, at ad level. Feed the JSON to the agent with the skill.
  4. Self hosted MCP: the same two variables are what a local Meta ads MCP server reads. Point your agent at it with a stdio command and it exposes the insights calls as tools.
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.json

Failure modes

Every one of these has happened to me or to someone I set this up for.

FailureFix
Audit written from a screenshotConnect the account; an invented number is worse than none
Token with ads_management pasted into a chatads_read only, in an env variable, rotated if it ever hit a chat
Lead gen account graded on ROASDecide the mode first; leads mode grades on cost per lead
A report that is all cutsAlways surface one winner to feed
Platform says 80 leads, CRM says 41, nobody noticedCross check is finding one, every week
Ad set nobody remembers launching, running for a monthList everything created in 30 days with its date and spend
Top spender's landing page returned a 404 for nine daysOpen the top three destinations every audit

The tools I use for this

ToolWhat it is for here
Meta Ads ManagerThe account itself. You act here; the agent never does.no link, just use it
Meta ads MCPMeta's official connector for agents. Permissions live in Business Suite.Add it
GoHighLevelThe CRM whose lead count the audit cross checks against Meta's.Get it
ClaudeThe agent I run the audit through.Open
Some links are affiliate links. I only recommend tools I run in my own accounts.

The free skill

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.

How to use it: copy the whole thing, paste it into your bot (or save it as a skill file if you use Claude Code), and say “audit my ad account”. It walks you through the rest. Works with any agent that can read your files.
meta-ads-audit.md
---
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.

What done looks like at thirty days

  • The account is connected read only through a connector or a token you can revoke
  • The audit has run at least four times and the score is trending
  • The kill list was applied by hand and the waste recovered is a number
  • One winner had its budget raised while frequency stayed under 2
  • Platform and CRM lead counts are compared in every report
  • You have not opened Ads Manager to hunt for problems; it tells you

Want the audit run on your account with the fixes applied?

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.

Pick a side.

Most people read this and forget it by Friday.

The other kind builds the thing that week. They stop needing free guides, because they are too busy running actual systems.

Free guides stay free. The room is where the builds happen.