What this audit checks
Authentication & access
- Long-lived access_token present and not within 7 days of expiry (expires_in / is_long_lived)
- Granted scopes include ads_read, ads_management, business_management
- ad_account_id resolves and account_status is ACTIVE on /me/adaccounts
Spend & budget pacing
- Daily spend vs daily_budget / lifetime_budget pacing per campaign (under or over delivery)
- Ad sets pacing >120% of intended daily budget (runaway delivery)
- Campaigns with budget but zero spend in last 72h (delivery stalled)
Campaign performance (ROAS/CTR/CPC)
- ROAS per campaign from /act_/insights (purchase_roas) vs threshold
- CTR decay vs prior 7D same-DOW window per ad set
- CPC drift above account average on active campaigns
- Disapproved or rejected ads still attached to active ad sets
Conversion & attribution
- CAPI + Pixel event_id match rate below parity floor (deduplication broken)
- Clicks rising while tracked conversions <50% expected (silent tag failure)
- iOS 14.5+ attribution drift - modelled vs observed conversion gap widening
Creative & audience health
- Ad sets with frequency >7 and CTR <0.5% (creative fatigue + audience exhaustion)
- Active ad sets targeting custom audiences <1000 (below Meta privacy floor, won’t deliver)
- AdCreative status not ACTIVE while parent ad set is still spending
Cross-channel revenue at risk
- Active catalog/DPA ads driving spend on commerce-sibling SKUs with qty=0 (ads-on-OOS)
- Audience overlap with klaviyo/dotdigital email subscribers (paying to reach owned contacts)
- Meta mobile landing pages with website_performance LCP >4s and below-average CR
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
roas | - | < 1.0 |
ctr | - | < 0.5% |
conversion_rate | - | < 0.5% |
cpc | - | > 2.0x account average |
wasted_spend_pct | - | > 25% of account spend on zero-conversion ad sets |
budget_pacing | - | > 120% or < 50% of intended daily budget |
Data sources
GET https://graph.facebook.com/v22.0/me/adaccounts- List accessible ad accounts and account_statusGET https://graph.facebook.com/v22.0/act_{ad_account_id}/campaigns- Campaigns with objective, status, daily_budget, lifetime_budget, bid_strategyGET https://graph.facebook.com/v22.0/act_{ad_account_id}/adcreatives- Ad creatives for fatigue and status checksGET https://graph.facebook.com/v22.0/act_{ad_account_id}/insights- Spend, ROAS, CTR, CPC, frequency, conversions per campaign/ad setPOST https://graph.facebook.com/v22.0/oauth/access_token- Exchange/refresh OAuth access token