Skip to main content Skip to content

Slow WooCommerce admin: how to find and fix the cause

A slow WooCommerce admin usually comes down to one of four things: order data stored in a table that wasn’t built for it, requests the admin sends in the background, plugins fetching data from other servers while the page is built, or background jobs that run when you click. The admin is never cached, so you feel all of it directly.

This guide shows how to find out which one it is and what to do about it. If the storefront your customers see is slow too, start with our guide to troubleshooting a slow WooCommerce store.

Which part of the admin is slow?

Start by noting which screens it affects. That narrows down the cause faster than any tool.

Slow screenTypical cause
The orders list and order searchOrders in wp_postmeta instead of HPOS, or a plugin that adds columns with its own queries
The products list and product editingMany variations, plugins with extra fields and columns, external calls on every load
The dashboardWidgets with sales figures and statistics, news and suggestions fetched from elsewhere
Every screen, even the simplestExternal calls from plugins, background jobs or the server itself
It stalls while you workHeartbeat and other admin-ajax requests, especially with several users logged in

Find the cause with Query Monitor

Query Monitor gives the fastest answer. Install it, ideally on a copy of the store, and open the slow screen. The admin bar shows the page’s total time, memory and number of database queries. Click it and look at three panels in particular.

Queries by Component splits database time between WordPress, WooCommerce, the theme and each plugin. If one plugin accounts for a large share, you have your first suspect. Slow Queries lists the individual queries that took longest and the function that called them. HTTP API Calls shows the requests the page made to other servers while it was built, with time and address. That panel is often overlooked, and when every admin screen is slow, the answer can be there.

Query Monitor only sees the page you load. Requests the admin sends afterward show up in your browser’s developer tools (F12) under Network. Filter on admin-ajax and leave the page open for a few minutes.

The orders list: HPOS and search

If the orders list is slow, first check how the store stores orders. In older stores, orders are posts in wp_posts, with all their fields as rows in wp_postmeta. The list, the filters and search then have to find orders through a table that also holds everything else on the site. With many orders it gets slow, and searching by name or email can take several seconds.

High-Performance Order Storage (HPOS) keeps orders in their own tables, with columns and indexes for exactly those lookups. It has been the default for new stores since WooCommerce 8.2, but older stores still run the old storage until someone switches. You can see what your store uses under WooCommerce → Settings → Advanced → Features. Before switching, every plugin that reads or writes orders has to be compatible, and the orders have to be synced to the new tables. WooCommerce lists incompatible plugins on the same page. What HPOS is and what gets faster is covered in our guide to HPOS.

If the store already runs HPOS and the list is still slow, look for plugins that add columns to the orders list, for example shipping, payment or accounting status. Each column can mean an extra query per order on the page.

Heartbeat and admin-ajax

For as long as an admin page is open, the WordPress Heartbeat API sends a request to admin-ajax.php at regular intervals. According to the WordPress documentation, that’s every 15 seconds in the editor and every 60 seconds on other admin pages. It’s used for autosave, for locking a post someone else is editing and for keeping you logged in. Plugins can hook their own tasks onto the same request.

Each of those requests loads all of WordPress and every plugin. With one user it’s rarely a problem. With several people keeping the admin open in several tabs all day, it adds up to many requests that can’t be cached, and they share the server with your customers. If a single admin-ajax request takes long in the Network tab, open it and look under Payload for its action. That tells you which plugin is behind it.

You can raise the interval on admin pages outside the editor with a plugin such as Heartbeat Control. Don’t turn it off completely in the editor: you’d lose autosave and the warning that someone else is editing the same product or order.

Plugins that fetch data from other servers

Many plugins check licenses, updates, news or offers with their developer. If they do it while the admin page is being built, the page waits for the answer. If the other server is slow or down, every admin page can take several seconds, even though nothing is wrong on your own server. The HTTP API Calls panel in Query Monitor shows each call, how long it took and which plugin made it.

The fix depends on the plugin. Some have a setting to turn off suggestions and news. WooCommerce itself has one under WooCommerce → Settings → Advanced → WooCommerce.com, where you can turn off marketplace suggestions. For others it’s a matter of updating the plugin or replacing it. How to find the plugin that’s costing you time is in our guide to plugins and speed.

The dashboard and statistics

The dashboard is the first page you see, and it’s often full of widgets that calculate sales figures or fetch news on every load. Hide the ones you don’t use under Screen Options at the top of the page. It applies to your own user, so each person has to do it themselves.

WooCommerce Analytics builds its reports on its own tables, which are updated in the background as orders come in. The first time, or after importing historical data, that can put a lot of work in the scheduled actions queue. It’s temporary, but it can make the admin slow while it lasts.

Background jobs that run when you click

WP-Cron and WooCommerce’s scheduled actions queue, Action Scheduler, are triggered by visits to the site by default, and admin pages count. If the queue is long, or the same jobs fail again and again, it can make your clicks slow. Look under WooCommerce → Status → Scheduled Actions for many pending or failed actions, and have your hosting provider run WP-Cron from the server on a fixed schedule. How to clean up the queue is in our guide to Action Scheduler. Why that matters for the whole store is covered in the section on background jobs in the troubleshooting guide.

The server

The admin can’t be cached as pages, but database queries can. An object cache such as Redis keeps their results between page views and can help the admin a lot. How to make the database fast in general is covered in our guide to WordPress database performance. If everything is fixed and the admin is still slow, especially when the store is busy, the admin and your customers may simply be sharing too few PHP processes.

Frequently asked questions

Can I just delete old orders?

Not without checking first. Bookkeeping rules require you to keep accounting records for a number of years; in Denmark it’s 5 years (in Danish) from the end of the financial year they relate to. If the orders in WooCommerce are your only record of the sale, they have to be kept. If the invoices live in your accounting system, old orders can be archived, but ask your accountant first. It’s also rarely the number of orders that’s the problem, but how they’re stored.

Is it risky to turn off Heartbeat?

Completely, in the editor, yes: you lose autosave and the warning when two people edit the same thing. On the other admin pages you can safely raise the interval.

Want help?

A slow admin costs time every day for the people who pack orders and edit products. If you’d like us to find the cause, read about optimizing a slow WooCommerce store. We take a free look at your store first and tell you what it will take.

← All articles

Want help with your store?

Is your store slow, unstable or just hard to work with? Write a few lines and a link, and you'll get an honest assessment from the developer.