At a glance
Live count of SKUs with zero or negative on-hand inventory across all ShipBob DCs, scoped to SKUs with measurable recent demand (no point alerting on dead-SKU stockouts). The “what is missing right now and customers want it” number for ops and merchandising.
| What it counts | COUNT(DISTINCT sku WHERE SUM(on_hand_qty across all DCs) <= 0 AND demand_30d > demand_threshold). Each unique SKU counts 1, regardless of how deeply OOS or how many DCs are dry. |
| API endpoint | GET /inventory (Inventory API). Reads on_hand_quantity and available_quantity per SKU per DC; the card sums across DCs to determine network-wide OOS. |
| DC scope | Aggregated across every DC for OOS determination. A SKU is OOS only when zero across the whole network; if Chicago has stock and Cincinnati does not, the SKU is in-stock for the merchant (multi-DC routing handles it). Per-DC view in Inventory by Warehouse. |
| Shipping-method scope | Not applicable, this is an inventory metric. |
| Inventory-split semantics | A SKU is “in stock” if any DC has it; the card counts SKUs that are zero everywhere. Single-DC stockouts (one DC dry, another full) appear in Inventory Heatmap, not here. |
| Perfect-order definition | Stockouts at order-time block fulfilment, which fails on-time-shipping, which fails perfect-order. The OOS card is one upstream cause of the perfect-order leg. |
| SLA definition | Not directly applicable, but related: a SKU OOS at order-time creates an “on-hold” order until restocked, which guarantees an SLA miss. The card surfaces the at-risk SKUs before orders queue against them. |
| Peak-period seasonality | Q4 typically inflates OOS count by 2 to 5 times steady-state. Volume spikes outpace supply-chain lead times; viral or sale-driven SKU spikes deplete fastest-moving SKUs in days. December typically sees 5 to 15 OOS at any moment for a 200-SKU brand. |
| API rate limits | 200 requests / minute / token. Inventory API is webhook-driven via inventory.updated events; the card refreshes within seconds of stock movement. |
| Returns / RTO | Excluded for the OOS calculation (returned items take 2 to 7 days to be re-received and re-stocked, during which they do not contribute to on-hand). |
| Time window | RT (real-time, computed from latest indexed inventory snapshot) |
| Alert trigger | any OOS, the stockout_with_demand sentiment trips when ANY SKU with measurable demand goes to zero. The threshold can be adjusted (e.g. ignore SKUs with <10 sales/30D). |
| Roles | owner, operations, marketing |
Calculation
Calculated automatically from your ShipBob data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A US DTC supplements brand using ShipBob 3PL with 3 DCs and a 180-SKU catalogue. Reading taken at 09:00 ET on 12 Mar 26.| SKU | Top status | 30D demand (units) | Days since OOS network-wide | Note |
|---|---|---|---|---|
| MAGNESIUM-500 | OOS in CHI, MOV, CIN | 1,840 | 2 days | Top-3 SKU; replenishment ETA 9 days |
| ASHWAGANDHA-30CT | OOS in MOV; in stock at CHI 320 | 920 | 0 (single-DC OOS, not in this card) | Multi-DC routing handles |
| OMEGA-3-90CT | OOS in CHI, MOV, CIN | 720 | 4 days | Mid-tier; replenishment ETA 14 days |
| VITAMIN-D3-60CT | OOS in CIN; in stock at CHI 80 | 280 | 0 (single-DC OOS, not in this card) | Multi-DC routing handles |
| BIOTIN-90CT | OOS in CHI, MOV, CIN | 22 | 18 days | Long-tail SKU, low priority |
| PROBIOTIC-30CT | OOS in CHI, MOV, CIN | 480 | 1 day | Mid-tier; replenishment ETA 6 days |
- Single-DC OOS is hidden by design. Ashwagandha and Vitamin D3 are out at one DC each but in stock elsewhere; ShipBob’s routing engine sends Ashwagandha orders to Chicago and Vitamin D3 orders to Chicago, so customers see “in stock” and orders ship cleanly. The card counts only network-wide OOS to surface customer-facing problems, not warehouse-floor curiosities. Pivot to Inventory Heatmap to see single-DC OOS for restocking decisions.
- The Magnesium-500 and Probiotic-30CT lines are the bleeding ones. Top-3 SKUs combined 30D demand is 2,320 units; with 9- and 6-day replenishment lead times, the merchant will lose roughly 110 + 95 = 205 sales over the gap (assuming demand continues at trend). At AOV 5,500 of unrealised revenue.
- BIOTIN at 22 units / 30D is tagged but not urgent. The card surfaces it (network-wide OOS, demand exists) but a 22-unit SKU is not a priority. Configure a higher demand threshold (e.g. 50 units / 30D) to filter this out and reduce alert noise.
- Q4 inflates this card structurally. This same brand’s 5 Dec 25 reading was 12 OOS SKUs (vs steady-state 2 to 4); Black Friday and Cyber Monday volume cleared three of their top-10 SKUs in 36 hours. Read peak readings in seasonal context; pre-stock 6 to 8 weeks ahead.
- The card is a leading indicator for Operational Health Score. OOS feeds the inverse-stockout-severity pulse; a climbing OOS count drops the composite within hours. The card is also a leading indicator for Pending Backlog, since OOS-held orders accumulate.
Sibling cards merchants should reference together
OOS is the surface; ageing and demand work happens in supporting cards:| Card | Why pair it with Out-of-Stock Products | What the combination tells you |
|---|---|---|
| Inventory by Warehouse | Per-DC stock levels. | Shows whether single-DC OOS exists for SKUs in this card; informs routing-vs-restock decisions. |
| Stock vs Demand | Demand-weighted view. | Surfaces SKUs at risk of going OOS in 7 to 14 days (early warning), not just those already gone. |
| Inventory Heatmap | DC-by-SKU stock matrix. | Visual identification of single-DC OOS that the headline OOS count hides. |
| Inventory Ageing | Time-in-stock per SKU. | Old inventory signals over-buying; OOS signals under-buying. Pair to right-size purchase orders. |
| Operational Health Score | Composite that includes inverse-stockout-severity. | OOS climb drops the composite within hours; the relationship is direct. |
| Pending Fulfilment Backlog | OOS-held orders accumulate in backlog. | Climbing OOS predicts climbing on-hold orders within hours. |
Cross-connector: shopify.unfulfilled_orders | Customer-side OOS impact. | OOS at ShipBob causes Shopify orders to either be PARTIALLY_FULFILLED or held; correlated metric. |
Cross-connector: shopify.refund_rate | Downstream impact at 7 to 14 days. | Sustained OOS drives customer-cancel-and-refund. |
| Cross-connector: customer NPS surveys | Downstream sentiment, lag 14 to 30 days. | Customers complain loudly about OOS in surveys; correlates with sustained OOS readings. |
Reconciling against the vendor’s own dashboard
Where to look in ShipBob Merchant Portal: ShipBob Merchant Portal → Inventory → Stock Status → Filter “Out of Stock”. The portal shows per-SKU per-DC inventory levels with on-hand, reserved, available quantities. The closest like-for-like view is “Out of Stock at All DCs”. Why our number may legitimately differ from ShipBob’s portal:| Reason | Direction | Why |
|---|---|---|
| Timezone (UTC default) | Negligible | Real-time card; timezone affects only the demand-window denominator, not the OOS calculation itself. |
| DC-level vs aggregated reporting | Aggregated by definition | The card counts network-wide OOS only; portal can show per-DC OOS. Numbers diverge by definition. |
| SLA definition variance (demand-threshold filter) | Either | The card filters by recent demand (default >5 sales / 30D); portal shows all OOS. Brands with long-tail SKUs see lower numbers in the card. |
| Peak-period batch-processing delays | Ours lower briefly | Inventory webhook lag of 1 to 5 minutes during normal operation; up to 30 minutes during BFCM. T-1-hour fully reconciles. |
| Reserved stock treatment | Either | Portal sometimes counts “reserved for in-flight orders” as in-stock; the card uses available_quantity (on-hand minus reserved) by default. Configurable. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify.unfulfilled_orders | OOS-held orders flow into Shopify unfulfilled. ShipBob lag of 2 to 6 hours. | Shopify orders for OOS SKUs may be allowed at checkout (continue-selling-when-OOS toggle), creating Shopify unfulfilled count without ShipBob being able to ship. |
| Shopify product inventory | Storefront catalogue. | Shopify product inventory counts are typically synced from ShipBob; differences indicate sync lag or in-flight reservations. |
| Amazon FBA OOS | Peer 3PL with its own inventory. Independent population. | Different SKUs allocated to FBA vs ShipBob; not reconciled. |
| Customer NPS / out-of-stock complaints | Downstream sentiment, lag 14 to 30 days. | Survey response bias; complaints peak when sustained OOS exceeds 7 to 14 days on top-tier SKUs. |