← Back to Blog

WooCommerce 10.8 Rejects Non-Order REST PUTs — Fix Your Pipeline

WooCommerce 10.8, released May 26, 2026, changed the Orders REST endpoint to reject PUT updates when the persisted order type isn’t shop_order. Before 10.8, the endpoint silently coerced non-order types — subscriptions, custom order types, refunds — into regular orders. Now it returns a rejection. Any tracking pipeline that writes status updates or meta to subscriptions through the /wc/v3/orders/ endpoint will start failing. The fix is routing subscription writes to the correct endpoint and using woocommerce_payment_complete for purchase events rather than REST-dependent flows.

What WooCommerce 10.8 Changed in the Orders Endpoint

The Orders REST API now validates order type before accepting a PUT — and rejects anything that isn’t shop_order.

WooCommerce 10.8 shipped on May 26, 2026 with a change that WooCommerce flagged in a developer advisory weeks before release: PR #64050 makes the Orders REST endpoint validate the persisted order type before accepting a PUT update. If the record is a subscription, a refund, or any custom order type rather than a standard shop_order, the endpoint now returns a rejection.

Before 10.8, the endpoint silently coerced non-order types into regular orders. A PUT request to /wc/v3/orders/{id} where the ID belonged to a subscription would succeed — and quietly convert the subscription record’s type to shop_order. The data corruption was invisible. The API returned a 200. No error log entry. No warning. The subscription just stopped being a subscription.

WooCommerce 10.8 changed the Orders REST endpoint to reject PUT updates when the persisted order type isn’t shop_order, a correctness fix that silently breaks integrations that previously relied on the endpoint’s permissive coercion behaviour.

The fix is correct. Silently converting record types is a data integrity failure that’s far worse than a rejected API call. But for any integration that was unknowingly relying on the permissive behaviour — and there are more of these than the WooCommerce team could audit in advance — the upgrade produces immediate, visible failures where before there were none.

Why Silent Coercion Was Dangerous

The old behaviour didn’t just let bad writes through. It actively corrupted your order data.

Consider what happened when a tracking pipeline or CRM integration sent a PUT to /wc/v3/orders/{subscription_id} with a status update. Before 10.8, the API accepted the request, applied the update, and — as a side effect — changed the record’s type from shop_order_subscription to shop_order. The subscription record became a regular order. Recurring billing schedules, renewal logic, and subscription-specific meta were effectively orphaned.

For stores running WooCommerce Subscriptions alongside tracking integrations that looped through all order IDs to update meta or sync status, this wasn’t a hypothetical risk. Any integration that treated subscriptions as orders — because the API let it — was silently corrupting subscription data on every sync cycle. The damage accumulated quietly. A merchant would notice weeks later when renewal payments stopped processing for records that were no longer recognised as subscriptions.

The rejection is the fix, not the problem. It surfaces errors that were always happening but were previously invisible. The discomfort of a failing API call is the correct signal — it tells you the integration was doing something wrong all along.

What Breaks: Subscriptions, Custom Types, and Draft Queries

Three specific changes in 10.8 affect tracking pipelines that read or write through the Orders REST API.

First: subscription and custom order type writes. Any integration that updates subscription records through /wc/v3/orders/{id} will now receive a rejection. This includes CRM sync tools that iterate through all order IDs, tracking pipelines that write custom meta to all orders regardless of type, and analytics platforms that update order status through the REST API without filtering by type.

Second: checkout-draft orders are hidden from default queries. REST API requests with status=any no longer return checkout-draft orders. If your tracking pipeline reads drafts for funnel analysis — counting how many shoppers reached checkout without completing — those records are now invisible unless you explicitly request status=checkout-draft. This is a quiet change that shrinks your apparent checkout funnel without any data actually being lost.

Checkout-draft orders are now excluded from default REST API order queries with status=any — consumers must explicitly request status=checkout-draft to see them.

Third: order-meta index restoration. WooCommerce 10.8 restored the meta_value column to the wc_orders_meta index, fixing a performance regression from an earlier release that degraded order-meta lookups. If your tracking pipeline reads custom order meta — UTM parameters, click IDs, attribution data stored as post meta — the performance of those reads improved in 10.8. But if your code was compensating for the regression with workarounds, those workarounds may now conflict with the restored index.

Before and After: API Behaviour Compared

The API’s response changed. Your integration’s expectations need to change with it.

API Operation Before 10.8 After 10.8 Pipeline Impact
PUT /wc/v3/orders/{subscription_id} 200 OK (silently coerces type to shop_order) Rejected (type validation fails) Subscription writes fail — migrate to subscription endpoint
PUT /wc/v3/orders/{refund_id} 200 OK (silently coerces type) Rejected Refund updates via orders endpoint fail
GET /wc/v3/orders?status=any Returns all orders including checkout-drafts Excludes checkout-drafts Funnel analysis loses draft visibility unless explicitly queried
PUT /wc/v3/orders/{shop_order_id} 200 OK 200 OK (no change) Standard order writes unaffected
Order-meta lookups via REST Slower (missing index column) Faster (index restored) Performance improvement for meta-dependent tracking

The critical row is the first one. If your pipeline iterates through order IDs without filtering by type, every non-shop_order record now produces a failure. The fix isn’t to suppress the error — it’s to route each order type to its correct endpoint.

You may be interested in: Chrome’s IP Protection Is Masking Visitor IPs in Incognito — Why a First-Party Server Still Sees the Real One

The Compounded Upgrade Window

WordPress 7.0, WP 6.9 minimum, and 10.8 REST changes all landed within six days.

WordPress 7.0 was released on May 20, 2026. WooCommerce 10.8 followed six days later on May 26. At the same time, WooCommerce 10.8 raised the minimum WordPress version to 6.9. Three platform-level changes in one upgrade window is an unusual density of breaking-surface area.

