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.php
request. - Shared hosting limits: Some hosts restrict how often
wp-cron.php
can 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.php
if 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.
Leave a Reply