Ever wonder why your WooCommerce subscriptions don’t renew, emails don’t send, or scheduled actions sit in “pending” forever? The culprit is often hiding in plain sight: wp-cron.
WP Cron runs background tasks like scheduled sales, renewals, and cleanup jobs. But by default, it only runs when someone visits your site, which means low-traffic or heavily cached sites can silently fail to trigger critical actions.
Let’s dig into what wp-cron is, why it can break, and how using real cron or ALTERNATE_WP_CRON can make your store run smoother and more reliably.
What is WP Cron?
WP Cron is WordPress’s internal system for scheduling tasks - things like:
-
Sending WooCommerce Follow-Up Emails.
-
Publishing scheduled blog posts.
-
Running subscription renewals or pending orders.
-
Cleaning up expired logs or transients.
Unlike system cron (used by most servers), wp-cron only runs when someone visits your site. If no one visits? Nothing happens. That’s where the problem starts.
Why WP Cron Sometimes Fails
The default setup has a few issues:
-
Low-traffic sites: No visitors = no cron triggering.
-
High-traffic sites: Too many triggers at once = duplicate executions or server overload.
-
Caching or CDN layers: May block the internal
wp-cron.phprequest. -
Shared hosting limits: Some hosts restrict how often
wp-cron.phpcan run.
Symptoms you might see:
-
WooCommerce Subscriptions not renewing on time
-
Follow-up or Booking emails not sent
-
Orders stuck in “processing” because webhooks or action scheduler jobs didn’t fire
Solution 1: Use ALTERNATE_WP_CRON
This WordPress built-in fallback tweaks how cron jobs run. Instead of firing an internal HTTP request, it redirects the current page to run wp-cron.php directly.
How to Enable
In your wp-config.php, add:
define('ALTERNATE_WP_CRON', true);
This is perfect for sites without server access or where DISABLE_WP_CRON + real cron isn’t an option. It’s lightweight and often solves missed cron jobs with minimal setup.
Solution 2: Disable WP Cron and Use Real Server Cron
This is the most reliable method - highly recommended for stores, especially with WooCommerce Subscriptions or heavy background processing.
1. Disable Default Cron
Add to wp-config.php:
define('DISABLE_WP_CRON', true);
2. Add a Real Cron Job
On your server (via SSH or cPanel):
*/5 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Or use WP-CLI:
*/5 * * * * cd /var/www/yourdomain.com && wp cron event run --due-now > /dev/null 2>&1
This tells your server to trigger wp-cron every 5 minutes, no visitors required.
Bonus: WP-Cron vs Action Scheduler (And Why It Matters)
WooCommerce and many of its extensions (like Subscriptions or Bookings) rely on a system called the Action Scheduler - a job queue that sits on top of wp-cron.
If WP Cron doesn’t run, Action Scheduler doesn’t run either.
This is why switching to a real cron is a game-changer: it guarantees reliability and ensures important WooCommerce events don’t silently fail.
When Should You Use Real Cron?
Use system cron (or ALTERNATE_WP_CRON at minimum) when:
-
Your site is on a caching layer or behind a CDN.
-
You’re running a WooCommerce store.
-
You notice stuck or missed scheduled actions (check WooCommerce > Status > Scheduled Actions).
-
You have long-running or recurring tasks (subscriptions, webhooks, renewals, cleanup jobs).
Tools That Help
-
WP Crontrol plugin: lets you view and manage scheduled cron jobs in WP Admin.
-
Action Scheduler UI (included in WooCommerce): check scheduled, failed, or in-progress jobs.
-
EasyCron / cron-job.org: free tools to ping
wp-cron.phpif your server doesn’t allow system cron.
Wrapping Up
WP Cron is great - until it’s not. Relying on page visits to run critical background jobs is risky for any WooCommerce site. By switching to ALTERNATE_WP_CRON or setting up a real cron job, you make your store more reliable, resilient, and ready for scale.
If you’re seeing missed orders, delayed emails, or stuck renewals - this is one of the first fixes we recommend.