Skip to main content
Metrics type: Supporting MetricsCategory: Ecommerce Platform
The share of orders sitting in each order status, the single view that shows where work is piling up and where money is leaking.

At a glance

OpenCart moves every order through a sequence of statuses (Pending, Processing, Shipped, Complete, Cancelled, Refunded, Failed and any custom ones a merchant adds). This donut breaks the window’s orders down by status share. It is the fastest read on operational health: a fat Pending slice means fulfilment is backing up, a growing Refunded slice means product or expectation problems, a rising Failed slice means checkout is breaking. There is no alert, because the healthy mix is store-specific, but the shape of the donut is diagnostic at a glance.

Calculation

Worked example

An Italian kitchenware merchant on OpenCart 3.0 reviews the 30-day window 14 May 26 to 12 Jun 26. They have kept the default statuses and added one custom status, Awaiting Stock. What’s interesting here:
  1. The Complete slice at 56 percent is the headline of a healthy store. Most orders reach a terminal, fulfilled state. The Processing and Shipped slices together (30 percent) are the work-in-progress that will mostly roll into Complete. A donut dominated by Complete and in-flight statuses is the shape you want.
  2. The Awaiting Stock slice is the custom-status payoff. Because OpenCart lets merchants define their own statuses, this store can see 60 orders held specifically because of inventory. A generic platform would bury those in Pending. The donut respects the merchant’s own operational vocabulary, which makes it far more actionable.
  3. Pending at 7 percent is worth a glance, not a panic. Some pending is normal (bank transfer awaiting payment, fresh orders not yet picked up). A pending slice that grows week over week is the early sign of a fulfilment backlog; pair with Order Processing Backlog.
  4. Refunded plus Cancelled plus Failed is 4 percent combined, which is healthy. Each is a separate card with its own diagnosis, but the donut is where you first notice if one of them is fattening. A jump in the Refunded slice points at product or expectation issues; a jump in Failed points at checkout or gateway problems.
  5. The mix is store-specific, so there is no alert. A bank-transfer-heavy store carries a large Pending slice permanently and that is fine. The value is in watching the shape change over time, not in comparing your donut to anyone else’s.

Sibling cards merchants should reference together

Reconciling against OpenCart

Where to look in OpenCart admin: Sales → Orders, with the Order Status filter, lets you count orders in each status for a date range. System → Localisation → Order Statuses is where the status list itself is defined, renamed, and extended. Reports → Sales → Orders can group totals by status for a periodic view. The underlying data is order_status_id on oc_order, the status names in oc_order_status, and the transition log in oc_order_history. Other OpenCart views that look like the same number but are not:
  • Sales → Orders default list: hides order_status_id = 0 (missing) orders, so the on-screen total can be smaller than the donut if missing orders are included.
  • Reports → Sales: usually reports confirmed-sales statuses only and excludes Failed, Missing, and sometimes Cancelled.
  • Dashboard order tile: typically a single confirmed-order count, not a status breakdown.
Why our number may legitimately differ: Cross-connector note: when a payment processor is connected, the Failed and Refunded slices should correspond to the processor’s declines and refunds. If the donut shows refunds the processor does not, a refund was recorded in OpenCart without being pushed to the gateway, which is a reconciliation flag worth chasing.

Known limitations / merchant FAQs

Why do my statuses not match the defaults you list? Because OpenCart statuses are merchant-configurable. Stores rename, add, and remove them under System → Localisation → Order Statuses. The donut reads your configured statuses, so a custom status like Awaiting Stock or Ready for Pickup will appear as its own slice. Does the donut show current status or status history? Current status only. Each order contributes one slice, its status right now. The full path an order took through statuses lives in oc_order_history and is not what this card draws. My Pending slice is large, is that a problem? Not necessarily. A bank-transfer-heavy or quote-driven store carries a permanently large Pending slice and that is fine. The signal is a slice that grows week over week, which points to a fulfilment or payment backlog. Pair with Pending Orders. Why are there no missing orders in my donut? Missing orders (order_status_id = 0, unconfirmed checkouts) are shown or folded depending on configuration. If you want them visible, enable them in the card settings; if the donut looks short of your total order count, missing orders are likely being folded. Why is there no alert on this card? Because the healthy mix is store-specific. A fixed threshold on any one slice would mislead some stores. The donut is a diagnostic shape; the slice-level alarms live on the dedicated cards (Failed, Refund Rate, Backlog). The Refunded slice grew, where do I dig? Move to Refund Rate for the trend, then look at which products drive it. A fattening Refunded slice usually points to a product quality or expectation issue rather than a payment one. Why does my admin order list total differ from the donut total? Most often because the admin default list hides missing orders while the donut can include them, and because the donut may sum multiple stores. Filter the admin for all statuses and the right store to reconcile.

Tracked live in Vortex IQ Nerve Centre

Order Status Distribution 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.