Skip to main content
Card class: HeroCategory: Ecommerce Platform
The standing count of products that are enabled and visible on the storefront but currently sitting at quantity zero, the level reading behind every stock-out alert.

At a glance

A product at zero stock is either a fast-mover you forgot to reorder or a SKU a bad feed silently zeroed. This card is the level: how many enabled, customer-facing products are at quantity zero right now. Unlike a one-off alert, it tells you the size of the hole at any moment. When the number is above zero and those products still have demand, every visit to one of them is a missed sale on something you may well have in the warehouse.
What it countsThe number of enabled, storefront-visible products whose stock quantity is currently zero.
Stock sourceQuantity is held in oc_product (the quantity column). Stores using a stock-sync extension or warehouse integration have this column written by that integration rather than by hand.
Disabled productsExcluded. A zero on a disabled (hidden) product is not customer-facing and does not count here.
Subtract / out-of-stock flagOpenCart’s global Subtract Stock setting and the per-product out-of-stock status govern whether a zero-quantity product still shows as buyable. This card counts the zero regardless of whether the storefront still accepts a backorder.
Stock status labelOpenCart lets you attach a stock-status label (for example “Out Of Stock”, “Pre-Order”) to zero-quantity products. The label is cosmetic; the count keys off the quantity, not the label text.
Currency / refundsNot applicable. This is a stock-level metric, not a money metric.
Multi-storeStock is shared across store_id storefronts by default (one product, one quantity), so a zero affects every store at once and is counted once.
Time windowRT (live snapshot)
Alert trigger> 0 with active demand
Rolesowner, operations, finance

Calculation

COUNT(products)
  WHERE quantity = 0
    AND status = enabled

Worked example

A UK garden-supplies store on OpenCart 4.x with around 3,100 active SKUs. Stock comes in via a nightly warehouse import. The snapshot is taken on 18 Mar 26.
SegmentProducts at zeroNotes
Enabled, with recent views/sales22Counted, these are the painful ones
Enabled, no demand in 90 days14Counted, but low priority to reorder
Disabled (hidden)63Excluded, not customer-facing
Backorder-allowed (Subtract Stock off)9Counted, still buyable but flagged
Out-of-Stock Products (this card)45enabled + at-zero, regardless of buyability
What’s interesting here:
  1. The count is 45, but only 22 of those actually matter today. The card gives the level; demand context (which of those 45 have recent views or sales) is what turns a number into a reorder list. The 22 with active demand are where lost revenue is accumulating right now.
  2. 63 disabled zero-stock products are correctly ignored. A retired or seasonal SKU sitting at zero is not a customer-facing problem, so excluding disabled products keeps the number honest. If those were counted, the merchant would chase ghosts.
  3. Nine backorder-allowed SKUs still count. With Subtract Stock off, those products can still be ordered, but a zero quantity is still a signal worth seeing. The merchant treats these differently: they are not “lost sales”, they are “fulfilment promises to keep”.
  4. One number, every storefront. Because OpenCart shares stock across store_id, the 45 figure is the same whether the merchant runs one storefront or five. A single warehouse import drives the whole estate.

Sibling cards merchants should reference together

CardWhy pair it with Out-of-Stock Products
Stock-Out BurstThe rate-of-change alarm. This card is the level; the burst tells you when the level just jumped.
Revenue at Risk (live)Quantifies the sales exposure tied to products that are currently unbuyable.
Low-Stock SKUsThe leading indicator. Low-stock SKUs are the ones about to join this count.
Top-Velocity SKUs vs Ad SpendIf a zero-stock SKU is one you are actively advertising, you are paying to send traffic to a dead product.
Disabled ProductsSome merchants disable zero-stock SKUs to hide them. The two counts move in opposite directions when you do.
OpenCart Inventory vs Marketplace ListingsIf OpenCart is at zero but the marketplace still shows stock, the marketplace is about to oversell.

Reconciling against OpenCart

Where to look in the OpenCart admin: Catalog → Products shows each product’s Quantity and Status columns; sort by quantity ascending to bring zero-stock items to the top, and add the Status column to separate enabled from disabled. Reports → Products Viewed and Reports → Products Purchased tell you which of the zero-stock items still have demand. If you use a stock-sync or import extension, its own log (often under Extensions or System → Maintenance) records what each run wrote into the quantity column. OpenCart admin views that look like the same number but aren’t:
  • Catalog → Products filtered to “Out of Stock” may include disabled products and any item carrying an out-of-stock stock-status label regardless of its actual quantity. This card keys off quantity = 0 on enabled products only.
  • The Dashboard shows no stock detail and will not reflect this number.
  • A stock-status label of “Out Of Stock” is cosmetic text; a product can carry that label while still holding quantity, or hold zero quantity with a different label. The card trusts the quantity.
Why our number may legitimately differ from the OpenCart admin:
ReasonDirection of divergence
Timezone. Vortex IQ reads on a UTC cadence; OpenCart timestamps follow the store timezone. A snapshot taken near a feed run can differ by a sync interval.Cosmetic timing shift
Multi-store. Stock is shared across store_id, so the card counts the product once even though it affects every storefront.Card counts products, not store-product pairs
Disabled products. The card excludes disabled products; an unfiltered admin “out of stock” view may include them.Card lower than an unfiltered admin count
Stock-status label vs quantity. Admin filters on the label; the card filters on the quantity column. The two diverge when a label is set independently of stock.Either direction
API / DB sync lag. A quantity that hit zero in the last minute may not yet be reflected.Self-resolves at next sync
Cross-connector note: if you also list on a marketplace, a zero in OpenCart that is not mirrored on the marketplace shows up as a divergence on OpenCart Inventory vs Marketplace Listings. That is the moment a marketplace can oversell stock OpenCart already knows is gone.

Known limitations / merchant FAQs

Does this count disabled products? No. Only enabled, storefront-visible products are counted. A zero on a hidden product is not a customer-facing problem, so including it would only inflate the number and bury the SKUs that actually matter. A product shows zero but customers can still order it, is that a bug? No. With the global Subtract Stock setting off, or with a per-product out-of-stock behaviour that allows ordering, OpenCart accepts orders on zero-quantity items (backorder behaviour). The card still counts the zero because it is a signal worth seeing; you decide whether that SKU is “lost sales” or “a promise to fulfil”. Why does my admin “Out of Stock” filter show a different total? The admin filter often keys off the stock-status label and may include disabled products. This card keys off the actual quantity column on enabled products only. Set the admin filter to enabled products at quantity zero and the two will line up. Does a stock-status label of “Out Of Stock” change the count? No. The label is cosmetic text you can set independently of the real quantity. The card trusts oc_product.quantity, not the label. A product labelled in stock but holding zero quantity still counts. Why is the number the same across all my storefronts? OpenCart shares stock across store_id storefronts by default: one product, one quantity. A zero therefore affects every store at once and is counted a single time. How is this different from the Stock-Out Burst alert? This card is the level (how many are at zero right now); the burst is the rate of change (how many just dropped to zero in the last hour). Use the burst to catch a bad feed fast, and this card to see how deep the resulting hole is. The count won’t go down even after I reordered, why? Reordering does not change OpenCart stock until the quantity is actually written back, either by hand in Catalog → Products or by your next stock-sync run. The card reflects the quantity column; until that column moves above zero, the SKU stays counted.

Tracked live in Vortex IQ Nerve Centre

Out-of-Stock Products is one of hundreds of KPI pulses Vortex IQ tracks across OpenCart and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.