WooCommerce 10.5 Quietly Replaced Real-Time Analytics With 12-Hour Batches.

April 27, 2026
by Cherry Rose

WooCommerce 10.5 shipped in February 2026 with the Analytics import job switched from per-order ActionScheduler triggers to a 12-hour batch schedule that processes 100 orders at a time (WooCommerce Developer Blog, 2026). If you’ve been reconciling WooCommerce revenue against Meta Ads Manager and Google Ads on the same day, you’ve been comparing stale numbers to live ones since February. The mismatch looks like a tracking problem. It isn’t. It’s a 12-hour cache lag that was added to your store as a default the day you ran the 10.5 update.

What WooCommerce 10.5 Actually Changed

The job hasn’t changed. WooCommerce Analytics still reads completed order data and copies it into the wc_order_stats and related cache tables that power the in-admin Analytics dashboard. When the job runs is what changed.

Before 10.5, every order completion fired an ActionScheduler task to import that order into the analytics cache. The dashboard was nearly real-time — usually within seconds of the customer hitting the thank-you page. The cost was that on busy stores, the queue of pending ActionScheduler tasks was getting out of hand. WooCommerce reported backlogs of 10,000+ queued actions on busy sites, producing database contention and visible site slowdowns (WooCommerce Developer Blog, 2026).

10.5 replaced the per-order trigger with a scheduled batch. The default is now every 12 hours, 100 orders per batch. Two new filters give developers a way back: woocommerce_analytics_import_interval (seconds between batches) and woocommerce_analytics_import_batch_size (orders per batch). The default itself is the change most stores will notice.

The Reconciliation Problem Nobody Saw Coming

For most stores, the visible symptom is a complaint from whoever runs revenue reconciliation. The conversation goes something like this:

“WooCommerce shows $14,200 for yesterday. Google Ads shows $19,800 in conversion value. Meta shows $21,400. The numbers never match anymore.”

The team’s first instinct is to assume tracking broke — Pixel-CAPI deduplication, gclid capture, GA4 channel grouping, the usual suspects. They burn an afternoon checking it. Tracking is fine.

The WooCommerce dashboard is showing yesterday at the freshness it had at the last batch run, not at the freshness Meta and Google show right now. The 12-hour interval means the comparison is structurally broken: ad platforms refresh their conversion numbers within minutes; WooCommerce Analytics refreshes within hours. They will never match on a same-day reconciliation, regardless of how clean the underlying tracking is.

Worth reading the foundational framing on this if you haven’t yet — the issue is a special case of the broader pattern we covered in The Single Source of Truth Problem: Why WooCommerce Stores Have Three Versions of Every Number. 10.5 just made one of those three versions twelve hours older by default.

Why “Fix the Batch Interval” Is the Wrong Answer

The instinct is to drop the filter into functions.php and force the import back to every minute or every order. Don’t.

WooCommerce didn’t make this change for fun. The ActionScheduler backlog was a real performance problem on real stores — exactly the stores most likely to also be reconciling revenue daily. Forcing the interval back down brings the queue contention back with it. You will gain dashboard freshness and lose checkout responsiveness on the next traffic spike.

67% of data professionals do not trust their analytics data, with timing mismatches between source systems cited as a primary cause (Precisely Data Integrity Trends Report, 2025). The 10.5 change isn’t the cause of that distrust — it’s an accelerant on a fire that was already burning. Add the survey finding that 73% of GA4 setups have silent misconfigurations producing 30–40% data loss (SR Analytics, 2025), and the WooCommerce-vs-GA4-vs-Meta reconciliation gets nearly impossible to close.

The fix isn’t faster batching. The fix is to stop reconciling against the cache.

The WooCommerce Analytics Tables Were Never the Source of Truth

Here’s the architectural reframe most stores miss: the wc_order_stats cache table is a derived view, not a source of record. The actual source of record is the HPOS order tables (wp_wc_orders, wp_wc_order_addresses, wp_wc_order_operational_data) — and those update the moment an order completes, regardless of whether the analytics import has run yet.

The dashboard is a convenience layer over those tables. It was always a convenience layer. Before 10.5, the convenience layer was almost-real-time, so it was easy to mistake for the source of truth. Now it’s 12 hours behind, and the mistake costs you a reconciliation cycle every day.