For stores that auto-update WordPress and WooCommerce — or for stores that batch their updates monthly — all three changes arrive at once. The REST API behaviour change, the minimum version bump, and the WordPress core update each have their own integration implications. Debugging a tracking failure that appeared after a batch update means determining which of the three changes caused it, which requires isolating each change in a staging environment.

The lesson is the same one that every WooCommerce release teaches, just with higher stakes: stage your updates separately. Update WordPress first. Test. Then update WooCommerce. Test again. Running both updates simultaneously on production guarantees that any failure is ambiguous about its cause.

How to Fix Your Tracking Pipeline

The migration path is clear: filter by type, route to the correct endpoint, and hook purchase events to the server layer.

If your integration updates orders through the REST API, add a type filter. Before issuing a PUT, check the order type. If it’s shop_order, write to /wc/v3/orders/{id}. If it’s a subscription, write to the WooCommerce Subscriptions endpoint. If it’s a custom type, use the endpoint registered for that type. Never assume that every order ID is a shop_order.

If your pipeline reads orders for funnel analysis, update your query parameters. Add status=checkout-draft as an explicit request when you need draft visibility. The drafts still exist in the database — they’re just filtered from the default status=any query.

For purchase event tracking specifically, the best mitigation isn’t a REST API fix at all. It’s moving your purchase event hook away from the REST layer entirely. woocommerce_payment_complete fires on confirmed payment regardless of the API version, the REST endpoint routing, or whether the order started as a subscription, a custom type, or a standard shop_order. Server-side hooks don’t care about REST endpoint validation rules because they operate at a different layer.

Transmute Engine™ captures events at this server layer. The purchase event fires on woocommerce_payment_complete, reads the order data directly from the WooCommerce data store — not through the REST API — and transforms it for each downstream platform. REST API changes like #64050 don’t touch the event pipeline because the pipeline doesn’t use the REST API.

You may be interested in: The Cumulative Tracking Loss Stack: How Multiple Data Loss Vectors Compound on WooCommerce

Key Takeaways

  • PUT requests to non-shop_order records now fail: WooCommerce 10.8’s #64050 fix validates order type before accepting writes. Subscription and custom order type updates through the /wc/v3/orders/ endpoint are rejected.
  • The rejection fixes silent data corruption: Before 10.8, the endpoint silently converted non-order records into shop_order type, corrupting subscription and custom order data without any error signal.
  • Checkout-draft orders are hidden from default queries: REST requests with status=any no longer include drafts. Request status=checkout-draft explicitly if your funnel analysis depends on them.
  • Three platform changes landed in six days: WordPress 7.0, WP 6.9 minimum, and 10.8 REST changes all shipped within one upgrade window. Stage updates separately to isolate failures.
  • Server-side hooks bypass REST API changes entirely: woocommerce_payment_complete fires on confirmed payment regardless of REST endpoint validation rules, making it the most resilient anchor for purchase tracking across WooCommerce versions.
Why did my WooCommerce order updates start failing after upgrading to 10.8?

WooCommerce 10.8 changed the Orders REST endpoint to reject PUT requests when the underlying record isn’t a shop_order type. Before 10.8, the endpoint silently coerced non-order types — subscriptions, custom order types — into regular orders. If your integration updates subscriptions or custom order types through the /wc/v3/orders/ endpoint, those calls now return a rejection instead of succeeding silently.

What is the #64050 change in WooCommerce 10.8?

PR #64050 is a data integrity fix that makes the Orders REST endpoint validate the order type before accepting a PUT update. If the persisted record is a subscription, refund, or custom order type rather than shop_order, the endpoint now rejects the request. The fix prevents the endpoint from silently converting non-order records into regular orders, which was corrupting data for stores using WooCommerce Subscriptions and custom order type extensions.

How do I update subscriptions via the REST API after WooCommerce 10.8?

Use the subscription-specific REST endpoint provided by WooCommerce Subscriptions rather than the generic /wc/v3/orders/ endpoint. If you’re using a custom order type, use the endpoint registered for that type. The orders endpoint is now strictly typed — it only accepts records where the persisted type is shop_order.

Does WooCommerce 10.8 also affect REST API read queries?

Yes. Checkout-draft orders are now excluded from default REST API order queries that use status=any. If your tracking pipeline reads checkout-draft orders for funnel analysis, you’ll need to explicitly request status=checkout-draft in the query parameters. Standard completed and processing orders are unaffected.

References

WooCommerce Developer Blog — “WooCommerce 10.8.0 Release Notes: Orders endpoint rejects non-shop_order PUTs (#64050).” developer.woocommerce.com (May 26, 2026). WooCommerce Developer Blog — “Developer Advisory: Order update API endpoint now rejects non-order IDs in WooCommerce 10.8.” developer.woocommerce.com (May 11, 2026). WooCommerce Developer Blog — “WooCommerce 10.8: What’s coming for developers (Pre-release).” developer.woocommerce.com (May 12, 2026). WPExperts — “WooCommerce 10.8 Released: WordPress 7.0 compatibility, REST API changes.” wpexperts.io (June 2026). PureThemes — “WooCommerce Statistics 2026: 4.34 million live stores.” purethemes.net (July 2026). WiserReview — “66 WooCommerce Statistics: 33.4% global market share.” wiserreview.com (May 2026). Colorlib — “WooCommerce Statistics 2026: 4.17M live stores, $30-35B GMV.” colorlib.com (May 2026).

REST API behaviour changes are a recurring pattern in WooCommerce development. Server-side event pipelines bypass the API layer entirely. Talk to Seresa about building tracking infrastructure that survives every WooCommerce update.