> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Cancellation Rate, OpenCart

> Share of orders that end up in a Cancelled status on your OpenCart store. Tracked live in Vortex IQ Nerve Centre. How to read it, why it matters, and how to act on it.

**Card class:** [Standard](/nerve-centre/overview#card-classes-explained)  •  **Category:** [Ecommerce Platform](/nerve-centre/connectors#connectors-by-type)

> 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](/nerve-centre/kpi-cards/opencart/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

```
COUNT(orders) WHERE order_status IN [cancelled_statuses]
  AND date BETWEEN [period_start, period_end]
/ COUNT(orders) WHERE date BETWEEN [period_start, period_end]
* 100
```

## 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               | -                 |

What's interesting here:

1. **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.
2. **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](/nerve-centre/kpi-cards/opencart/stock-out-burst) that fired earlier in the window when a feed wrote bad quantities.
3. **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.
4. **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](/nerve-centre/kpi-cards/opencart/refund-rate)                             | The sibling downside metric. Cancellations happen before fulfilment; refunds after. Together they bound your order-fallthrough.             |
| [Failed Orders (24h)](/nerve-centre/kpi-cards/opencart/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](/nerve-centre/kpi-cards/opencart/order-status-distribution) | Shows the full status mix so you can see whether cancellations are rising at the expense of completions.                                    |
| [Stock-Out Burst](/nerve-centre/kpi-cards/opencart/stock-out-burst)                     | Oversold stock is a leading cause of cancellations. A burst here often precedes a cancellation spike.                                       |
| [Order Processing Backlog](/nerve-centre/kpi-cards/opencart/order-processing-backlog)   | A long backlog leads to slipped delivery promises and customer-initiated cancellations.                                                     |
| [Revenue at Risk (live)](/nerve-centre/kpi-cards/opencart/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.

**Why our number may legitimately differ from the OpenCart admin:**

| 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        |

**Cross-connector note:** if you run a payment connector, a payment-side void or chargeback may register there but appear in OpenCart only when staff manually move the order to Cancelled. A gap between processor voids and OpenCart cancellations usually means the manual status update is lagging.

<details>
  <summary><em>Same-metric documentation cross-reference (for agencies running multiple platforms)</em></summary>

  The same definition of Cancellation Rate lives on other commerce platforms. This is **not a reconciliation**, your OpenCart store has no parallel store elsewhere to compare against. These links help agencies running multi-platform client books navigate between identical metrics across the docs.

  * [`shopify.cancellation_rate`](/nerve-centre/kpi-cards/shopify/cancellation-rate)
  * [`bigcommerce.cancellation_rate`](/nerve-centre/kpi-cards/bigcommerce/cancellation-rate)
</details>

## 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](/nerve-centre/kpi-cards/opencart/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)](/nerve-centre/kpi-cards/opencart/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 in `oc_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.

***

### Tracked live in Vortex IQ Nerve Centre

*Cancellation Rate* 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](https://app.vortexiq.ai/login) or [book a demo](https://www.vortexiq.ai/contact-us) to see this metric running on your own data.
