WooCommerce HPOS: what High-Performance Order Storage is and how to migrate
WooCommerce HPOS: what High-Performance Order Storage is and how to migrate

High-Performance Order Storage (HPOS) is the way WooCommerce stores orders in dedicated database tables instead of in WordPress's general-purpose posts and postmeta tables. It has been the default for new WooCommerce installations since WooCommerce 8.2, released in October 2023.
If your store was created before then, it may still be using the older "WordPress posts storage". WooCommerce does not switch existing stores automatically: you enable HPOS yourself, ideally after checking that your extensions are compatible and letting a sync mode copy your orders across first.
This guide explains what HPOS changes, why it matters for performance, how to check compatibility, how compatibility (sync) mode works, and a safe step-by-step migration for an existing store, including the WP-CLI commands larger stores rely on.
Key Takeaways
- HPOS stores WooCommerce orders in four dedicated tables built for e-commerce instead of the WordPress posts and postmeta tables.
- It is the default for new stores since WooCommerce 8.2 (October 2023); existing stores switch manually.
- WooCommerce blocks the switch while an active plugin is marked incompatible, so check compatibility first.
- Compatibility mode keeps both storage systems in sync, so you can switch back instantly if something breaks.
- Large stores should use the wp wc hpos WP-CLI commands to sync and verify data instead of waiting on background jobs.
What HPOS is
For most of its history WooCommerce saved each order as a WordPress "post" of a special type, with order details (addresses, totals, payment data) stored as rows of metadata in the wp_postmeta table. That table also holds metadata for every page, post and product on the site, so on a busy store it becomes very large and heavily used.
HPOS moves orders into their own tables. According to WooCommerce's HPOS documentation, it uses four custom tables (shown here with the default wp_ prefix):
| Table | What it holds |
|---|---|
| wp_wc_orders | The main order records |
| wp_wc_order_addresses | Billing and shipping addresses |
| wp_wc_order_operational_data | Operational fields used while processing orders |
| wp_wc_orders_meta | Additional order metadata added by extensions |
HPOS uses WooCommerce's CRUD (create, read, update, delete) layer, which is why extensions that read orders through WooCommerce's own functions keep working, and extensions that query the posts tables directly do not.
Why it matters for your store
WooCommerce describes the benefit as "fewer read/write operations and fewer busy tables", allowing stores to scale. In plain terms:
- Order queries run against tables designed for orders, not a shared table full of unrelated content.
- Order activity competes less with page and product queries for the same table.
- Order data has a clearer structure, which makes reporting and integrations simpler to build correctly.
The gain is largest on stores with many orders. A small store will notice less, but it still benefits from being on the default storage that new WooCommerce features and extensions are built and tested against. For other speed work, see our guide on speeding up a WooCommerce store.
How to tell which storage your store uses
Go to WooCommerce > Settings > Advanced > Features. Under order data storage you will see two options:
- High-Performance Order Storage
- WordPress posts storage (legacy)
The same screen has the compatibility mode checkbox. If the HPOS option is grayed out, WooCommerce has detected an active plugin that is incompatible.
Checking extension compatibility
Extensions tell WooCommerce whether they support HPOS by declaring compatibility in their main plugin file. Developers do this with FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true ) on the before_woocommerce_init hook. WooCommerce then shows the result to you:
- The Plugins screen warns about plugins that are incompatible or have not declared compatibility.
- The HPOS option cannot be enabled while an incompatible plugin is active.
- WooCommerce.com product pages show a Compatibility section that lists HPOS support.
Before migrating, list every WooCommerce-related plugin, check its changelog or product page for HPOS support, and update it. If a plugin you depend on is not compatible, contact the developer or plan a replacement. Custom code that queries wp_posts for orders, or uses get_post_meta() on orders, needs rewriting to use WooCommerce's order functions; our article on plugin database design explains why direct table queries are fragile.
Compatibility mode (sync)
Compatibility mode keeps both storage systems in sync. When it is on, WooCommerce writes each order to the active storage and copies it to the other one. According to WooCommerce, sync happens in three ways:
- Immediate: new and changed orders are synced as they happen.
- Scheduled: existing orders are backfilled in batches through Action Scheduler (WooCommerce documents batches of 25 orders).
- Manual: you run a sync with WP-CLI.
Sync has a cost: every order write happens twice. That is why it is a transition tool rather than a permanent setting for most stores. WooCommerce advises keeping it on "for some time to ensure a seamless transition", because "reverting to the post table can be done instantly" while both are in sync.
Step-by-step: migrating an existing store to HPOS
- Back up the full database and files, and confirm you can restore. Our guide to automating website backups covers this.
- Update WordPress, WooCommerce and all extensions on a staging copy of the store.
- Check compatibility on the Plugins screen and resolve or replace incompatible plugins.
- Turn on compatibility mode in WooCommerce > Settings > Advanced > Features ("Enable compatibility mode (synchronizes orders to the posts table)").
- Let the sync finish. Watch progress in WooCommerce > Status > Scheduled Actions, or use WP-CLI on larger stores (below).
- Switch to High-Performance Order Storage once all orders are synced, keeping compatibility mode on.
- Test real workflows: place orders with each payment method, issue a refund, run reports, check fulfillment, accounting and shipping integrations.
- Repeat on production during a quiet period, then monitor for a few weeks.
- Turn off compatibility mode once you are confident, to stop double writes.
WooCommerce publishes a separate guide for large stores with additional planning advice.
WP-CLI commands for HPOS
Background sync can be slow on stores with many orders. WooCommerce's HPOS CLI tools let you run each step directly:
| Command | What it does (WooCommerce's description) |
|---|---|
| wp wc hpos status | An overview of all HPOS matters on your site |
| wp wc hpos count_unmigrated | A count of all orders pending sync |
| wp wc hpos sync | Syncs orders from the active order storage to the other |
| wp wc hpos verify_data | Verifies data between the two datastores |
| wp wc hpos diff | Shows differences for a single order between both storages |
| wp wc hpos enable / disable | Turns HPOS (and possibly compatibility mode) on or off |
| wp wc hpos backfill | Copies whole orders or parts of order data from one storage to the other |
| wp wc hpos cleanup | Removes order data from the legacy tables |
Treat cleanup as a one-way, destructive step. Run it only after you have turned off compatibility mode, kept recent backups and run on HPOS without problems for a long period.
Should you migrate now?
For most stores still on posts storage, yes, with preparation. HPOS has been the default for new stores since October 2023, so most actively maintained extensions have had years to add support, and new WooCommerce features are built with HPOS stores in mind. Staying on legacy storage indefinitely means your store drifts further from how WooCommerce is developed and tested.
Reasons to wait a little longer:
- A business-critical plugin is still flagged as incompatible and has no update or replacement yet.
- You have custom code or reporting that reads orders directly from the database and has not been rewritten.
- You are about to run a major sale or seasonal peak. Migrate in a quiet period instead.
If none of those apply, schedule the migration like any other maintenance task, with a backup, a staging test and someone available to monitor orders afterward. Our article on handling CMS and plugin upgrades covers the general process.
Rolling back if something goes wrong
If you kept compatibility mode on, rolling back is a setting change: select WordPress posts storage (legacy) in the Features screen and save. WooCommerce supports switching between the two storages. If you turned sync off before rolling back, run a sync first so orders created on HPOS exist in the posts tables too. This is the main reason to leave compatibility mode on until you are confident.
Common problems
- The HPOS option is disabled: an active plugin is incompatible. Update or deactivate it.
- Sync is stuck: check Scheduled Actions for failed jobs, confirm WP-Cron is running, or use wp wc hpos sync.
- A report or integration shows missing orders: it is probably reading the posts tables directly. Ask the vendor for an HPOS-compatible version.
- Data mismatches: run wp wc hpos verify_data, then diff on specific orders.
Conclusion
HPOS is the standard order storage for WooCommerce, and new stores already use it. For an older store, the migration is straightforward if you do it in order: back up, confirm compatibility, sync with compatibility mode on, switch, test, then turn sync off. Keep the rollback path open until you are sure. Find more store guides in our WordPress hub, including what WooCommerce is. If you would like help with a migration or with custom code that is not yet compatible, eSEOspace offers WordPress plugin development.
Frequently asked questions
Is HPOS enabled by default?
Yes for new installations since WooCommerce 8.2 (October 2023). Stores created earlier keep the legacy posts storage until an administrator switches.
Will HPOS break my plugins?
Plugins that use WooCommerce's order functions work with HPOS. Plugins that query order posts or postmeta directly may not. WooCommerce flags incompatible plugins and will not let you enable HPOS while one is active.
Can I switch back to posts storage?
Yes. With compatibility mode on, you can switch back instantly in WooCommerce > Settings > Advanced > Features.
Should I leave compatibility mode on permanently?
Usually not. It writes every order twice. Use it during the transition, then turn it off once the store has run reliably on HPOS.
How long does the HPOS migration take?
It depends on the number of orders and your server. Background sync processes orders in batches; large stores can speed it up with wp wc hpos sync.
Put this into action with eSEOspace
We help businesses grow with website design that actually performs. Explore the services behind this guide:
Get a FREE Audit
We'll perform a comprehensive SEO, AEO, GEO & CRO audit of your website — completely free — and show you exactly how to outrank your competitors.
Don't have a site yet? Get in touch →
Get a FREE GEO/AEO/SEO Audit
We'll analyze your site's SEO, GEO, AEO & CRO — completely free — and show you exactly how to get found across Google and AI answers.
Don't have a site yet? Get in touch →
Great — your audit is on the way!
We'll send your free SEO/GEO/AEO/CRO audit within the next few hours. Where should we send it?
You're all set! ✓
Your free audit is being prepared — check your inbox in the next few hours. Talk soon!
On this page
- Key Takeaways
- What HPOS is
- Why it matters for your store
- How to tell which storage your store uses
- Checking extension compatibility
- Compatibility mode (sync)
- Step-by-step: migrating an existing store to HPOS
- WP-CLI commands for HPOS
- Should you migrate now?
- Rolling back if something goes wrong
- Common problems
- Conclusion
- Frequently asked questions





