Enabling high-performance order storage (HPOS) on WooCommerce
Since WooCommerce 8.2, released in October 2023, high-performance order storage (HPOS, also known as Custom Order Tables) is out of beta and declared stable. Shops created from 10 October 2023 onwards have it enabled by default; older shops need to enable it deliberately.
What HPOS changes in order storage
Before HPOS, WooCommerce stored each order as a post in the wp_posts table (with a shop_order content type), with all its data (customer, amounts, status, address) as metadata scattered across wp_postmeta, a generic table shared with every other content type on the site. With HPOS, orders are stored in dedicated tables, structured specifically for order queries: searching, filtering by status, reporting.
It’s enabled under WooCommerce > Settings > Advanced > Features, on existing shops that don’t have it on by default. A sync mode keeps both structures aligned during the transition, which allows rolling back if a problem shows up.
Why an extension can stop working with HPOS
- A payment, accounting or reporting extension that reads or writes directly to wp_posts or wp_postmeta instead of going through the WooCommerce CRUD API (get_post_meta(), WC_Order, and so on) keeps looking for data in the wrong place once HPOS is active: missing orders in reports, status not updated, incomplete accounting exports.
- A theme or an in-house module that queries the database directly with SQL against wp_posts filtered on post_type = 'shop_order' no longer finds orders created after HPOS is enabled.
- Some extensions explicitly declare HPOS compatibility in their plugin header; WooCommerce shows this in the plugin list (compatible, not compatible, or not declared), which lets you check before enabling rather than after an incident.
How I enable HPOS on an existing shop
-
Checking extension compatibility
I check the HPOS compatibility status WooCommerce shows for each active order-related extension (payment, invoicing, shipping, reporting), and update the ones that aren’t compatible yet.
-
Enabling sync mode
I enable HPOS with sync kept on: orders are written to the new tables and stay replicated in wp_posts, which leaves a way out if an extension misbehaves.
-
Testing on a sample of orders
I check order creation, status changes, refunds and exports for each active payment channel, on a test environment first.
-
An observation period with sync active
I keep the shop running with sync active long enough to cover a full order cycle, watching reports and sensitive extensions.
-
Turning off the old storage
Once stability is confirmed, I turn off sync and the old wp_posts storage. This is the point of no return: turning it off before being certain no extension still depends on wp_posts for orders risks a silent loss of compatibility.
Going further
-
Moving to WooCommerce cart and checkout blocks
Another change from the same period of WooCommerce, with its own compatibility logic on the extensions side.
-
Updating WooCommerce to a major version
HPOS is one of the changes to anticipate before a major WooCommerce version upgrade.
-
Checking extension compatibility before an update
The general method for checking whether a plugin will survive a structural change like HPOS.
-
Backing up your shop before an intervention
A backup comes before enabling HPOS, as with any intervention on the database structure.
Describe your need in one minute
A few targeted questions so I can reply with an estimate rather than another questionnaire.