What this audit checks
Authentication & access
- Admin API token still valid (auth on /admin/users/me)
- Backend reachable - self-hosted / Medusa Cloud base URL responds
- Required modules enabled (orders, products, inventory, customers) - headless installs can disable modules
- Publishable key sales-channel scope matches the merchant’s expectation
Stock & inventory health (the highest-leverage area)
- Variants with inventory_quantity <= 0 and manage_inventory true - actively losing sales NOW
- Variants below reorder point (low-stock reorder-window trigger)
- Stock-out burst - >5 variants transitioned to OOS in last 1h (sync break or flash-sale stockout)
- Backorder enabled on OOS variants without clear customer messaging
Refunds & returns
- Refund rate > 5% over 30d (returns-health headline)
- Refund-rate spike > 2σ vs 30d baseline (product defect / fraud / fulfilment failure)
- Refund value up > 25% vs prior period (cash impact of returns)
- Per-SKU refund concentration - one product driving the spike
Fulfilment & order flow
- Unfulfilled orders > 2× 30d average (backlog = customer-promise risk)
- Orders stuck in awaiting / not_paid > 24h (payment-provider issue or dropoff)
- Cancellation rate > 3% over 30d
- Region-specific order drop > 50% vsP (region-specific checkout/payment/storefront outage)
Catalogue quality
- Products missing description (suppresses conversion + SEO)
- Products missing thumbnail / image
- Variants missing SKU (breaks marketplace + ad parity joins)
- Variants missing price in an active region’s currency
Cross-channel: revenue at risk
- Cross-channel: OOS SKU appears in active google_ads campaign - $ wasted (sibling = google_ads.product_ad active on medusa.variant inventory_quantity<=0)
- Cross-channel: OOS SKU appears in active amazon_ads campaign - $ wasted
- Cross-channel: SKU OOS or price-divergent on Medusa vs marketplace listing (sibling = amazon/ebay.marketplace_listing active)
- Cross-channel: slow Core Web Vitals on top revenue pages driving cart loss (sibling = website_performance.crux_page LCP p75 > 2.5s)
- Cross-channel: high-value customer unengaged in email tool (sibling = klaviyo/mailchimp last_open_at < 90d_ago)
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
out_of_stock_count | 1 | 5 |
refund_rate_pct | 2 | 5 |
cancellation_rate_pct | 1 | 3 |
unfulfilled_count | 10 | 50 |
awaiting_payment_aged_count | 5 | 10 |
region_order_drop_pct | 30 | 50 |
repeat_rate_pct | 20 | 10 |
missing_desc_pct | 5 | 20 |
oos_with_active_spend_count | 1 | 5 |
Data sources
GET {backend_url}/admin/users/me- Auth probe + admin identityGET {backend_url}/admin/orders- Order status, payment/fulfilment state, refunds, region/currency splitGET {backend_url}/admin/products- Catalogue size + description/image gapsGET {backend_url}/admin/product-variants- Per-variant SKU + inventory_quantity (the OOS join key)GET {backend_url}/admin/inventory-items- Inventory module levels for low-stock / reorder checksGET {backend_url}/admin/returns- Return rate + reasons + processing timeGET {backend_url}/admin/customers- Customer base, repeat rate, email-engagement join keyGET {backend_url}/admin/regions- Region + currency model for multi-currency revenue split