How to Fix Missed Scheduled Events in WordPress with Real Cron

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

Your email address will not be published. Required fields are marked *

You may also enjoy…