What this audit checks
Authentication & access
- OAuth refresh token expiring or revoked (silent access-token refresh failing)
- Ad account or organization status not ACTIVE (PAUSED / suspended)
- Required scope snapchat-marketing-api missing or downgraded
- Sustained 429 / Retry-After throttling against the Marketing API per-account QPS
Spend & budget pacing
- Daily-budget-micro overspend or underdelivery vs target across ad squads
- Lifetime spend cap (micro) nearly exhausted on an in-flight campaign
- Zero-conversion spend burst on any ad squad in the last 72h
- Auction CPM creep on mobile-only inventory pushing pacing off plan
Campaign performance (ROAS / CTR / CPC)
- ROAS dropped >25% vs prior 7D same-day-of-week window per campaign
- Swipe-up / CTR decay below benchmark on creatives with frequency >7 (fatigue)
- CPC / CPM above category benchmark across AUCTION buy-model campaigns
- Goal-Based-Bidding campaigns optimising on rare events <10/week (bid drift, never converges)
Conversion & attribution
- Snap Pixel + CAPI Events event_id match rate <80% over the weekend window
- CAPI Events not deduplicating with Pixel (event_id format finicky, double-counting conversions silently)
- Reported conversions <50% of expected during an ATT / iOS attribution-drift window
- Attribution-window misconfiguration suppressing post-view Gen Z conversions
Creative & audience health
- AdCreative review_status REJECTED or under review while campaign is spending
- Custom audiences below the 1,000-member Snap privacy floor (will not deliver, spend reallocates to broad)
- AR Lens campaigns overlapping In-Feed for the same Gen Z audience (unique-reach cannibalisation)
- Audience overlap with tiktok_ads sharing the same email_hash Gen Z pool
Cross-channel revenue at risk (highest-value area)
- Active catalog ads on out-of-stock SKUs (sibling = bigcommerce / shopify / adobe_commerce product qty = 0)
- Spend on catalog campaigns whose Feedonomics feed has active rejections
- Branded Snap clicks cannibalising free organic search (sibling = google_search_console branded queries)
- Mobile landing pages with poor Web Vitals (sibling = website_performance LCP p75 mobile >4s)
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
roas | 2.5 | - |
ctr_pct | 0.5 | - |
conversion_rate_pct | 1.0 | - |
cpc | 1.5 | 3.0 |
wasted_spend_pct | 5 | 12 |
budget_pacing_pct | 70 | - |
pixel_capi_match_rate_pct | 80 | - |
custom_audience_size | 1500 | - |
refresh_token_days_to_expiry | 14 | 7 |
Data sources
GET https://adsapi.snapchat.com/v1/me/organizations- Auth + organization sanityGET https://adsapi.snapchat.com/v1/organizations/{organization_id}/adaccounts- Ad account status + currency + timezoneGET https://adsapi.snapchat.com/v1/adaccounts/{ad_account_id}/campaigns- Campaign state, objective, budgets, buy modelGET https://adsapi.snapchat.com/v1/adaccounts/{ad_account_id}/creatives- Creative type + review_status (creative health)GET https://adsapi.snapchat.com/v1/adaccounts/{ad_account_id}/stats- Spend / ROAS / CTR / CPC / conversion statsPOST https://accounts.snapchat.com/login/oauth2/access_token- Refresh OAuth access token