Skip to main content
Card class: HeroCategory: Ecommerce Platform
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 countsTotal 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 treatmentOpenCart’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.
ShippingIncluded in the order total by default, OpenCart adds the shipping total line into the order total.
DiscountsAlready deducted. Coupon and discount total lines reduce the order total before it is stored, so AOV reflects the post-discount basket.
RefundsNot 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 ordersDepends on the status filter. By default Cancelled and Failed orders are excluded from the revenue and count so they do not deflate AOV.
CurrencyMulti-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 window30D vsP (default 30 days vs prior period)
Alert triggerdrop > 10% vsP
Rolesowner, finance, marketing

Calculation

SUM(order_total)
  WHERE date BETWEEN [period_start, period_end]
    AND order_status IN [revenue_statuses]
/ COUNT(orders)
  WHERE date BETWEEN [period_start, period_end]
    AND order_status IN [revenue_statuses]

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.
PeriodOrder revenueOrdersAOV
Prior 30 days (12 Feb to 13 Mar 26)GBP 184,5002,050GBP 90.00
First half (14 to 28 Mar 26, no coupon)GBP 92,0001,030GBP 89.32
Second half (29 Mar to 12 Apr 26, coupon live)GBP 110,4001,150GBP 96.00
Full windowGBP 202,4002,180GBP 92.84
What’s interesting here:
  1. 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% vsP trigger. The card stays green and the trend line ticks up.
  2. 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.
  3. 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.
  4. 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

CardWhy 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 VolumeThe other half of the equation. Flat AOV with rising orders means growth came from volume, not basket.
Cancellation RateExcluded orders shape the average. A rise in cancellations can flatter AOV by removing low-value baskets.
Refund RateAOV does not net out refunds. A high refund rate means realised AOV is lower than the card shows.
Repeat Customer RateRepeat buyers usually spend more per order. A rising repeat rate often pulls AOV up with it.
Orders to Email AttributionEmail-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.
Why our number may legitimately differ from the OpenCart admin:
ReasonDirection 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
Cross-connector note: if you run a payment connector (for example Stripe or PayPal), the processor’s average transaction size should be close to AOV but not identical, the processor sees only captured payments and nets refunds differently. Treat OpenCart as the source of truth for AOV and use the processor view as a sanity check.

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 on oc_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.

Tracked live in Vortex IQ Nerve Centre

Average Order Value 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.