The percentage of orders in a Cancelled status over the window, a direct read on how often confirmed orders fall through before fulfilment.
At a glance
Cancellation Rate is the share of orders that ended up in a Cancelled status during the window, expressed as a percentage of all orders in that window. It is a health gauge for the gap between “order placed” and “order fulfilled”. A creeping cancellation rate usually points at a specific, fixable cause: stock that was oversold, a payment method that authorises but fails to capture, a fraud-screening rule that is too aggressive, or customers changing their minds because delivery promises slipped.
| What it counts | Orders whose order_status_id maps to a Cancelled status, divided by the total order count over the window, as a percentage. |
| Status treatment | OpenCart statuses are configurable in oc_order_status. The gauge keys on the status(es) you have mapped as “Cancelled”, not on a hard-coded name. Stores that distinguish “Cancelled” from “Voided” or “Failed” can map each appropriately. |
| Refunds | A Refunded order is usually a different status from Cancelled in OpenCart. This gauge counts Cancelled only; refunds are tracked by Refund Rate. |
| Failed orders | Orders that never completed payment are typically Failed, a separate status. They are counted here only if you have mapped Failed into the Cancelled set. |
| Currency | Not relevant. This is a ratio of order counts, so multi-currency stores are unaffected. |
| Denominator | All orders in the window across the configured statuses. A narrow denominator (excluding incomplete orders) raises the apparent rate; a wide one lowers it. |
| Multi-store | Aggregates across store_id storefronts by default. |
| Time window | 30D vsP (default 30 days vs prior period) |
| Alert trigger | > 3% |
| Roles | owner, operations |
Calculation
Worked example
A Malaysian electronics store on OpenCart 4.x. The 30-day window covers 14 Mar 26 to 12 Apr 26. The store maps “Cancelled” as its own status, separate from “Refunded” and “Failed”.| Period | Total orders | Cancelled orders | Cancellation rate |
|---|---|---|---|
| Prior 30 days | 3,100 | 56 | 1.8% |
| This window (full) | 3,240 | 117 | 3.6% |
| of which: oversold stock | - | 71 | - |
| of which: customer changed mind | - | 28 | - |
| of which: suspected fraud, staff-cancelled | - | 18 | - |
- The rate doubled and tripped the alert. At 3.6% the window is over the 3% trigger and up from 1.8% prior. Something changed inside the window, and the breakdown points straight at it.
- Oversold stock is the dominant cause. 71 of the 117 cancellations were staff-cancelled because the item was not actually in the warehouse when the order arrived. That is a stock-accuracy problem, and it links directly to a Stock-Out Burst that fired earlier in the window when a feed wrote bad quantities.
- Cancelled is not the same as Refunded. None of these 117 are in the refund numbers, because this store maps the two statuses separately. A merchant who lumped them together would double-count the financial impact.
- The fix is upstream of the order. Tightening stock accuracy (better feed validation, a buffer on fast-movers) cuts the 71 oversold cancellations directly. The 28 changed-mind cancellations are largely irreducible; the 18 fraud cancellations are arguably a good outcome, not a problem.
Sibling cards merchants should reference together
| Card | Why pair it with Cancellation Rate |
|---|---|
| Refund Rate | The sibling downside metric. Cancellations happen before fulfilment; refunds after. Together they bound your order-fallthrough. |
| Failed Orders (24h) | Failed orders that never paid are distinct from cancellations of paid orders. Pair to separate payment failures from genuine cancellations. |
| Order Status Distribution | Shows the full status mix so you can see whether cancellations are rising at the expense of completions. |
| Stock-Out Burst | Oversold stock is a leading cause of cancellations. A burst here often precedes a cancellation spike. |
| Order Processing Backlog | A long backlog leads to slipped delivery promises and customer-initiated cancellations. |
| Revenue at Risk (live) | Puts a value on the orders that may yet cancel. |
Reconciling against OpenCart
Where to look in the OpenCart admin: Sales → Orders, filtered to your Cancelled status for the date range, gives the numerator; the same view with no status filter gives the denominator. Reports → Sales → Orders breaks down totals by status, which is the quickest way to see the cancelled count alongside the total. OpenCart admin views that look like the same number but aren’t:- Sales → Orders filtered to Cancelled is a count, not a rate. You must divide by total orders yourself.
- Reports → Sales → Orders by status can blend Cancelled, Refunded, and Failed if those statuses are similarly named; check the exact status IDs.
- The Dashboard shows no cancellation figure at all.
| Reason | Direction of divergence |
|---|---|
| Status mapping. If your store has both “Cancelled” and “Voided” (or “Cancelled - Reversed”), which ones count depends on the mapping. A mismatch with your admin filter changes the numerator. | Either direction |
| Denominator scope. OpenCart often creates a Pending/Missing-Orders skeleton for abandoned checkouts. Whether those count in the denominator shifts the rate noticeably. | Wider denominator lowers the rate |
| Timezone. Store timezone in the admin vs UTC in Vortex IQ moves boundary orders between windows. | Minor at the edges |
Multi-store. All store_id storefronts aggregate by default; a single-store admin filter will differ. | Either direction |
| API / DB sync lag. A very recent cancellation may not yet be reflected. | Self-resolves at next sync |
Known limitations / merchant FAQs
Is a cancellation the same as a refund? Not in OpenCart, unless you have mapped them to the same status. A cancellation typically happens before fulfilment and money is voided rather than returned; a refund happens after payment was captured. This gauge counts only your Cancelled status. Refunds are on Refund Rate. Why is 3% the alert line? For most stores a steady-state cancellation rate sits comfortably below 3%; crossing it usually signals a specific cause (oversold stock, a payment-capture fault, an over-tight fraud rule) rather than random variation. High-consideration or made-to-order stores may sit higher naturally and should tune the threshold up. My rate looks high but I think the denominator is wrong. That is common. OpenCart can create order skeletons for abandoned or failed checkouts, and whether those land in the denominator changes the rate a lot. Check which statuses are included in the total, the most frequent cause of a “too high” reading is a denominator that excludes incomplete orders. Staff cancel a lot of suspected-fraud orders, does that hurt my number? It raises the rate, but it is often a healthy signal, you caught fraud before shipping. Read the cancellation rate alongside why orders cancelled. A high rate driven by fraud prevention is very different from one driven by oversold stock. Does it count Failed (never paid) orders? Only if you mapped Failed into the Cancelled set. By default Failed is a separate status tracked by Failed Orders (24h). Keep them separate so you can tell payment failures from genuine cancellations. My status is called “Voided”, not “Cancelled”, does the gauge work? Yes, as long as you map “Voided” into the cancelled-status set. OpenCart status names are fully configurable inoc_order_status; the gauge keys on the mapping, not the label.
Why use 30 days vs prior rather than a live count?
Cancellations are lumpy, one bad stock feed can cluster them. The 30-day-vs-prior comparison shows whether the rate is genuinely trending or just had a noisy week, which is why the alert is evaluated on the rolling window.