Average revenue per order over the window, total order revenue divided by order count, the cleanest read on basket size.
At a glance
Average Order Value is total order revenue divided by the number of orders in the window. It is the single best indicator of how much each customer spends per purchase, and it moves on three levers: price, units per order, and discounting. A rising AOV on flat order volume means baskets are getting bigger; a falling AOV often means a discount is doing the heavy lifting. Because OpenCart order totals are configurable (the order total lines are extension-driven), exactly what lands in “revenue” depends on which total extensions your store runs.
| What it counts | Total order revenue over the window divided by the count of orders in the same window. Order totals are read from oc_order (the order total) across the configured order statuses. |
| VAT / tax treatment | OpenCart’s order total is built from total lines (sub-total, shipping, tax, discount) configured under Extensions → Order Totals. By default the order total is tax-inclusive. If your store separates tax as its own line, it is included in the order total unless your configuration excludes it. |
| Shipping | Included in the order total by default, OpenCart adds the shipping total line into the order total. |
| Discounts | Already deducted. Coupon and discount total lines reduce the order total before it is stored, so AOV reflects the post-discount basket. |
| Refunds | Not deducted. A refund in OpenCart is typically handled via an order status change (Refunded) rather than by rewriting the stored order total, so a refunded order still contributes its original total to the average. |
| Cancelled orders | Depends on the status filter. By default Cancelled and Failed orders are excluded from the revenue and count so they do not deflate AOV. |
| Currency | Multi-currency stores store each order in its placed currency on oc_order. Without FX normalisation the average mixes currencies; use a single-currency view for clean numbers. |
| Time window | 30D vsP (default 30 days vs prior period) |
| Alert trigger | drop > 10% vsP |
| Roles | owner, finance, marketing |
Calculation
Worked example
A UK auto-parts store on OpenCart 4.x. The 30-day window covers 14 Mar 26 to 12 Apr 26. The store runs the standard sub-total, shipping, coupon, and tax order-total extensions. Mid-window it launches a “free shipping over GBP 75” coupon to lift basket size.| Period | Order revenue | Orders | AOV |
|---|---|---|---|
| Prior 30 days (12 Feb to 13 Mar 26) | GBP 184,500 | 2,050 | GBP 90.00 |
| First half (14 to 28 Mar 26, no coupon) | GBP 92,000 | 1,030 | GBP 89.32 |
| Second half (29 Mar to 12 Apr 26, coupon live) | GBP 110,400 | 1,150 | GBP 96.00 |
| Full window | GBP 202,400 | 2,180 | GBP 92.84 |
- AOV rose 3.2% vsP, comfortably above the alert floor. The window AOV of GBP 92.84 against a prior GBP 90.00 is a healthy lift, nowhere near the
drop > 10% vsPtrigger. The card stays green and the trend line ticks up. - The free-shipping threshold did its job. Second-half AOV jumped to GBP 96.00 because shoppers added an item to clear the GBP 75 free-shipping bar. The coupon nudged basket composition without cutting price, the most margin-friendly way to lift AOV.
- Order count rose too, so the lift is real. AOV can be gamed by suppressing small orders, but here both revenue and order count grew. The store sold more orders and bigger ones, which is the outcome you want.
- Watch the shipping line, not just the headline. Because shipping is inside the order total, giving it away free changes the composition of AOV even as the number rises. Pair with a shipping-cost view to confirm the margin still works after free shipping is factored in.
Sibling cards merchants should reference together
| Card | Why pair it with Average Order Value |
|---|---|
| Total Revenue (30d) | AOV times order volume reconstructs revenue. If revenue moved, AOV tells you whether it was basket size or order count. |
| Order Volume | The other half of the equation. Flat AOV with rising orders means growth came from volume, not basket. |
| Cancellation Rate | Excluded orders shape the average. A rise in cancellations can flatter AOV by removing low-value baskets. |
| Refund Rate | AOV does not net out refunds. A high refund rate means realised AOV is lower than the card shows. |
| Repeat Customer Rate | Repeat buyers usually spend more per order. A rising repeat rate often pulls AOV up with it. |
| Orders to Email Attribution | Email-driven orders often carry a different basket profile; comparing AOV by source shows which channel sells bigger baskets. |
Reconciling against OpenCart
Where to look in the OpenCart admin: Reports → Sales → Orders gives total revenue and order count for a date range; AOV is the former divided by the latter. There is no built-in “AOV” tile in core OpenCart, so you compute it from the sales report. Sales → Orders lets you filter by status and date to count orders directly. OpenCart admin views that look like the same number but aren’t:- Reports → Sales → Orders “Total” is gross revenue, not an average. Divide it by the order count yourself.
- The Dashboard sales chart shows revenue over time, not per-order revenue.
- Sales → Orders count depends entirely on which statuses you include in the filter, change the filter and the denominator changes.
| Reason | Direction of divergence |
|---|---|
| Timezone. OpenCart reports use the store timezone (System → Settings); Vortex IQ uses UTC by default. Boundary-day orders fall on different sides, nudging both numerator and denominator. | Minor at the edges |
Multi-store. Orders aggregate across all store_id values by default. An admin report filtered to one store will differ. | Either direction |
| Multi-currency without FX. OpenCart admin can show a converted figure; Vortex IQ averages original-currency totals without FX. | Material for international stores |
| Order status filtering. The admin total depends on the statuses you select; the card uses its configured revenue-status set. If they disagree, both the sum and the count differ. | Either direction |
| Refund handling. OpenCart refunds via status change, not by editing the stored total. Both the admin report and this card therefore include the original total of a refunded order unless you exclude that status. | Both can overstate realised AOV |
| API / DB sync lag. Recent orders may not yet be reflected in Vortex IQ. | Self-resolves at next sync |
Known limitations / merchant FAQs
Does AOV include shipping and tax? By default, yes. OpenCart builds the order total from configurable total lines (sub-total, shipping, tax, discount) and the stored order total is what this card averages. If your store excludes a line via its Order Totals configuration, that line is excluded here too. Does it net out refunds? No. OpenCart records a refund as an order status change rather than by rewriting the stored total, so a refunded order still contributes its original total to the average. Pair with Refund Rate to understand realised AOV. My AOV jumped but revenue is flat, what happened? Order count probably fell. AOV is revenue divided by orders; if the numerator holds while the denominator shrinks, the average rises even though the business did not grow. Always read AOV next to Order Volume. Why does a discount sometimes raise AOV and sometimes lower it? A threshold discount (“free shipping over GBP 75”) raises AOV by pushing shoppers to add items. A flat percentage-off coupon lowers the stored total per order and can drag AOV down. The lever matters more than the discount itself. How are Cancelled and Failed orders treated? By default they are excluded from both the revenue sum and the order count, so they neither inflate nor deflate AOV. If your status configuration includes them, expect a lower average. My multi-currency store shows a strange AOV, why? Without FX normalisation the average mixes currencies stored onoc_order. A store taking GBP and EUR produces a meaningless blended number. Use a single-currency view; per-currency AOV is on the OpenCart roadmap.
Why does the alert use 30 days and not today?
A single day’s AOV is volatile, one large B2B order can swing it. The 30-day-vs-prior window smooths that out, which is why the drop > 10% vsP trigger is evaluated on the rolling window rather than on a daily figure.