agentleFS
bartlomiejborzuckibartlomiejborzucki/meta-ads-agent/skills/meta-ads-audit/SKILL.md

meta-ads-audit

Skill0 starsChanged 44 days agoMITView on GitHub

Read-only audit of a Meta (Facebook/Instagram) ad account: status, currency, timezone, payment and eligibility, campaign structure, budgets, delivery, spend, pixels and datasets, conversion events, Page and Instagram identity, audiences, tracking health, recent performance, and configuration problems. Use for "audit my account", "what's broken", "review my setup", "why isn't this delivering", or before planning a campaign on an unfamiliar account.

We split this skill into the rules it gives an agent

10 rules. 0 are common, 6 are distinctive, and 4 are very specific to this project.

  • 0

    Common

    Most of the 4 edited versions we read keep these.

  • 6

    Distinctive

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Read meta-ads-core first for routing and the safety model.

    line 17
  2. Very specific:

    1. Meta's official Ads MCP - the execution layer: Look for tools named ads_* in this session.

    line 24
  3. Distinctive:

    Look for: campaigns with no active ad sets.

    line 84
  4. Distinctive:

    If an ad set optimises for an event with no recent volume, that is a finding - it will not deliver well, and no amount of creative work …

    line 105
  5. Distinctive:

    Check for: audiences too small to deliver, stale customer lists, audiences referenced by live ad sets that no longer populate.

    line 115
  6. Very specific:

    Use meta-ads-report for a real performance readout.

    line 127
  7. Distinctive:

    If something looks wrong, check whether someone changed it.

    line 134
  8. Distinctive:

    FACT: - read from Meta. Name the tool and the date range.

    line 142
  9. Distinctive:

    No mutations: Not even "obviously safe" ones.

    line 173
  10. Very specific:

    Say "insufficient evidence": when spend or conversions are too thin to support a conclusion.

    line 176

“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Meta Ads account audit

Read-only. Never mutate an account during an audit. A user asking what is wrong has not asked you to fix it. Propose; do not apply.

Read meta-ads-core first for routing and the safety model.

<!-- shared:preflight start - generated from packaging/shared/preflight.md by scripts/sync_skill_blocks.py - edit there -->

Preflight: two checks, kept separate

Independent questions; never let one answer stand in for the other.

1. Meta's official Ads MCP - the execution layer. Look for tools named ads_* in this session. With none, nothing here can reach an account: say so and help the user connect it - connect-meta-mcp.md under references/ in the meta-ads-core skill, or https://github.com/bartlomiejborzucki/meta-ads-agent/blob/master/skills/meta-ads-core/references/connect-meta-mcp.md. The local CLI does not replace it.

2. The local meta-ads-agent CLI - optional, usually absent. Assume it is missing until this succeeds:

meta-ads-agent --version

"command not found" is the normal answer, not a fault. Show no meta-ads-agent ... command before that probe has succeeded - a command that fails at the user's prompt costs more than the step it saves. Say "that step needs the optional CLI, which is not installed here" and carry on.

The MCP alone covers audits, reporting, Ad Library research, previews, tracking, creative, optimisation and the changes that follow; .meta-ads/ files can be written directly from the templates in meta-ads-core's assets/. Only these need the CLI: plan validation (so campaign builds), local image and video upload, video / existing-post / multi-variant / carousel creatives, deletion, and the report arithmetic (which has a by-hand route).

<!-- shared:preflight end -->

Order of work

Each step depends on the ones before it, so do not reorder them.

1. Account foundation

ads_get_ad_accounts

Record and report: name, id, currency, timezone_name, account_status, disable_reason, has_payment_method, is_queryable, is_ads_mcp_enabled, business, and country.

Currency and timezone are not trivia - every number after this point is meaningless without them. A missing payment method or a reached spend limit explains "nothing is delivering" faster than any performance analysis, so surface it immediately rather than at the end.

2. Identity

ads_get_user_pages or ads_get_ad_account_pages, then ads_get_ig_accounts.

