WooCommerce analytics and reports: what each number counts

WooCommerce shows sales in several places and they do not count the same orders. The Dashboard widget and Analytics follow the date an order was paid and leave out pending, cancelled and failed orders, the old Reports screen follows the date it was created, and Analytics is refreshed only every 12 hours. Decide which statuses and which date mean a sale before you trust any of them.

By Mantas LukošiusSettings and source code last checked on

Same shop, different numbers

  • 4places WooCommerce keeps statistics, counting different ordersWidget, Stats overview, Analytics, old Reports
  • 12 hhow far behind your orders Analytics can beScheduled import, or press Update now
  • 56on-hold orders, €944,566, missing from Analytics until paidTest shop (sample data)

Where to find statistics in WooCommerce

WooCommerce keeps its numbers in four places: a widget on the WordPress Dashboard, the Stats overview on WooCommerce › Home, the Analytics menu, and an older Reports screen that is still there. They are not four views of one report, so they can disagree.

Where each WooCommerce statistics screen lives, from the source of WooCommerce 11.1.2.

Overview

Status widget
Where
Dashboard › WooCommerce Status
What it shows
Net sales this month, top seller this month, orders awaiting processing, orders on hold, low stock and out of stock
Stats overview
Where
WooCommerce › Home
What it shows
Total sales, net sales, orders and items sold for the period, and visitors and views if Jetpack is connected

Reports

Analytics
Where
Analytics
What it shows
Overview, Products, Revenue, Orders, Variations, Categories, Coupons, Taxes, Downloads, Stock and Settings
Customers
Where
WooCommerce › Customers
What it shows
The customer list, which sits outside the Analytics menu
Legacy reports
Where
WooCommerce › Reports
What it shows
An older set: Orders, Customers and Stock tabs, with Sales by date, Sales by product and more
Maintenance
Where
WooCommerce › Status › Tools
What it shows
Clear analytics cache. Scheduled Actions, where the imports run, is under Status as well

What each WooCommerce number counts

Each screen picks its own statuses and its own date. Analytics, and the widget's Net sales that is built on it, count every order except the excluded statuses, and place it on the day it was paid.

Which orders each WooCommerce number counts and which date it uses, from the source of WooCommerce 11.1.2.

Dashboard widget

Net sales this month
Counts
Analytics net sales for the month so far, with the excluded statuses left outThe widget asks Analytics, so it also waits for the import
Dated by
Date paidOr the Date type you set
Awaiting processing, on hold
Counts
Every order now in that status, with no date limit
Dated by
Not dated
Top seller this month
Counts
Completed, processing and on-hold ordersNot the Analytics settings
Dated by
Date created

Analytics and old reports

Revenue and Orders reports
Counts
Every status except Pending payment, Cancelled and FailedA custom status counts unless you exclude it
Dated by
Date paidOr created, or completed
Reports › Sales by date
Counts
Completed, processing, on-hold and refunded orders
Dated by
Date created
The WooCommerce Status widget on the WordPress Dashboard of a test shop: Net sales this month 67,680.76 euro, 144 orders awaiting processing, 56 orders on hold, 2 products low in stock and 52 products out of stock.
The WooCommerce Status widget on a test shop. Awaiting processing and On-hold count every order in that status, whatever its date, while Net sales this month is the Analytics figure for the month so far.

The money columns in Analytics follow one set of definitions, and they add up: Net sales is Gross sales minus Returns minus Coupons, and Total sales is Net sales plus Taxes and Shipping.

What each Analytics Revenue figure means.

Revenue report

Gross sales
What it is
What the items sold for before coupons: order totals without tax and shipping, with the coupon discounts added back
Returns
What it is
The money refunded, shown as a positive number
Coupons
What it is
The discounts customers got with coupon codes
Net sales
What it is
Gross sales minus Returns minus Coupons
Taxes and Shipping
What it is
Collected on the orders in the period
Total sales
What it is
Net sales plus Taxes and Shipping
The same shop, four totals, EUR million
Total

Tap a bar to see its total

€0m€5m€10m€15m€20mEvery order, any statusAnalytics by created dateAnalytics by paid dateCompleted orders onlyDefinition
Show as a table
DefinitionTotal
Every order, any status€19.3m
Analytics by created date€16.6m
Analytics by paid date€15.6m
Completed orders only€13.5m

