What is WooCommerce HPOS? How to Migrate Your Existing Site?
The HPOS system, which became the default starting with WooCommerce 8.2, uses custom order tables instead of the old wp_posts table. What should you pay attention to before migrating?

Last month, after completing the CartBounty setup for diolivo.com.tr, the site owner asked me: "I keep seeing a 'Complete HPOS migration' warning in the dashboard, what is this?" More than 60% of WooCommerce users are in the same situation. Before making this migration that the system automatically recommends, it's critical to understand what HPOS is and how it will affect your existing site.
Since 2011, WooCommerce has been storing orders in wp_posts, WordPress's core content table. Technically, each order was processed like a "post." While this approach worked fine for small stores, it led to serious performance bottlenecks for sites receiving 5,000+ orders per month. HPOS was designed to solve exactly this problem. But before making the migration decision, you need to review which plugins are running on your old system, your database structure, and your backup strategy.
In this article, I'm detailing the technical architecture of HPOS, the steps of the migration process, and potential issues you'll encounter with real site examples. I'll also share 3 critical mistakes I've seen in Turkish e-commerce sites using old plugins, particularly in consultancies I've provided from the Netherlands.
What is HPOS and Why Did It Separate from the WordPress Post Table?
HPOS (High-Performance Order Storage) is a custom database architecture that WooCommerce developed to store order data. In the old system, each order was written to the wp_posts table, and order details were saved as metadata in the wp_postmeta table. An average of 30-40 rows of postmeta data was created for one order. A site receiving 10,000 orders per month was accumulating 4.8 million postmeta rows per year.
In the new system, WooCommerce uses these custom tables:
- wp_wc_orders: Order main information (customer, total, status)
- wp_wc_order_addresses: Shipping and billing addresses
- wp_wc_orders_meta: Order metadata (instead of old postmeta)
- wp_wc_order_operational_data: Operational data (stock reservations)
This structure speeds up order queries by an average of 40%. Especially the order list page in the admin panel now loads in under 1 second instead of 3-4 seconds to filter thousands of orders. In the diolivo project, after migration in a database with 18,000 orders, admin panel loading time dropped from 4.7 seconds to 1.9 seconds.
But the real gain is in database indexing. Since the wp_posts table is used for all of WordPress's content types (posts, pages, products, orders), indexes become bloated and query optimization becomes difficult. With HPOS, orders have their own optimized indexes.
Is Your Current Site HPOS Compatible? Checklist
Before deciding to migrate, you need to check your site's technical infrastructure. In consultancies I provide from the Netherlands, I apply this 4-step check:
Plugin Compatibility
Go to WooCommerce Admin > Status > Tools section. Click the "Check compatibility for order data storage" button. The system will scan your installed plugins and report HPOS compatibility status.
Critical plugins:
- Payment gateways (iyzico, PayTR, Stripe): Most have been updated but old versions cause problems
- Shipping integrations (Yurtiçi Kargo, MNG, Aras): API-based ones are generally problem-free
- Invoice plugins: e-Archive, e-Invoice integrations must be tested
- Custom order export tools: CSV export plugins mostly require updates
In the diolivo project, we used the HPOS-compatible version of CartBounty. In the old version, cart recovery emails couldn't read order data after HPOS. The problem was solved after the update.
Custom Code and Theme Hooks
If you have custom code in your theme or functions.php that reads order data, review them. In the old system, code like this worked:
$order_id = 123;
$order_meta = get_post_meta($order_id, '_billing_email', true);
In HPOS, this code continues to work (thanks to compatibility mode), but the recommended new method is:
$order = wc_get_order($order_id);
$email = $order->get_billing_email();
In the recipe schema automation I developed for italyanmutfagi.com, I didn't touch WooCommerce orders. But if you're doing custom reporting using order data, you need to migrate your code to WooCommerce CRUD methods.
Database Backup Strategy
HPOS migration is reversible, but never start without database backup. I apply this 3-layer backup:
1. Hosting panel backup (cPanel/Plesk automatic backup) 2. Manual SQL export (entire database from phpMyAdmin) 3. WooCommerce order export (in CSV format)
The third step is critical because if there's data loss during migration, you can manually import orders from CSV. In the doktorbul.com project, we used a similar backup strategy for 79,000 doctor profiles. In e-commerce sites, order data is much more critical than profile data.
HPOS Migration Process: Step-by-Step Guide
In WooCommerce 8.2 and later, HPOS comes active by default. But for old sites, migration is a manual process. Here are the steps I apply:
1. Activate Compatibility Mode
Go to WooCommerce > Settings > Advanced > Features tab. Activate the "High-performance order storage" option. In the first stage, check the "Compatibility mode" option.
Compatibility mode writes orders simultaneously to both the old wp_posts and new wp_wc_orders tables. This ensures your old plugins continue to work. At diolivo, we ran in compatibility mode for 2 weeks and saw no issues.
2. Migrate Existing Orders
In the WooCommerce > Status > Tools section, click the "Migrate orders to custom tables" button. The system will copy all existing orders from the old table to the new tables.
This process can take between 5 minutes and 2 hours depending on your order count. For sites with 10,000+ orders, I recommend doing the process at night. Diolivo's 18,000 orders migrated in 47 minutes (in a shared hosting environment).
During migration, the site continues to work but the admin panel may slow down. Customer orders are not affected.
3. Test Period
After migration is complete, test in compatibility mode for at least 1 week. Things to check:
- Are new orders appearing in both old and new tables?
- Are payment gateways working properly?
- Are order status updates being written to both tables?
- Are shipping tracking numbers being saved?
- Is e-invoice integration working?
In the automation system I developed with Claude Haiku for memuratamalari.com, I read data through APIs. Since I didn't touch WooCommerce orders, the HPOS migration was smooth. But if you're synchronizing order data with external systems, definitely test these integrations.
4. Disable Compatibility Mode
If the test period passes without issues, you can disable compatibility mode from WooCommerce > Settings > Advanced > Features. From this point on, orders will only be written to the new tables.
After disabling compatibility mode, you can clean order data in the old wp_posts table. But I don't do this immediately. I wait at least 3 months, and after making sure there are no issues, I do the cleanup.
3 Critical Issues You May Encounter and Their Solutions
In consultancies I've provided from the Netherlands, I've encountered these issues in Turkish e-commerce sites:
Issue 1: Old iyzico Plugin Can't Update Order Status
iyzico's official WooCommerce plugin in pre-2022 versions had no HPOS support. After migration, payment confirmations were coming but order status remained "Pending."
Solution: We updated the iyzico plugin to the latest version. If there's no update, we wrote a custom webhook handler using the iyzico API directly. We update order status with WooCommerce CRUD methods:
$order = wc_get_order($order_id);
$order->update_status('processing');
$order->save();
This method works in both old and new systems.
Issue 2: Bulk Order Export Plugin Produces Empty CSV
A client was using WooCommerce Order Export on a site receiving 3,000+ orders per month. After HPOS migration, CSV export started producing empty files.
Reason: The plugin was pulling data directly from wp_posts and wp_postmeta tables. SQL queries didn't recognize HPOS tables.
Solution: We replaced the plugin with an HPOS-compatible alternative (Advanced Order Export). Alternatively, you can write a custom export script using WooCommerce's own REST API. For kamupersonelhaber.com, I pull 50+ job postings daily using the ilan.gov.tr API. You can apply a similar approach for order export.
Issue 3: Custom Reporting Dashboard Shows No Data
A client's custom-developed sales reporting panel was showing empty graphs after HPOS. The panel was pulling data with direct database queries:
SELECT * FROM wp_posts WHERE post_type = 'shop_order'
In HPOS, orders are no longer in wp_posts. This query returns empty results.
Solution: We migrated queries to WooCommerce's wc_get_orders() function. This function automatically detects which table is being used in the background:
$orders = wc_get_orders(array(
'limit' => -1,
'status' => 'completed',
'date_created' => '>=' . strtotime('-30 days')
));
This approach is both performant and will work compatibly even if there are changes in WooCommerce architecture in the future.
HPOS Performance Gains: With Real Data
In the diolivo.com.tr project, we measured these metrics before and after HPOS migration:
Admin panel order list loading time:
- Before: 4.7 seconds (18,000 orders, shared hosting)
- After: 1.9 seconds (59% improvement)
Order detail page opening time:
- Before: 2.3 seconds
- After: 1.1 seconds (52% improvement)
Database query count (order list page):
- Before: 47 queries
- After: 31 queries (34% reduction)
These gains are critical especially for high-order sites. On a site receiving 5,000+ orders monthly, every second saved in the admin panel increases order processing speed. If the customer service team manages 200 orders daily, 2 seconds saved per order saves 400 seconds (6.6 minutes) per day.
But the most important gain is preventing database bloat. In the old system, the wp_postmeta table was accumulating millions of rows per year. With HPOS, order metadata is kept in a separate table with optimized indexes. This also improves your site's overall performance because wp_postmeta now only contains post and page metadata.
HPOS Post-Migration Maintenance and Monitoring
After completing the migration, you need to do regular monitoring. I recommend this checklist to my clients:
Weekly checks:
- Are new orders being written to the correct table?
- Are order status updates working?
- Are payment gateway webhooks responding?
Monthly checks:
- Database table sizes (is the wp_wc_orders table growing as expected?)
- Admin panel performance metrics (is there any slowdown?)
- Plugin updates (is HPOS compatibility maintained?)
In the monthly maintenance services I provide at Futia, I automate these checks. Especially the Claude Haiku-based automation system I set up for kamupersonelhaber.com also monitors database health while producing 50+ job postings daily. You can apply a similar approach for WooCommerce orders.
If you encounter unexpected issues after HPOS migration on your site, you can use WooCommerce's "Revert orders to legacy storage" tool. This tool copies all orders back to the wp_posts table. But this rollback should be used carefully as it may affect new orders created during migration.
Is HPOS Mandatory? 2024 and Beyond
Starting with WooCommerce 8.2, HPOS is active by default in new installations. It's still possible to stay on the old system, but the WooCommerce team announced they will completely remove the old order storage system by the end of 2025.
So yes, HPOS migration will become mandatory. If you don't migrate now, you may be caught unprepared during the forced update in the future. I recommend this to my clients: If your site is actively receiving orders, complete the migration in 2024. This way you'll have a chance to solve potential issues in a controlled environment.
In the italyanmutfagi.com project, we didn't use WooCommerce while producing 618 automated recipes because it was a content site. But if you have an e-commerce site, postponing HPOS migration means performance loss and future compatibility issues.
When I provide technical consultancy to Turkish e-commerce sites from the Netherlands, I see HPOS migration as part of site optimization. Especially when combined with cart recovery tools like CartBounty, both performance and conversion rate increase. Part of diolivo's 340% 6-month traffic growth came from technical infrastructure improvements.
If you're hesitant about HPOS migration on your site or need technical support during migration, you can contact me via WhatsApp: +90 532 491 17 05. Alternatively, you can reach me at info@futia.net. As FUTIA, we offer site infrastructure + automation + monthly maintenance services. HPOS migration is also part of this service.
Frequently Asked Questions
What happens if I don't migrate to HPOS?
In WooCommerce 8.2 and later versions, HPOS is the default system. If you don't migrate, the old wp_posts table will continue to be used but you'll experience performance issues. Especially on sites with 5,000+ orders, the admin panel slows down and the database becomes bloated. The WooCommerce team announced they will completely remove the old system by the end of 2025. So migration will be mandatory sooner or later. If you do it now, you'll have a chance to solve problems in a controlled environment. Postponing leads to being caught unprepared during a forced update in the future.
Is HPOS migration reversible?
Yes, WooCommerce has a "Revert orders to legacy storage" tool. This tool copies all orders back to the wp_posts table. But be careful: New orders created after migration may experience synchronization issues during rollback. That's why before making the rollback decision, make sure you've taken a database backup. In sites I consult, I do 3-layer backup before HPOS migration: hosting panel backup, manual SQL export, and CSV order export. This way, if there's any problem, we can roll back without data loss.
Which WooCommerce plugins are not HPOS compatible?
Most popular plugins have become HPOS compatible but old versions can cause problems. Ones that especially need attention: old iyzico/PayTR payment plugins, custom order export tools, reporting panels that make direct database queries, and e-Invoice integrations. For compatibility check, click the "Check compatibility for order data storage" button from WooCommerce Admin > Status > Tools. The system will scan your installed plugins and report compatibility status. If a critical plugin is incompatible, first update it or find an alternative plugin. In the diolivo.com.tr project, I used the HPOS-compatible version of CartBounty, it worked without issues.
How long does HPOS migration take?
Migration time depends on your order count and server performance. For 1,000 orders, average 5-10 minutes, for 10,000 orders 30-60 minutes, for 50,000+ orders it can take 2-3 hours. Diolivo.com.tr's 18,000 orders migrated in 47 minutes in a shared hosting environment. During migration, the site continues to work but the admin panel may slow down. Customer orders are not affected. For sites with large orders, I recommend doing the migration at night. Also, definitely take a database backup before migration. Test in compatibility mode for at least 1 week, if there are no issues, disable compatibility mode.
How much is the HPOS performance gain?
Data we measured in the diolivo.com.tr project: Admin panel order list loading time improved 59% (from 4.7 seconds to 1.9 seconds). Order detail page opening time accelerated 52% (from 2.3 seconds to 1.1 seconds). Database query count decreased 34% (from 47 queries to 31 queries). These gains are especially noticeable on sites with 5,000+ orders. On sites receiving high monthly orders, every second saved in the admin panel increases order processing speed. Also, database bloat is prevented because wp_postmeta now only contains post/page metadata. Orders are kept in separate, optimized tables.
Want to apply one of the techniques from this post? Fill out a short form and we'll email you a free preview audit within 48 hours.