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.
| What it shows | Order count per status for the window, displayed as shares of a donut. |
| Statuses are configurable | OpenCart order statuses are merchant-editable under System → Localisation → Order Statuses. Stores rename, add, and remove statuses freely. The connector reads your configured statuses, not a fixed list. |
| Default statuses | A stock OpenCart install ships Pending, Processing, Shipped, Complete, Cancelled, Refunded, Voided, Denied, Canceled Reversal, Failed, Expired, Processed, Reversed, Chargeback, plus the missing-orders state (order_status_id = 0). |
| Missing orders | Orders with order_status_id = 0 are started-but-unconfirmed checkouts. The card can show or fold these depending on configuration. |
| Current status, not history | The donut reflects each order’s current status, not every status it has passed through. Status history lives in oc_order_history. |
| Multi-store | The mix can be split by store_id in the detail view; the headline donut sums all stores. |
| Currency / tax | n/a, this is a count distribution. For value at risk see Revenue at Risk (live). |
| Time window | 30D (rolling 30 days) |
| Alert trigger | None |
| Roles | owner, operations |
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.| Status | Orders | Share |
|---|---|---|
| Complete | 1,120 | 56% |
| Processing | 360 | 18% |
| Shipped | 240 | 12% |
| Pending | 140 | 7% |
| Awaiting Stock (custom) | 60 | 3% |
| Cancelled | 40 | 2% |
| Refunded | 24 | 1.2% |
| Failed | 16 | 0.8% |
| Order Status Distribution (this card) | 2,000 | 100% |
- 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.
- 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.
- 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.
- 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.
- 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
| Card | Why pair it with Order Status Distribution |
|---|---|
| Pending Orders | Zooms into the Pending slice. A growing slice here is a backlog forming. |
| Processing Orders | The in-flight slice. Read with Pending to see where work sits. |
| Order Processing Backlog | The operational alarm when the early-stage slices swell. |
| Failed Orders (24h) | The Failed slice in a live 24-hour view. |
| Refund Rate | The Refunded slice as a rate over time. |
| Order Volume | The total the donut divides up. Mix means little without knowing the size. |
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 isorder_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.
| Reason | Direction of divergence |
|---|---|
| Custom statuses. OpenCart statuses are merchant-configurable. If a store renames or splits statuses, our donut reflects the configured set, which may not line up with a simple admin label filter. | Either direction |
Missing orders. Whether order_status_id = 0 is shown depends on configuration. An admin default list hides them; the donut can include them. | Vortex IQ higher when missing orders are shown |
| Time zone. OpenCart admin uses the store timezone; Vortex IQ evaluates the window in UTC by default. Boundary orders shift slices slightly. | Boundary effects |
Multi-store. A store_id-filtered admin view shows one store; the donut sums all by default. | Vortex IQ higher than a single-store view |
| Sync lag. Status changes in the last few minutes appear on the next sync. | Self-resolves at next sync |
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 inoc_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.