A Facebook Page is mandatory ad identity. No linked Instagram account means no Instagram placements, which quietly changes where budget goes.

3. Structure

ads_get_ad_entities for campaigns, ad sets, and ads.

Report the shape, not every row: how many campaigns, how many are active, which objectives, budget level (campaign/CBO vs ad set/ABO), how many ad sets per campaign, how many ads per ad set.

Look for: campaigns with no active ad sets; ad sets with no active ads; budget set at both levels; several ad sets targeting overlapping audiences; objectives that do not match what the user says they want.

4. Delivery and errors

ads_get_errors, then ads_get_opportunity_score.

Delivery-blocking errors are the highest-value finding in most audits, because they are specific, actionable, and often invisible in the performance numbers. Report Meta's own score and recommendations as Meta's opinion, attributed.

5. Signals

ads_get_datasets, ads_get_dataset_details, ads_get_dataset_stats, ads_get_dataset_quality, ads_get_customconversions.

A pixel existing is not evidence that tracking works. stats shows whether events are actually arriving; quality shows Event Match Quality and freshness. Report configuration and evidence as separate things.

If an ad set optimises for an event with no recent volume, that is a finding - it will not deliver well, and no amount of creative work fixes it.

Deeper: use meta-ads-tracking.

6. Audiences

ads_get_ad_account_custom_audiences, then ads_get_custom_audience for anything in use.

Check for: audiences too small to deliver, stale customer lists, audiences referenced by live ad sets that no longer populate. Never read or export the contents of a customer-list audience.

7. Recent performance

ads_get_ad_entities with metrics, or ads_insights_performance_trend.

Last 30 days at campaign level: spend, impressions, reach, frequency, CPM, clicks, CTR, CPC, results, cost per result. Note the attribution window if it is available; never compare numbers across different windows.

Use meta-ads-report for a real performance readout. The audit only needs enough to spot structural problems.

8. Recent changes

ads_account_get_activity_logs

If something looks wrong, check whether someone changed it. "The CPA doubled" and "someone widened the targeting on Tuesday" are the same finding, and without the log you would guess creative fatigue.

How to report

Three labels, never blurred:

  • FACT - read from Meta. Name the tool and the date range.
  • INTERPRETATION - your reading. Say what would change your mind.
  • RECOMMENDATION - what you would do, and what it assumes.
FACT            The account bills in PLN, timezone Europe/Warsaw.
FACT            3 of 7 campaigns are active. Spend in the last 30 days:
                12,430.00 PLN (ads_get_ad_entities, 2026-08-17 to 2026-09-15).
FACT            Dataset 1234567890 received 0 PURCHASE events in the last 28
                days (ads_get_dataset_stats).
FACT            Ad set "PL retargeting" optimises for PURCHASE.
INTERPRETATION  That ad set is optimising for a signal Meta is not receiving,
                so its delivery is effectively unoptimised. I have not
                confirmed whether the pixel fires on the site - this is read
                from Meta's received-event counts only.
RECOMMENDATION  Verify the PURCHASE event fires before spending more here.
                Nothing needs to change in Ads Manager until that is known.

Structure the output as:

  1. Blocking problems - things stopping delivery or making spend wasteful.
  2. Configuration risks - things that will hurt but are not blocking.
  3. Observations - worth knowing, no action implied.
  4. What I could not check - and why.

That last section is not optional. An audit that hides its gaps invites a false sense of coverage.

Discipline

  • No mutations. Not even "obviously safe" ones.
  • Do not dump metrics. Ten findings a human can act on beats two hundred rows.
  • Say "insufficient evidence" when spend or conversions are too thin to support a conclusion. min_conversions_for_decision and min_clicks_for_decision in .meta-ads/brand.yaml are the user's own floors - respect them.
  • Separate platform constraints from opinions. "Special ad categories must be declared" is a rule. "You should use CBO" is a view - label it as one, or leave it out.
  • Do not invent benchmarks. ads_insights_industry_benchmark gives real ones; anything else is a number you made up.

Checklist form: references/audit-checklist.md.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.