WP Webhooks / Blog / WordPress internals
Article · WordPress internals

How WordPress Cron Really Runs on WP Engine

How WP Engine runs cron jobs: the traffic-based default, WP Engine Alternate Cron that curls wp-cron.php every minute, and when to reach for real system cron.

7 min 2026-07-20
#WP Engine#WP-Cron

TL;DR: WP Engine does not disable WordPress cron by default — it is still traffic-dependent until you turn on WP Engine Alternate Cron.

  • By default, WP-Cron fires on visitor page loads, just like any host.
  • Enabling Alternate Cron in the User Portal sets DISABLE_WP_CRON = true and runs a server service that curls wp-cron.php every minute.
  • Defining DISABLE_WP_CRON yourself only stops the trigger — it does not enable the replacement.

/ Default

Does WP Engine run WordPress cron jobs?

Yes — and by default it runs them the ordinary way. Contrary to a common assumption, WP Engine does not automatically disable WordPress cron. Out of the box, WP-Cron on a WP Engine site is traffic-dependent: WordPress checks for due scheduled events on visitor page loads and runs whatever is due. Per WP Engine's own documentation, "simply disabling wp cron within the environment's config file will not enable WP Engine alternate cron on its own."

That default is fine for a busy site with steady traffic but unreliable for a quiet one: with no visitors, nothing triggers the cron, and scheduled tasks pile up until the next page load. That is the exact problem WP Engine's Alternate Cron exists to solve.

/ Alternate Cron

How does WP Engine Alternate Cron work?

WP Engine Alternate Cron is an opt-in, server-based service you enable from the User Portal. When you turn it on, WP Engine adds define( 'DISABLE_WP_CRON', true ) to wp-config.php for you — switching off the traffic-based trigger — and starts a platform process that, in WP Engine's words, "checks for 'due now' crons every minute by curling wp-cron.php, rather than running cron processes based on traffic flow."

How cron runs on WP Engine with and without Alternate CronBy default WP Engine leaves WordPress cron traffic-dependent: it spawns on visitor page loads. Enabling WP Engine Alternate Cron in the User Portal sets DISABLE_WP_CRON to true and switches to a server-based service that curls wp-cron.php once every minute regardless of traffic. On each tick WordPress checks for due events and runs any that are due, otherwise it exits and waits for the next minute. Simply defining DISABLE_WP_CRON by hand does not enable the service.

no

yes

yes

no

Default on WP Engine
wp-cron runs on page loads

enable Alternate Cron
in the User Portal?

WP Engine sets
DISABLE_WP_CRON = true

server service curls wp-cron.php
every minute

any events due now?

run due hooks ( do_action )

exit, wait ~1 min

FIG 01 — Default page-load cron vs WP Engine Alternate Cron

The result is a predictable one-minute heartbeat that is independent of whether anyone is visiting the site. Every minute the service hits wp-cron.php, WordPress evaluates the schedule, and any due hooks fire via do_action(). If nothing is due, the request exits and waits for the next tick.

Alternate Cron checks for "due now" crons every minute by curling wp-cron.php, rather than running cron processes based on traffic flow. — WP Engine support documentation

/ Enabling

How do you enable it, and why did DISABLE_WP_CRON alone not work?

Enable Alternate Cron through the WP Engine User Portal for the environment — not by editing files. This is the point that trips people up: adding define( 'DISABLE_WP_CRON', true ) to wp-config.php by hand disables the page-load trigger but starts nothing in its place, so your events simply stop running.

PHP — this line alone leaves nothing running your cron

// Disables the traffic-based trigger…
define( 'DISABLE_WP_CRON', true );

// …but WP Engine Alternate Cron is what actually curls wp-cron.php.
// Enable it in the User Portal — do not just define the constant.

Once Alternate Cron is on, you can confirm the constant is set by checking Site Health, which will report that DISABLE_WP_CRON is true and that WP-Cron spawning is disabled — expected and correct on WP Engine with Alternate Cron enabled.

/ Limits

What are the limits of one-minute cron?

A one-minute tick is reliable but not instant. Every scheduled event still only fires on the next minute boundary, so a task scheduled for time() + 5 can be up to roughly a minute late. For the vast majority of WordPress work — sending queued email, expiring transients, syncing feeds — that is invisible. It matters when you need sub-minute latency or exactly-on-the-second execution, which cron of any kind is the wrong tool for.

ConcernDefault (page-load) cronWP Engine Alternate Cron
TriggerVisitor page loadsServer service, every minute
Runs with zero trafficNo — tasks stallYes — independent of visitors
DISABLE_WP_CRONNot setSet to true automatically
LatencyWhenever the next visitor arrives≤ ~1 minute
How to enableDefaultUser Portal toggle

/ Real cron

When should you use a real system cron instead?

If you want tighter control than a one-minute curl, the general WordPress recommendation applies: disable the built-in trigger and drive wp-cron.php from a real scheduler at whatever interval you choose. On most hosts that is a server crontab entry; on WP Engine, Alternate Cron already is that server-side scheduler, so the practical move is to enable it rather than roll your own. The mechanics of hooking events, and the trade-offs of external triggers, are covered in the WP-Cron developer reference and in setting up a real cron job for WordPress.

NeedPage-load WP-CronServer-driven cron (incl. Alternate Cron)
Fires without trafficNoYes, on a fixed interval
Predictable timingNo — depends on visitorsYes — every minute (WP Engine)
SetupNone, but unreliableOne toggle in the User Portal

/ Queues

Should you use Action Scheduler on WP Engine?

For heavy, retryable background work — bulk imports, thousands of outbound API calls, order processing — a cron heartbeat alone is not enough; you want a queue on top of it. Action Scheduler gives each job its own database row, automatic retries, and a delivery log, but it still needs a cron tick to run its queue. On WP Engine that means Alternate Cron provides the reliable minute-by-minute heartbeat, and Action Scheduler drains the queue on each pass. For the difference between a bare scheduled event and a real queue, see WordPress async background processing.

FAQ

Common questions always ask.

Don't see yours? Open an issue on GitHub or check the full reference in the API docs.

Does WP Engine disable WP-Cron by default? +
No. By default WordPress cron on WP Engine is traffic-dependent — it spawns on visitor page loads like anywhere else. Only when you enable WP Engine Alternate Cron does WP Engine set DISABLE_WP_CRON to true.
How often does WP Engine Alternate Cron run? +
Once a minute. The Alternate Cron service is a server-based process that curls wp-cron.php every minute to check for due-now events, rather than depending on site traffic to trigger the run.
Why did just defining DISABLE_WP_CRON not fix my cron on WP Engine? +
Because disabling WP-Cron only stops the traffic-based trigger — it does not enable any replacement. On WP Engine you must turn on Alternate Cron in the User Portal; setting the constant by hand leaves nothing running your events.
Is one-minute cron accurate enough for scheduled tasks? +
For most WordPress tasks, yes. But every event still only fires on the next minute tick, so a job scheduled for time()+5 can be up to a minute late. Sub-minute or exactly-on-time work needs a different mechanism.
Should I use Action Scheduler instead of WP-Cron on WP Engine? +
For queued, retryable background work — yes. Action Scheduler still relies on a cron tick to run its queue, so Alternate Cron gives it a reliable heartbeat, but it adds per-job rows, retries, and a delivery log that raw WP-Cron events lack.
Ready

Your next automation is
one sentence away.

$ wp plugin install flowsystems-webhook-actions --activate