What this audit checks
Spend efficiency
- ACOS above merchant target across campaigns
- TACOS trend deteriorating WoW
- Campaigns with >$X spend and <1% conversion (zero-conversion spend)
- Bid creep - auto-bidding pushing CPC above category benchmark
- Dayparting waste - spend in low-converting hours
Cross-channel leak (highest-value area)
- Active ads on out-of-stock ASINs (sibling = amazon.listing.quantity = 0)
- Active ads on suppressed listings (sibling = amazon.listing.status = SUPPRESSED)
- Active ads on no-buy-box ASINs (sibling = amazon.listing.buyBoxPercentage < 50)
- Branded campaigns running while DTC is on Black-Friday discount (sibling = shopify.discount_active) - paying for traffic you’d get free
Search-term hygiene
- Negative-keyword candidates - search terms with >$10 spend, zero orders
- Search-term harvest queue - auto-campaign winners not yet promoted
- Branded-vs-non-branded mix anomaly (>80% branded = dependency risk; <20% = under-defending the brand)
- Broad-match exposure across campaigns >40% of spend
Campaign hygiene
- Campaigns enabled with no active ads (orphan campaigns)
- Ad groups with default-bid 50% above category median
- Campaigns paused >30d but not archived (cluttering reporting)
- End-dated campaigns still spending (date-bound campaigns past end_date that didn’t pause)
Account & creative health
- Disapproved ads in active campaigns
- Sponsored Brands creatives with broken landing pages (hero ASIN suppressed)
- DSP creatives missing brand-safety attestation
- Refresh-token expiry within 30 days
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
acos_pct | 30 | 45 |
tacos_change_pct_wow | 15 | 30 |
zero_conversion_spend_pct_of_total | 5 | 12 |
oos_advertised_asins_count | 1 | 5 |
no_buybox_advertised_count | 1 | 10 |
search_term_harvest_count | 5 | 15 |
refresh_token_days_to_expiry | 14 | 7 |
branded_share_pct | 20 | - |
Data sources
GET https://advertising-api.{region}/v2/profiles- Auth + profile sanityPOST https://advertising-api.{region}/sp/campaigns/list- Campaign-level state + budgetPOST https://advertising-api.{region}/sp/productAds/list- Ad → ASIN mapping (cross-channel join key)POST https://advertising-api.{region}/reporting/reports- Async campaign / search-term / target reports