For live revenue reconciliation, the right surface is one of these two:

  1. Direct query against the HPOS tables. A simple SQL query against wp_wc_orders filtered to status IN ('completed', 'processing') gives you the same revenue number the cache will eventually show — but right now, not in 12 hours.
  2. A BigQuery stream of order events. Capture the order at the woocommerce_payment_complete hook and ship it to BigQuery in the same call. Reconciliation becomes a SQL query that runs in seconds against data that’s already there.

The case for option 2 — and the broader argument that your warehouse outlives your dashboard by years — is in Why Your Two-Year-Old BigQuery Data Is More Valuable Than Last Week’s Dashboard. The 10.5 change is the operational version of that thesis. Your dashboard caches age. Your event stream doesn’t.

What This Looks Like in Practice

A reconciliation workflow built on the cache table looks like this:

  1. Open WooCommerce Analytics. Read yesterday’s revenue.
  2. Open Meta Ads Manager. Read yesterday’s purchase value.
  3. Open Google Ads. Read yesterday’s conversion value.
  4. Compare. Investigate the gap.

Post-10.5, step 1 is now reading a number that’s up to 12 hours stale — and the “yesterday” the dashboard is showing may not include the last 12 hours of yesterday at all. The investigation in step 4 starts by chasing a phantom.

A reconciliation workflow built on streamed order events looks like this:

  1. Run a SQL query against your BigQuery orders table for yesterday.
  2. Compare to ad platform numbers (also queryable in BigQuery via Meta and Google’s data exports).
  3. The gap, if any, is real and worth investigating.

Same data, no cache lag, no investigation overhead.

Here’s How You Actually Do This

Transmute Engine™ is a first-party Node.js server that runs on your subdomain (e.g., data.yourstore.com). The inPIPE WordPress plugin captures orders at woocommerce_payment_complete and sends them via API to your Transmute Engine server, which streams the events into BigQuery the moment they arrive — alongside routing them to GA4, Facebook CAPI, and Google Ads. Your reconciliation surface stops depending on the WooCommerce Analytics cache, which means a 12-hour batch interval becomes irrelevant to how you measure your business.

Key Takeaways

  • WooCommerce 10.5 (February 2026) changed Analytics imports from per-order to 12-hour batches. The default applies to every 10.5+ store unless explicitly overridden.
  • The change wasn’t gratuitous. Per-order imports were producing 10,000+ action backlogs and slowing busy stores down. Reverting the schedule reintroduces that load.
  • Same-day reconciliation against the cache is now structurally broken. WooCommerce shows up to 12-hour-old numbers; ad platforms show real-time. They will never match.
  • The cache was never the source of truth. HPOS tables are. A BigQuery stream of order events is the right surface for live reconciliation.
  • Don’t override the filter. Move the reconciliation, not the schedule.

Frequently Asked Questions

When did WooCommerce Analytics stop updating in real time?

WooCommerce 10.5, shipped in February 2026, changed the default Analytics import job from per-order ActionScheduler triggers to a scheduled batch that processes 100 orders every 12 hours. The dashboard does not show new orders until the next batch runs.

Why did WooCommerce make this change?

The per-order approach was generating ActionScheduler backlogs of 10,000 or more queued actions on busy stores, causing database contention and full-site slowdowns. Batching the import resolves the performance issue at the cost of dashboard freshness.

How do I change the WooCommerce analytics import interval back to real-time?

Two filters can adjust it: woocommerce_analytics_import_interval (in seconds) and woocommerce_analytics_import_batch_size. Setting the interval lower brings the dashboard closer to real-time but reintroduces the ActionScheduler load that 10.5 was specifically designed to eliminate. On busy stores, this is a step backward.

Which revenue number should I trust for reconciliation — WooCommerce, GA4, or BigQuery?

None of the dashboard caches are the source of truth. The WooCommerce HPOS order tables are. For live reconciliation against ad platforms, the right surface is a BigQuery stream of order events captured at the woocommerce_payment_complete hook — because that data is identical to what HPOS has and is queryable on demand.

Does this affect WooCommerce Analytics REST API endpoints too?

Yes. The REST endpoints that power both the in-admin dashboard and external dashboard tools (Looker Studio, Metabase, custom reports) read from the same wc_order_stats cache tables that the batch job populates. If the batch hasn’t run, the API returns stale data.

If your reconciliation workflow opens the WooCommerce Analytics dashboard as step one, that step is now broken by default. Move the source of truth to your order database — or to a BigQuery stream that captures every order the moment it completes — and the 12-hour cache lag stops mattering. See how Transmute Engine handles it.

Share this post
Related posts