OOS bestsellers leak revenue while ad spend continues, feeds ads_on_oos kill-shot.
At a glance
Real-time count of products that show zero stock right now in Square’s Inventory API. The single highest-leverage operational signal on a Square account: every minute an OOS bestseller stays OOS while ad spend runs against it is leaked revenue.
| What it counts | COUNT(items WHERE inventory_count.quantity == 0) from the Square Inventory API, filtered to active items in the catalog. |
| VAT / tax treatment | n/a, this is an inventory count. |
| Shipping | n/a. |
| Discounts | n/a. An item that’s OOS at full price is still OOS. |
| Refunds | n/a. |
| Cancelled / voided orders | n/a, this card is real-time inventory, not order-based. |
| Currency | n/a. |
| Channels / sources | Per-location. Square tracks inventory per location_id (a 50-pack of beans can be in stock at the Brooklyn cafe but OOS at Park Slope). This card sums distinct items that are zero across all locations, the strict OOS set. To see “OOS at one location only”, filter by location. |
| Time window | RT (real-time, polled every 5-15 minutes from Square Inventory API) |
| Alert trigger | >10 items, threshold-based |
| Roles | owner, operations |
Calculation
Calculated automatically from your Square Online 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 gift store on Square: one retail location plus Square Online. Catalog of 1,420 active items (mix of single-SKU and variant-driven products). Snapshot taken on 12 Apr 26 at 14:00 UTC.| Item bucket | Count | Notes |
|---|---|---|
| Active catalog items | 1,420 | All items marked is_archived = false in Square Items |
| In stock at both locations | 1,180 | Healthy core |
| In stock at retail only (web shows OOS) | 124 | Web shoppers see “Sold out”, retail shoppers can buy |
| In stock at web only (retail shelf empty) | 76 | Retail walk-ins miss out, web is fine |
| OOS at every location (this card) | 40 | |
| Of those 40 OOS items: bestsellers (top 50 by 30-day revenue) | 6 | The dangerous slice |
| Of those 40 OOS items: long-tail dead stock | 28 | Negligible revenue impact |
| Of those 40 OOS items: seasonal items pre-launch | 6 | Expected, not a problem |
- Only 6 of the 40 OOS items actually matter. A flat OOS count of 40 doesn’t tell you whether you’re losing money. The dangerous slice is OOS bestsellers, items that drive disproportionate revenue. Cross-reference this card with Top Products by Revenue, the overlap is the kill-shot list.
- Per-location OOS is a richer signal than chain-wide. A bestseller OOS at retail with web stock is fine if you can ship it; an item OOS at retail with active in-store ad campaigns is a problem. Square’s per-
location_idinventory makes this slice possible; pin per-location panels to surface. - Variant-level OOS hides under product-level “in stock”. A t-shirt with 5 sizes might show in stock if any size has inventory, but if Medium (the bestseller size) is OOS, the listing converts at near-zero. This card counts at the variant level (
catalog_object_id), not the parent product level, the right granularity for OOS reads. - The alert fires at >10 OOS items. This snapshot has 40, well above threshold. Vortex IQ Nerve Centre raises the alert; the kill-shot diagnostic surfaces the 6 OOS bestsellers and (if Square Ads is connected) any active ad spend pointing at them.
Sibling cards merchants should reference together
| Card | Why pair it with OOS Products |
|---|---|
| Low-Stock Products | The leading-indicator. Today’s low-stock items become tomorrow’s OOS items. Pair to anticipate. |
| Top Products by Revenue | Cross-reference reveals which OOS items actually leak revenue. 90% of OOS items are long-tail dead stock; the 10% that are top sellers are the kill-shot. |
| Conversion Rate | OOS spikes typically pull web CR down within a day, shoppers land on a sold-out listing and bounce. |
| Total Revenue | Rising OOS count usually precedes a revenue dip by 1-3 days. Useful as an early warning. |
| Refund Rate | Sometimes OOS at the warehouse without the catalog being marked OOS leads to oversells, fulfilment fails, customer refunds. A simultaneous OOS spike + refund spike points to inventory data drift. |
shopify.oos_products | Same metric on Shopify. |
bigcommerce.oos_products | Same metric on BigCommerce. |
Reconciling against the vendor’s own dashboard
Where to look in the Square Dashboard: Square Dashboard, Items, Inventory. Filter by Out of stock to see the same set of items this card counts. Square Online’s per-product editor also flags OOS state with a “Sold out” badge on the storefront. For per-location inventory, use the Stock by location tab. Why our number may legitimately differ from Square Dashboard:| Reason | Direction of divergence |
|---|---|
| Sync lag. Square Inventory API has a small lag (typically <5 minutes). A sale at the register that pushes inventory to zero is reflected here ~1-5 minutes later. | Vortex IQ momentarily lags |
| ”Stock alerts” vs OOS. Square supports a “Low stock alert” threshold per item (e.g. alert when <5 left). Items at or below the threshold are flagged in Square but not OOS, those don’t count here. | No divergence in OOS strict mode |
Items without stock tracking. Square allows items to be untracked (location_overrides[].track_inventory = false). Untracked items always show “in stock” and never count here, even if physically depleted. | Vortex IQ may understate true OOS for untracked items |
Archived / hidden items. Items with is_archived = true are excluded from this card. If a merchant hides an item from the storefront but doesn’t archive it, the item still counts. | Vortex IQ may overcount |
Variant vs parent. We count at variant (catalog_object_id) granularity. Square’s Items page can be set to show parent products; counts will look different in that view. | Vortex IQ usually higher (variants > parents) |
google_adwords.ads_on_oos(planned), surfaces ad spend currently pointing at OOS bestsellers.amazon_ads.ads_on_oos(planned).
Known limitations / merchant FAQs
My Square Items dashboard says I have 8 OOS items but this card says 40. Why? Three likely reasons: (1) Square Items dashboard counts at the parent-product level by default; this card counts at the variant (catalog_object_id) level, so a t-shirt with 5 sizes (Medium and Large OOS, Small / XL / XXL in stock) shows as 1 product in stock in Square but 2 OOS variants here. (2) Sync lag: this card refreshes every 5-15 minutes; instantaneous changes lag. (3) Per-location: this card counts items OOS at every location; Square’s default Inventory page may show a single-location filter.
Does an item that’s untracked count as OOS?
No. Items with track_inventory = false always read as “in stock” via the Square API, regardless of physical reality. This card respects that, untracked items never count here. Many small Square merchants run untracked for low-cost SKUs (greeting cards, sample-size items). If you need OOS visibility for those items, enable inventory tracking in Square Item editor.
Why does the count fluctuate hour-to-hour?
Real-time inventory changes with every sale and every manual adjustment. A bestseller can sell out at 14:00 and be re-stocked at 15:30 once the merchant tops up. Use the trend, not the snapshot. A persistent OOS count above threshold is a problem; a momentary blip is normal operations.
The alert says >10 OOS items but only 1 of them matters. How do I prioritise?
The headline count is a leading indicator; the kill-shot diagnostic is what matters. Vortex IQ Nerve Centre cross-references this card against Top Products by Revenue to surface the OOS-bestseller subset. Ten OOS items where none are top-50 sellers is a maintenance issue (clear them from the catalog or restock); one OOS item that’s a top-5 seller is a $5,000-a-week leak and a paid-ad budget burn.
Does this include POS-only items?
Yes, Square’s catalog is unified across POS and Square Online. An item OOS at the warehouse is OOS for both retail and web. To split, look at per-location inventory, an item OOS at the retail location only is unsold in-store but still shippable from web stock if web inventory is tracked separately.
What about negative inventory (oversells)?
Square allows negative inventory if oversells happen (e.g. two simultaneous purchases of the last unit). Items with quantity < 0 count as OOS in this card (zero or below). The merchant should investigate the oversell, those orders typically end in fulfilment fails and refunds.
My catalog has 5,000 items. Will this card slow my dashboard?
No. Square’s Inventory API supports batch reads; we poll inventory deltas, not the full catalog every refresh. For very large catalogs (>10K SKUs), the refresh interval can stretch to 15 minutes; that’s fine for an operational signal but not for sub-minute reaction.
What’s the right action playbook when this card spikes?
Three steps in order: (1) sort the OOS list by 30-day revenue, focus on the top quartile, (2) check incoming purchase orders or transfer requests, are restocks already in motion? if yes, this is an inventory-team backlog issue, (3) if Square Ads or Google Ads is connected, pause campaigns that target the OOS bestsellers immediately, even a half-day of OOS ad spend can blow a week’s marketing budget.