WooCommerce
HPOS in WooCommerce: the new way orders are stored and what it means for plugins

HPOS WooCommerce, short for High-Performance Order Storage, is a new way of storing orders. Instead of going into the WordPress post tables, orders get their own tables in the database. According to the WooCommerce HPOS developer documentation, it has been the default setting in new stores since version 8.2. What does this mean for a store owner? Above all, you need to check whether your installed plugins support the new storage.
Table of Contents
What is HPOS in WooCommerce and how is it different from the old order storage?
HPOS moves orders into separate tables designed around what a store needs. Before, they ended up in the same place as regular posts. Every order went into the posts and postmeta tables, together with pages, articles and data from other plugins (everything in one bag, as usual in WordPress). The new solution, previously known as Custom Order Tables, uses the WooCommerce CRUD layer, a set of functions for creating, reading, updating and deleting data. The practical effect? The store no longer has to dig through one huge table to find a transaction. The database can breathe, even as orders keep coming in.
Since when has HPOS been the default and does it apply to existing stores?
Since WooCommerce 8.2, released in October 2023, HPOS has been stable and enabled by default in new installations. In existing stores you switch it on yourself. According to the rollout history of the new tables, the feature plan was published in January 2022, and from May 2022 the developers invited store owners to test the migration on real stores. Simply updating an older installation does not change how orders are stored. The decision is up to the administrator. But a new store starts on the new tables right away. And here is the catch: every plugin you install in it has to work with them.
How the new order tables work: main data, copy and compatibility mode
With HPOS enabled, one set of tables is authoritative, meaning the store reads from it and writes to it. The other set acts as a copy kept in sync with the main one. When the woocommerce_custom_orders_table_enabled option is set to true, the new tables are the main ones and posts and postmeta hold the copy. When it is false, the roles are reversed. Simple. Compatibility mode fills the HPOS tables with data from the old storage and keeps both sides up to date. The switch is under WooCommerce, Settings, Advanced, Custom data stores. And thanks to synchronization, going back to the previous model does not put your orders at risk.
Plugin compatibility with HPOS: which extensions can cause problems?
Trouble comes from plugins that work on orders directly in posts and postmeta instead of going through the WooCommerce API. In my experience, it usually comes down to a few areas:
- integrations with courier companies and invoicing systems,
- order exports and sales reports, including those sent to Google Analytics 4,
- add-ons that change order statuses,
- custom SQL queries in the theme or functions files.
Do you have an extension in your store that is not compatible with the new storage? Then the HPOS option is locked in WooCommerce, Settings, Advanced, Features. Fixing the code is the plugin author’s job, and they have developer resources to help. No surprise, then, that extensions with active support and regular updates get fixes faster than abandoned free add-ons.
How to prepare your store and enable HPOS WooCommerce step by step
Backup first. Then the list of incompatible plugins and compatibility mode, and only at the very end switching the store to the new tables. The order looks like this:
- Back up the database and files.
- Update WooCommerce and all plugins.
- Check for incompatibility warnings in the Features settings.
- Enable compatibility mode and wait for the synchronization to finish.
- Select High-Performance Order Storage and save the page.
- Test an order, a payment, emails and integrations.
I recommend running the whole procedure on a test copy, that is on staging, before touching production. Oh, and one more thing: save the page after every change, because otherwise the switch simply will not work.
What to do when a plugin does not work with the new order storage?
Temporarily go back to storing orders in the WordPress post tables and report the problem to the plugin author. Once synchronization is complete, select WordPress posts storage (legacy), turn off compatibility mode if needed and save the settings. That’s it. When the plugin gets an update, you can enable HPOS again the same way as the first time. And what if your store runs on unusual, custom integrations? Then the fix may be reworking the existing code or a custom-built plugin, which the K4.pl team, for example, can prepare.
Let’s be honest, HPOS WooCommerce sets the direction order storage is heading in. In my opinion, it is better to check plugin compatibility and plan the switch now than to wait until something breaks.
Frequently asked questions
Do I have to enable HPOS in an existing store?
Not right away, because in older installations the administrator decides. But new stores run on it by default, so preparing for the change is a good idea. Start by reviewing your plugins and testing on a copy.
Will I lose old orders after enabling HPOS?
No. The migration and compatibility mode copy data between the tables, and the previous storage serves as a copy. Even so, make a full database backup before every change. Just in case of unexpected errors, because they always happen when you least expect them.
How do I check if a plugin is compatible with HPOS?
WooCommerce lists incompatible extensions in the Features settings and locks the switch in that case. Not sure? Ask the plugin author about High-Performance Order Storage support. Ideally before updating your store, not after.