A test shop with 1,280 orders and 40 refunds over twelve months: 1,280, 1,121, 1,065 and 904 orders. Analytics figures are net sales after refunds, with pending, cancelled and failed orders left out.

The three Analytics settings that change your numbers

Open Analytics › Settings and check three things: the excluded statuses, the actionable statuses and the date type. The defaults are a good start for a shop that takes card payments, and a poor fit for one that waits for bank transfers.

The WooCommerce 11.1.2 Analytics settings page: Excluded statuses with Pending payment, Cancelled and Failed ticked and a note that the Refunded status can not be excluded, Actionable statuses with Processing and On hold ticked, a default date range, Date type set to Date paid, and Updates with Scheduled (recommended) selected next to Immediately.
Analytics › Settings on WooCommerce 11.1.2, at the defaults. The excluded and actionable lists are separate: only the first one changes your totals.
  • Excluded statuses are a blacklist. Pending payment, Cancelled and Failed start ticked, and Refunded cannot be excluded. A custom status that a plugin adds is counted until you tick it.
  • Actionable statuses, Processing and On hold by default, only decide which orders appear in the Orders task on WooCommerce › Home. They do not change any total.
  • Date type decides which date puts an order in a day or a month: the date it was created, paid or completed. The default is Date paid.

WooCommerce says the same on the Revenue page: "Revenue is now reported from paid orders. We now collect orders in this table based on when the payment went through, rather than when they were placed. You can change this in settings."

If you take bank transfers or cash on delivery, switch Date type to Date created, so an order counts when it is placed and not when the money arrives.

Why Analytics is up to 12 hours behind your orders

Analytics does not read your order list. It reads its own copy, which a scheduled import refreshes every 12 hours, and the Revenue page says when that last happened and when the next update is due.

The WooCommerce 11.1.2 Analytics Revenue report for six months: a Data status box with a last updated and next update time and an Update now link, then Gross sales, Returns, Coupons, Net sales, Taxes, Shipping and Total sales with a comparison against the previous period.
Analytics › Revenue on a test shop. The Data status box shows the last and the next scheduled update, and Update now asks for the import to start straight away. The figures add up: Gross sales 7,657,697 minus Returns 110,996 minus Coupons 95,418 is Net sales 7,451,284.

The settings page describes the two options itself. Scheduled "updates automatically every 12 hours. Lowest impact on your site", and Immediately "updates as soon as new data is available. May slow busy stores." With Immediately, Analytics is updated each time an order is created, changed or refunded. Update now is only offered in Scheduled mode, and it only starts the import: WordPress's background runner still has to pick it up, so the figures can take a few minutes to move. Whichever mode you use, the reports are cached and the cache is cleared after each import. Orders from before Analytics was switched on are only picked up by Import historical data on the settings page.

WooCommerce numbers not matching: causes and fixes

Common causes of wrong, late or missing WooCommerce statistics, from the source.

Behind or missing

Today's orders are not in Analytics
Cause
Updates is on Scheduled, which refreshes every 12 hours
Fix
Press Update now, or switch Updates to Immediately in Analytics › Settings
Old orders are missing
Cause
Orders from before Analytics was on were never imported
Fix
Run Import historical data in Analytics › Settings
Nothing updates at all
Cause
The imports run through Action Scheduler, and a stuck queue imports nothing
Fix
Look for failed or stuck actions under WooCommerce › Status › Scheduled Actions
Figures still look old after a change
Cause
Reports are cached until the next import
Fix
Use Clear analytics cache under WooCommerce › Status › Tools

Counted differently

On-hold orders are missing from Analytics
Cause
The default Date type is Date paid, and an order with no paid date has no day
Fix
Change Date type to Date created, or count the order once it is paid
A custom status is counted as a sale
Cause
Excluded statuses are a blacklist, so a new status counts until you tick it
Fix
Tick it under Excluded statuses
Analytics is lower than the order list total
Cause
Analytics leaves out pending, cancelled and failed orders and subtracts refunds, and Net sales also leaves out tax and shipping
Fix
Compare Total sales, and filter the order list by status
A refund shows in a different month
Cause
A refund is its own entry, dated the day it was made
Fix
YesExpected: Returns land in the month of the refund
The widget and Analytics disagree
Cause
Net sales uses the paid date, while Top seller uses the created date and its own statuses
Fix
Compare like with like: use Analytics for both

