---
title: "WP Engine Cron Jobs: Alternate Cron Explained"
description: "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."
url: "https://wpwebhooks.org/blog/wp-engine-cron-jobs/"
date: "2026-07-20"
---

# WP Engine Cron Jobs: Alternate Cron Explained

**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](https://developer.wordpress.org/plugins/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](https://wpengine.com/support/wp-cron-wordpress-scheduling/), "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."

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.

| Concern | Default (page-load) cron | WP Engine Alternate Cron |
| --- | --- | --- |
| Trigger | Visitor page loads | Server service, every minute |
| Runs with zero traffic | No — tasks stall | Yes — independent of visitors |
| `DISABLE_WP_CRON` | Not set | Set to `true` automatically |
| Latency | Whenever the next visitor arrives | ≤ ~1 minute |
| How to enable | Default | User 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](https://wpwebhooks.org/blog/wp-cron-developer-reference/) and in [setting up a real cron job for WordPress](https://wpwebhooks.org/blog/cron-job-for-wordpress/).

| Need | Page-load WP-Cron | Server-driven cron (incl. Alternate Cron) |
| --- | --- | --- |
| Fires without traffic | No | Yes, on a fixed interval |
| Predictable timing | No — depends on visitors | Yes — every minute (WP Engine) |
| Setup | None, but unreliable | One 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](https://actionscheduler.org/) 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](https://wpwebhooks.org/blog/wordpress-async-background-processing/).

## Structured data

```json
{"@context":"https://schema.org","@type":"Article","headline":"WP Engine Cron Jobs: Alternate Cron Explained","description":"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.","datePublished":"2026-07-20","dateModified":"2026-07-20","author":{"@type":"Person","name":"Mateusz Skorupa","url":"https://wpwebhooks.org/about/"},"publisher":{"@type":"Organization","name":"WP Webhooks","url":"https://wpwebhooks.org"},"url":"https://wpwebhooks.org/blog/wp-engine-cron-jobs/","image":"https://wpwebhooks.org/og_image.jpg","keywords":["wpengine cron","wp engine cron","wpengine cron jobs","wpengine alternate cron","wp engine wp cron","wpengine cron job"]}

{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"WP Webhooks","item":"https://wpwebhooks.org/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://wpwebhooks.org/blog/"},{"@type":"ListItem","position":3,"name":"WP Engine Cron Jobs: Alternate Cron Explained","item":"https://wpwebhooks.org/blog/wp-engine-cron-jobs/"}]}

{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Does WP Engine disable WP-Cron by default?","acceptedAnswer":{"@type":"Answer","text":"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."}},{"@type":"Question","name":"How often does WP Engine Alternate Cron run?","acceptedAnswer":{"@type":"Answer","text":"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."}},{"@type":"Question","name":"Why did just defining DISABLE_WP_CRON not fix my cron on WP Engine?","acceptedAnswer":{"@type":"Answer","text":"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."}},{"@type":"Question","name":"Is one-minute cron accurate enough for scheduled tasks?","acceptedAnswer":{"@type":"Answer","text":"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."}},{"@type":"Question","name":"Should I use Action Scheduler instead of WP-Cron on WP Engine?","acceptedAnswer":{"@type":"Answer","text":"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."}}]}
```
