WooCommerce is WordPress plus a shop, and a shop is a different workload: uncacheable pages (cart, checkout, account), many more database queries per page, background jobs for orders and emails, and a much higher cost when it is slow — abandoned baskets. Here is what a store needs from its hosting, in the order it matters.
The official minimums, and the real ones
WooCommerce lists PHP 7.4+, MySQL 5.6+/MariaDB 10.1+, 256 MB memory. Treat those as the floor for installing, not for running a business:
| Minimum | Recommended | |
|---|---|---|
| PHP | 7.4 | 8.2 or 8.3, with OPcache |
| MySQL / MariaDB | 5.6 / 10.1 | 8.0 / 10.6+ with InnoDB |
| PHP memory_limit | 256 MB | 512 MB |
| Storage | any | NVMe — product and order queries are random reads |
| HTTPS | required | required, with HTTP/2 |
| Cron | WP-Cron | real cron every 5 minutes |
| Object cache | none | Redis |
Why the database matters most
A category page with filters runs dozens of queries across wp_posts, wp_postmeta, wp_term_relationships and the lookup tables. wp_postmeta grows with every product attribute and every order note, and it is indexed poorly for the way WooCommerce queries it. Two things fix most of the pain:
- Enable High-Performance Order Storage (WooCommerce → Settings → Advanced → Features) so orders live in their own tables rather than in
wp_posts/wp_postmeta. New stores have it on; older ones should migrate. - A properly sized InnoDB buffer pool so the whole database is in memory. On shared hosting that is the host's job; on a VPS it is MySQL tuning basics.
Caching: what can and cannot be cached
Page caching (Nginx cache, a caching plugin, Cloudflare) makes the product and category pages fast — they are the same for everyone. Cart, checkout and account pages must not be cached; every caching layer needs the standard WooCommerce exclusions (/cart/, /checkout/, /my-account/, and the woocommerce_items_in_cart cookie). Most plugins and Plesk's Nginx cache handle this; verify by adding something to the cart from an incognito window and reloading.
Object caching with Redis is where a store gains on the pages that cannot be page-cached: repeated database lookups within a request are served from memory. Set it up with the Redis Object Cache plugin and a local Redis; the server side is in setting up Redis for object caching.
Cron
WooCommerce runs scheduled actions constantly: order status changes, abandoned cart emails, stock sync, webhooks. WP-Cron fires them only when someone visits, which is erratic. Disable it and run a real cron every five minutes — cron jobs in Plesk has the exact task. The Action Scheduler status page (WooCommerce → Status → Scheduled Actions) shows a backlog if this is not happening.
Order confirmations are transactional mail from the server. They must reach the customer, so SPF, DKIM and a PTR are not optional; see why emails go to spam. For stores sending hundreds a day, a transactional provider (Postmark, SES) via an SMTP plugin is more reliable than the server's own Postfix.
Payments and PCI
Using Stripe, PayPal or a hosted checkout means card numbers never touch your server, which keeps you in the simplest PCI category (SAQ A). What you still owe: HTTPS everywhere, an up-to-date site, and no card data in logs or exports. Do not store cards yourself unless you enjoy audits.
Shared hosting or VPS?
A store with a few hundred products and a few dozen orders a day runs comfortably on a good shared plan with PHP 8.3, NVMe and Nginx caching — the VPSPioneer Pioneer Pro plan is built for exactly that. Move to a managed VPS when:
- product count is in the thousands with layered filters;
- concurrent shoppers regularly exceed a few dozen (checkout is uncacheable and each one is a PHP worker);
- you need Redis, a tuned buffer pool, or a queue worker for imports;
- a promotion or TV mention is coming and the store cannot be slow that day.
The move itself is what our free migration is for; a WooCommerce migration has its own traps around orders placed mid-move, covered in migrating a WooCommerce store.
Before launch
- PHP 8.2+,
memory_limit512M, OPcache on. - HPOS enabled; database in memory.
- Page cache with cart/checkout exclusions verified.
- Redis object cache.
- Real cron every 5 minutes; Action Scheduler backlog empty.
- Mail authenticated and test order email received.
- Daily backups with a restore tested — an order database is the least replaceable data you will ever host.