Other

Several currencies in one total
Cause
Analytics adds the order totals as stored, with no conversion
Fix
Report each currency on its own
The widget shows different figures from Analytics
Cause
Analytics is switched off, so the widget falls back to the old report: completed, processing, on-hold and refunded orders by created date
Fix
Switch Analytics back on, or read the old report as the old report

What WooCommerce's reports cannot show

WooCommerce's reports read your own order tables, so they stop at the order. Apart from visitor counts that come from Jetpack, they have no traffic sources, no ad spend, no search data and no automatic comparison with last week or last year. Those questions belong to GA4, Google Ads and Search Console, and the answer to "why did sales change" needs all of them next to the orders.

ManteIQ reads your WooCommerce orders with a read-only REST API key and puts them next to GA4, Google Ads and Search Console in one morning briefing.

See the WooCommerce integration
  • Pick your own list of statuses once, so every figure counts the same orders.
  • Read a count that excludes cancelled, failed and refunded orders, and show refunds on their own.
  • Compare each week with the week before and with last year automatically.

Questions about WooCommerce statistics

Where are the statistics in WooCommerce?
The Dashboard has a WooCommerce Status widget, WooCommerce › Home has a Stats overview, and the Analytics menu has the full reports: Overview, Products, Revenue, Orders, Variations, Categories, Coupons, Taxes, Downloads, Stock and Settings. An older Reports screen is still under WooCommerce › Reports.
Why are my WooCommerce Analytics numbers behind?
Analytics reads its own copy of your orders, and the recommended Scheduled setting refreshes that copy every 12 hours. Press Update now on any Analytics report, or switch Updates to Immediately in Analytics › Settings.
Which order statuses does WooCommerce Analytics count?
All of them except the excluded statuses, which are Pending payment, Cancelled and Failed by default. The Refunded status cannot be excluded, and a custom status counts until you exclude it.
Why are on-hold orders missing from Analytics?
The default Date type is Date paid. An on-hold order that has not been paid has no paid date, so Analytics has no day to put it on. Change Date type to Date created in Analytics › Settings to count it when it is placed.
What does Net sales mean in WooCommerce?
Gross sales minus Returns minus Coupons. Total sales is Net sales plus Taxes and Shipping. In the Dashboard widget, Net sales this month is the Analytics figure for the month so far.
How do I update WooCommerce Analytics for old orders?
Use Import historical data on Analytics › Settings. It reads the orders from before Analytics was switched on. If figures still look wrong afterwards, use Clear analytics cache under WooCommerce › Status › Tools.
Does WooCommerce track where my visitors come from?
No. Its reports cover orders, products, customers and stock, plus visitor counts if Jetpack is connected. Use GA4, Google Ads and Search Console for traffic, ads and search.

Sources

We read the source code of WooCommerce 11.1.2 and checked the behaviour on a local test shop on 1 October 2026, with the same orders counted five ways straight from its database. The figures come from that shop's generated orders and are an example, not an average. Newer releases may differ.

  1. GitHub: WooCommerce 11.1.2 Analytics settings and defaults
  2. GitHub: WooCommerce 11.1.2 Dashboard status widget
  3. GitHub: WooCommerce 11.1.2 Analytics order import
  4. GitHub: WooCommerce 11.1.2 Revenue and Orders data store
  5. GitHub: WooCommerce 11.1.2 legacy Sales by date report
  6. WooCommerce documentation: Analytics
  7. WooCommerce documentation: legacy reports

About the author: Mantas Lukošius

Mantas has worked in ecommerce for more than 15 years, almost all of it on PrestaShop: from his own first shop to business stores and large clients. He builds ManteIQ and its PrestaShop module.

How we write and check these guides

Get the numbers WooCommerce does not give you

Connect WooCommerce and GA4 and ManteIQ sends a morning briefing with orders, traffic and ads side by side. 30 days free, no card, read-only access.

ManteIQ - Sees the change. Helps you act.