Sum of order.total where status in [completed, processing]. The morning question every WP merchant opens with.
At a glance
Headline gross revenue across every WooCommerce order placed in the period. The arithmetic sum oforder.totalfor orders whose status iscompletedorprocessing, fetched fromGET /wp-json/wc/v3/ordersand indexed nightly.
| What it counts | SUM(order.total) WHERE status IN ('completed', 'processing'). Each order contributes its post-tax, post-shipping, post-discount customer-billed total. |
| REST API endpoint | GET /wp-json/wc/v3/orders (or wc/v3/reports/sales for the merchant-side dashboard view). Field used: total (string-typed decimal, currency in currency field). |
| VAT / tax treatment | Always tax-inclusive on the wire. WooCommerce stores total as the post-tax customer-billed figure regardless of how the WC tax setting (woocommerce_prices_include_tax) is configured. The separate total_tax field gives the breakdown. The card sums total blindly. |
| Status filter | Includes completed and processing. EXCLUDES pending, on-hold, failed, cancelled, refunded, trash. This matches the standard WC reports definition. on-hold (payment-pending) is the most common exclusion that surprises merchants, see On-Hold Orders for that view. |
| Shipping | Included. order.total already contains total_shipping. |
| Discounts | Already deducted. order.total is the post-discount, customer-billed figure. discount_total and discount_tax are stored separately. |
| Refunds | NOT deducted. WC stores refunds as separate refund objects under /wp-json/wc/v3/orders/{id}/refunds; order.total does NOT change after a refund is processed. A fully refunded 100 here. For the post-refund view watch Refund Value Trend. |
| Cancelled / failed orders | Excluded (see status filter). cancelled and failed are not summed. |
| Currency | Multi-currency depends on the WC plugin configuration. Out-of-the-box WC is single-currency. Plugins like WooCommerce Multi-Currency, CURCY, or Aelia Currency Switcher store an alternate currency on each order; this card sums total arithmetically without FX, so a multi-currency store will get a mixed-units number. Filter by currency for accurate per-currency totals. |
| Self-hosted vs managed-Woo | This card works the same whether the store runs on a self-hosted LAMP stack, WordPress.com Business plan, or a managed-Woo host (Woo.com Cloud, WP Engine, Pressable, Kinsta). Self-hosted servers introduce a sync-lag risk if the host falls over (see Reconcile section); managed hosts have stable uptime. |
| Time window | T/7D/30D vsP (default 30D vs the prior 30D) |
| Alert trigger | drop >15% vsP, driven by sentiment_key: revenue_trend |
| Roles | owner, marketing, finance |
Calculation
Calculated automatically from your WooCommerce data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A UK fashion brand running on self-hosted WooCommerce 8.6 with the Stripe Gateway plugin and a small marketplace integration via WooCommerce Amazon Connector. The 30-day window covers 14 Mar 26 to 12 Apr 26.| Status | Order count | Sum of order.total | Counts in this card? |
|---|---|---|---|
completed | 1,840 | £172,420 | Yes |
processing (paid, awaiting fulfilment) | 312 | £29,760 | Yes |
on-hold (payment pending, BACS / cheque) | 88 | £8,140 | No |
pending (cart abandonment skeleton) | 240 | £21,800 | No |
failed (gateway declined) | 71 | £6,720 | No |
cancelled (merchant or customer cancelled) | 34 | £3,160 | No |
refunded (status flipped post-refund) | 19 | £1,810 | No |
| Total Revenue (this card) | 2,152 | £202,180 |
- The
order.totalcolumn forrefundedis non-zero. WC does not zero out the order total when a refund is processed. The original total stays in place; refund objects are stored separately under/orders/{id}/refunds. This card excludesrefundedorders from the sum (because of the status filter), but if the merchant changes the status filter to “all paid” they will inadvertently include refunded order totals at their original gross value. This is the most common Woo accounting confusion. on-holdis £8,140 of revenue limbo. On-hold typically means BACS / direct-bank-transfer or a manual gateway awaiting confirmation. It is the Woo equivalent of BigCommerce’sIncompletestatus. If the merchant ships before the bank transfer clears, that £8,140 is risk. The card does not include it; track it via On-Hold Orders.- Self-hosted server uptime matters. This brand’s host had a 4-hour outage on 2 Apr 26 between 03:00 and 07:00 UTC. The Vortex IQ indexer could not reach the WC REST API during that window, so 14 orders worth £1,820 only appeared in the index 6 hours late. For a 30-day window this is noise, but for a daily figure the gap is visible. Managed-Woo hosts (Woo.com Cloud, WP Engine) rarely show this pattern.
- The Amazon Connector adds 92 orders worth £6,440. These orders enter WC with
created_via = "amazon"(custom plugin meta). They are summed here without distinction. To slice marketplace from web revenue, use Marketplace Drift, which compares Woo-stored marketplace revenue against the marketplace’s own dashboard. - The 30-day prior window was £208,540. Total Revenue is down 3.05% vsP, well below the
drop >15% vsPalert threshold. Vortex IQ Nerve Centre stays quiet, but the card itself shows the trend and the merchant can drill into Revenue Trend for the daily curve.
Sibling cards merchants should reference together
| Card | Why pair it with Total Revenue |
|---|---|
| WC Average Order Value | Total Revenue divided by Order Count. Tells you whether revenue moved on volume or basket size. |
| WC Total Orders | The other half of the equation. Flat orders with rising revenue means basket size grew. |
| WC On-Hold Orders | The biggest hidden gap on Woo. On-hold revenue is excluded here but represents real customer intent (BACS, bank transfer). Persistent on-hold piles signal payment-method friction. |
| WC Refund Value Trend | This card is gross of refunds (refunds are stored as separate objects). Pair to see post-refund leakage. |
| WC Failed Order Rate | Orders that hit failed status are excluded here but indicate gateway / payment friction. A rising failed rate caps growth even if Total Revenue looks healthy. |
| BC Total Revenue | Same tax-inclusive total_inc_tax semantics as Woo’s total. Useful for agencies running multi-platform book. |
| Shopify Total Revenue | SaaS-platform peer for cross-platform agencies. |
| Stripe Total Revenue | When the WooCommerce Stripe Gateway plugin is connected, Stripe should match Woo Total Revenue minus PayPal minus manual payments. Cross-check for processor reconciliation. |
Reconciling against the vendor’s own dashboard
Where to look in WooCommerce Admin: WP Admin → WooCommerce → Reports → Orders → Sales by date. Set the same window (default 30D), and look at Gross sales for the closest match to this card. WC’s “Net sales” column subtracts refunds so it reads lower. Other WP Admin views that look like the same number but are not:- WP Admin → WooCommerce → Home → Stats overview: shows a 7D / 30D figure but uses the WC Analytics module (a separate engine introduced in WC 4.0 with different status filtering). It typically matches this card on stores running WC 4.0+ but can diverge on legacy reports.
- WP Admin → Analytics → Revenue (WC 4.0+): this matches Net revenue, post-refund. Lower than this card.
- Stats widget on the WP Admin dashboard: today only, in WP site timezone (
wp_timezone_string()). - Any WC reports plugin (WPDataTables, Metorik, Putler): each plugin defines status filters differently. Verify the filter set.
| Reason | Direction of divergence |
|---|---|
| Time-zone. WC reports run on WordPress site timezone (set in Settings → General → Timezone); Vortex IQ runs on UTC by default. Orders near midnight on the boundary days fall on different sides. | +/- 1 day’s revenue at the boundary |
| Self-hosted server uptime. If the WP host suffered an outage during the indexer poll, the most recent orders may be missing for up to 24 hours. Self-hosted Woo on shared hosting (Bluehost, GoDaddy) shows this most often; managed hosts (Woo.com Cloud, WP Engine, Pressable, Kinsta) are far steadier. | Ours temporarily lower; self-resolves at next sync |
Plugin-version compatibility. WC core occasionally changes the meta keys for things like _order_total or discount_total. A merchant on WC 6.x with a legacy custom plugin may see odd field shapes. The Vortex IQ Woo engine targets WC REST API v3 (WC 3.5+), but custom-stored fields can drift. | Either; investigate per-merchant if persistent |
| Refund-object aggregation. WC stores refunds as child posts under the parent order. Some third-party reports plugins net them out; this card does not. | Ours higher than any “net” view |
Currency plugin behaviour. CURCY / Aelia / WMC store the converted total in custom meta and the base-currency total in order.total. Vortex IQ reads order.total, the merchant’s report may show converted figures. | Material for multi-currency stores |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
stripe.stripe_total_revenue | Stripe <= WC Total Revenue | Stripe sees only charges routed through the WC Stripe Gateway plugin. PayPal, BACS, cheque, COD, gift-card, and manual orders are invisible to Stripe. The right comparison: Stripe ~= this card minus PayPal volume minus on-hold awaiting BACS. |
paypal.pp_total_volume | PayPal <= WC Total Revenue | PayPal sees only PayPal-checkout orders. Subset by definition. |
google_analytics.ga_revenue_trend | GA4 ~= WC Total Revenue x (1 minus tracking gap) | GA4 typically misses 10 to 25% of orders due to ad-blockers, cookie rejection, and tag-fire failures. Treat WooCommerce as the source of truth for revenue. |
Known limitations / merchant FAQs
Does it matter whether my Woo store is self-hosted or on WordPress.com / managed Woo? For the number itself, no, the REST API is the same and this card pullsorder.total regardless. For data freshness, yes. Self-hosted Woo on shared hosting can suffer 99.5% uptime (~3.6 hours of downtime a month), and during those gaps the indexer cannot reach the API. Managed Woo (Woo.com Cloud, WP Engine, Pressable, Kinsta) typically runs 99.95%+ uptime. WordPress.com Business and Commerce plans are equally steady. If you see periodic gaps in Revenue Trend, check your host status page first.
Why does this card exclude on-hold?
On-hold means the customer has placed the order but the payment has not been captured: BACS, direct bank transfer, cheque, or a manual gateway awaiting confirmation. Including it would inflate revenue with money that may never arrive. The Woo standard for “real” revenue is completed + processing. Track on-hold separately via On-Hold Orders, it is the Woo equivalent of BC’s Incomplete status. A persistent on-hold pile above 5% of orders signals a payment-method UX problem (BACS friction, gateway timeout).
My WooCommerce refunds page shows different numbers, why?
Because Woo stores refunds as separate child posts under the parent order, not as a deduction from order.total. WC’s Refunds report sums refund objects; this card sums original order totals. To get a “post-refund” view, subtract Refund Value Trend from this card. The most common merchant accounting confusion is treating order.total as net of refunds, it is not, ever, on Woo.
My Woo Analytics module shows a different total, what should I trust?
WC 4.0+ ships with the Analytics module which uses a separate wc_order_stats table and can apply different status filters and date logic (it can also include on-hold in some report views). For the canonical “money the customer was billed” figure, this card is the reference. For a “money realised” figure, look at WC Analytics → Revenue, which is post-refund.
A plugin is changing the data shape on my orders, what do I do?
Woo’s plugin ecosystem is its biggest strength and biggest weakness for analytics. Subscriptions plugins, multi-currency plugins, points-and-rewards plugins, B2B plugins, and tax plugins all add custom meta and sometimes overload order.total semantics. The Vortex IQ Woo engine reads the canonical order.total field. If your store uses a plugin that stores the “true” total in custom meta (e.g. WooCommerce Subscriptions stores recurring totals in _subscription_recurring_total), reach out to support@vortexiq.ai so the engine can be extended for your shape.
Why is my Stripe number different from this card?
The WooCommerce Stripe Gateway plugin sees only Stripe-routed charges, not PayPal, not BACS, not COD, not manual offline payments, not gift cards. Stripe will always be <= WC Total Revenue. Typical splits: Stripe ~70-85%, PayPal ~10-20%, BACS / manual ~5-10%. If Stripe reads ~50% of WC, you have a substantial off-Stripe payment mix and should connect PayPal too.
Why does today’s number jump up and down so much?
Today is incomplete data. Orders add into the bucket as the day progresses, and as midnight rolls past some orders flip date because of WP-site-timezone-vs-UTC effects. Use the rolling 7-day or 30-day view for stable numbers, that is why the alert window is 30D vsP and not 1D. If you need a daily-only view, Revenue Trend gives the daily curve.
Self-hosted server slowness made yesterday’s number lower, when does it catch up?
The Vortex IQ Woo indexer polls hourly by default. If the WP host was slow or unreachable, missing orders are picked up on the next successful poll, usually within 1 to 3 hours. Persistent gaps (multi-day) suggest the indexer credentials have expired (consumer key/secret rotated by the merchant) or the host has IP-blocked the indexer. Check WooCommerce → Settings → Advanced → REST API and verify the Vortex IQ key is still listed.
My WP Admin shows a different number from this card, debug playbook:
- Confirm the same date window in both views, WC reports default to “this month” while this card defaults to rolling 30D.
- Confirm the status filter, change WC reports to include only
completed + processingto match this card. - Confirm the timezone, this card runs on UTC, WC reports run on WP-site timezone. For a 30-day window the gap should be < 1%.
- Confirm the refund treatment, WC’s Net sales subtracts refunds, this card does not. Use Gross sales for the apples-to-apples view.
- If gap > 2% after all four checks, contact support, likely a plugin overloading
order.totalor a sync gap.