Sales reporting

Why WooCommerce Analytics numbers don't match your orders

WooCommerce Analytics usually disagrees with your Orders list because the two count differently. Analytics leaves out orders with excluded statuses, dates refunds on the refund day, may date orders by payment or completion, excludes tax and shipping from net sales, and reads lookup tables that must be imported and up to date. Check each in turn.

Below, each cause with how to check it and how to fix it, in the order most likely to explain the gap.

1. Excluded statuses

The Orders list (WooCommerce › Orders) shows every order. Analytics leaves out any order whose status is on its excluded list.

Check: go to Analytics › Settings and look at Excluded statuses. Defaults have changed between WooCommerce versions, so look at your own store rather than assuming. Then filter your Orders list to just the statuses Analytics includes and compare again.

Watch for custom statuses. If a plugin adds statuses such as "Shipped" or "Awaiting pickup", decide whether they should count, and set the excluded list to match.

More on how this works: excluded statuses and order status.

2. Refunds are dated on the refund day

Analytics records a refund as a return on the day you issued it, not on the original order date. The Orders list shows each order on its order date.

Say a customer ordered $120 on 28 September and you refunded it on 3 October. Analytics counts $120 of sales in September and a $120 return in October. Your Orders list for October shows no sign of that order at all, and for September shows it as refunded.

Check: look at the Returns column in Analytics › Revenue for the month. If it's large, that's likely most of your gap. See returns and the WooCommerce refund rate guide.

3. The date type

Analytics can date each order by when it was created, paid or completed. That's the Date type setting under Analytics › Settings. The Orders list sorts by created date.

If your reports use the completed date and you ship a few days after ordering, the last few days of every month move into the next month in Analytics. Choose the date type that matches how you think about sales (most stores use date created or date paid), and use the same one whenever you compare.

4. Net sales vs order totals

The total shown on each order in your Orders list includes tax and shipping. Net sales in Analytics doesn't, and it also takes out coupon discounts and refunds. Total sales in Analytics › Revenue is the figure that adds tax and shipping back.

If you're comparing the sum of order totals with net sales, you'll always be short by roughly the tax and shipping. The net sales vs gross sales vs total sales guide explains each figure.

5. Missing or out-of-date Analytics data

Analytics doesn't read your orders directly. It reads its own lookup tables (wc_order_stats, wc_order_product_lookup and others), which Action Scheduler fills in the background as orders come in.

That causes two kinds of gaps:

  • Very recent orders can take a little while to appear.
  • Older orders that were never imported are missing entirely. This is common after migrating a store, importing orders from a CSV or copying a database.

Fix:

  1. Open WooCommerce › Status › Scheduled Actions and search for pending or failed Analytics actions. A long queue means the tables are behind, often because WP-Cron isn't running reliably on your host.
  2. Go to Analytics › Settings › Import historical data, choose the range (for a full rebuild, All) and start the import. You can tick Skip previously imported customers and orders to fill only the gaps. The import runs in the background.
  3. If figures still look stale, run Clear analytics cache under WooCommerce › Status › Tools.

None of these touch your actual orders. They rebuild or refresh the Analytics tables only.

6. Time zone and date boundaries

Analytics uses the time zone set in WordPress under Settings › General. If that's wrong (for example left as UTC for a store in New York), orders placed late in the evening land on the next day, and month boundaries shift. Other tools, such as your payment provider, may report in their own time zone.

Check: confirm the time zone in Settings › General matches where you run the business, then compare a single day in both places.

7. Comparing with other tools

Even with everything above lined up, other systems won't match exactly:

  • Payment providers report payouts after fees and on their own timetable, and may net refunds against later payouts.
  • Google Analytics and ad platforms count purchases they tracked in the browser. Ad blockers, consent choices and cross-device journeys mean they usually see fewer orders than WooCommerce.
  • Accounting software may use invoice dates or payout dates.

Treat WooCommerce as the source of truth for orders and products, and reconcile the others to it.

A quick reconciliation checklist

When the numbers disagree for a period:

Step What to compare
1 Same date range, same time zone, same date type
2 Orders list filtered to the statuses Analytics includes
3 Order totals vs Total sales (not net sales)
4 Add back the period's Returns, which may belong to earlier orders
5 Scheduled Actions queue empty, historical import complete

If a gap remains after all five, look for orders created outside the normal checkout (manual orders, imports, subscription renewals) and check that they reached the Analytics tables.

For developers: checking the lookup table

To see whether orders are missing from Analytics, count them in the lookup table and compare with the Orders list. This counts orders (not refunds) by status for October 2026:

SELECT status, COUNT(*) AS orders, ROUND(SUM(net_total), 2) AS net_sales
FROM wp_wc_order_stats
WHERE parent_id = 0
  AND date_created >= '2026-10-01' AND date_created < '2026-11-01'
GROUP BY status
ORDER BY orders DESC;

Statuses are stored with a wc- prefix. This shows every status, including the ones your settings exclude, so you can see exactly what Analytics is leaving out. If the counts are lower than your Orders list for the same statuses, the import is incomplete. Change wp_ if your table prefix differs.

What Askshelf does here

Askshelf adds Analytics › Askshelf to WordPress admin. It reads data through WooCommerce Analytics, so its sales figures follow the same rules described above: the same included statuses, refunds taken out, and your store's time zone. If Analytics is missing orders, so will its sales summary, and the fixes above apply.

The exception is today's orders, which it reads live rather than waiting for Analytics to catch up. That's a quick way to check whether the background import is behind:

Askshelfexample answer

How many orders have we had today?

14 orders so far today, totalling $612 in net sales.Today's orders (live)
An example on a demo store. In your store, the numbers come from your own orders.

If the live count is well ahead of what Analytics › Orders shows for today, the scheduled actions are behind. More on what Askshelf covers is on the AI sales reports page, and the WooCommerce sales reports guide covers every built-in report.

Common questions

Is WooCommerce Analytics accurate?

It's accurate for what it counts, but it counts differently from the Orders list. It leaves out excluded statuses, dates refunds on the refund day, excludes tax and shipping from net sales, and reads its own tables, which must be up to date. Once you account for those, the numbers line up.

Will re-importing historical data delete my orders?

No. Importing historical data only rebuilds the Analytics lookup tables. Your orders, products and customers aren't changed. The option to delete previously imported data clears those tables before rebuilding them, not the orders themselves.

Why are today's orders missing from Analytics?

Analytics fills its tables in the background with Action Scheduler, so new orders can take a little while to appear. If they never appear, check WooCommerce › Status › Scheduled Actions for pending or failed actions.

See how Askshelf handles this: AI sales reports for WooCommerce