Opens in a new tab

Action Scheduler Not Running Even Though WP-Cron Is Enabled

Action Scheduler not running although WP-Cron is enabled? Diagnose missed triggers, blocked loopbacks, stalled queue runners, and failing WooCommerce jobs safely.

Conceptual illustration of four stages: WP-Cron trigger, queue runner, action claim and plugin callback

WP-Cron being enabled does not prove that Action Scheduler is processing jobs. If WordPress says cron is active but WooCommerce scheduled actions stay pending, troubleshoot the chain in order: cron trigger → queue runner → individual action → application callback. This is usually faster, and safer, than changing cron settings or bulk-running overdue jobs.

This guide is for a site where scheduled actions are actually late, not one that simply has future-dated pending jobs. Start by noting the oldest overdue action, the latest completed action, and the affected hook or group. If you’re new to the interface, see our guide to past-due versus failed actions first.

Find the failing Action Scheduler execution gate

Applies when: WP-Cron appears enabled but overdue Action Scheduler tasks are not completing.

Quick answer

Treat cron triggering, queue-runner startup, job processing and application callbacks as separate checks. An enabled WP-Cron setting confirms none of them on its own. Collect queue and execution evidence before tuning concurrency.

What to do

  1. Record scheduled times, last successful completions and whether past-due jobs keep aging.

  2. Check WP-Cron events, loopback/HTTP behavior and Action Scheduler logs without invoking potentially non-idempotent jobs in production.

  3. After a focused fix, verify that due jobs complete over time and that any business workflow affected is functioning.

What does your evidence show?

All paths are listed below. Select a symptom to focus on the most relevant path.

Investigate the scheduling trigger

Check site traffic dependence, real cron configuration, WP-Cron spawn behavior and server restrictions. Verify the actual trigger rather than only a constant's value.

Inspect the Action Scheduler runner

Check runner logs, loopback and async requests, lock behavior and available resources. A running WordPress cron event does not prove the queue runner started.

Find the first failing hook

Review the action's error and associated plugin or external dependency. Do not rerun a payment, email or sync job without checking for duplicate side effects.

Quick diagnosis: which part stopped?

What you observe Likely investigation Next safe check
WP-Cron shows enabled, but unrelated scheduled WordPress events are also late Traffic-dependent triggering, disabled replacement cron, or blocked cron spawn Compare due WP-Cron events, real server-cron configuration, and Site Health
Other WP-Cron events execute, but Action Scheduler completes nothing Missing queue trigger, async loopback failure, or queue runner blockage Inspect action_scheduler_run_schedule, action logs, and HTTP/PHP errors
Some actions complete, but one hook repeatedly fails Plugin callback error, unavailable dependency, or action-specific data Read that action’s log and identify the owning integration
Completed jobs accumulate slowly while pending jobs grow faster Throughput, long-running callbacks, host resource limits, or contention Compare backlog age and completion rate over an observation window
Diagnostic hypotheses, not proof of a root cause. More than one failure can coexist.

1. Confirm the backlog is real

Open WooCommerce → Status → Scheduled Actions, or Tools → Scheduled Actions on installations exposing the standalone screen. Review Pending, Complete, Failed and In-progress separately. Record these five facts:

  1. The oldest pending action’s scheduled date; check it against the site’s configured timezone.
  2. The newest completed action and its time.
  3. The hooks and groups represented among overdue jobs.
  4. Any recent failure message or PHP fatal linked to the same hook.
  5. Whether the backlog and oldest-action age grow after normal site activity.

A pending action scheduled tomorrow is not stuck. One old pending action is also not sufficient evidence that the entire runner failed. Conversely, jobs that keep aging with no recent completions merit investigation even if an admin dashboard merely reports “WP Cron: ✔”. WooCommerce’s scheduled-event troubleshooting guide specifically recommends comparing the recent activity of WP-Cron and Action Scheduler.

2. Know the four separate execution gates

Action Scheduler normally asks WordPress to trigger its queue through a recurring cron event. It can also initiate background processing near the end of an admin request, and operators can configure alternative runners. The critical distinction: having a scheduled event is not the same as successfully executing the callbacks inside the queue.

Diagnostic flow showing WP-Cron trigger, queue runner, action claim and plugin callback with distinct failure points.
Conceptual diagnostic flow. These are logical boundaries, not a screenshot or telemetry captured from a live store.

The Action Scheduler FAQ says the default initiation methods include WP-Cron and an administrative-request shutdown hook, but Action Scheduler itself is not technically dependent on WP-Cron. That explains why a site may occasionally process jobs when someone opens wp-admin while its unattended queue remains unhealthy.

3. Check WP-Cron’s execution, not only its enabled flag

First examine Tools → Site Health for loopback or scheduled-event warnings. In a hosting panel, check whether a server-level cron has intentionally replaced the traffic-triggered WordPress cron. If DISABLE_WP_CRON is true, that is not automatically a defect: a correctly configured system cron may be doing the triggering instead. Conversely, a false or absent flag doesn’t prove the underlying HTTP requests succeed.

If you have WP-CLI access, the following reads scheduled events without deliberately running them:

wp cron event list --fields=hook,next_run_relative,recurrence --format=table

Look for the action_scheduler_run_schedule hook and compare other overdue cron events. If that hook is missing, investigate whether Action Scheduler is loaded and scheduling its runner; don’t add an arbitrary duplicate cron event. If many unrelated WP-Cron hooks are overdue, focus first on the cron trigger and server configuration.

Do not substitute wp cron event run --due-now for this read-only check: it executes all due callbacks and can have business effects. On a WooCommerce store, those can include messages, synchronization and payment-related work.

4. Test the site’s internal HTTP route and async runner

WordPress commonly spawns cron by making an HTTP request back to the site. The queue runner may also make asynchronous loopback requests to continue processing batches. A firewall, CDN rule, Basic Auth on staging, security plugin, DNS mismatch, PHP-FPM exhaustion, or hosting restriction can interfere with those requests while ordinary visitors see a working homepage.

Inspect the server-side evidence: Site Health loopback results, WordPress and PHP logs, firewall responses and relevant web-server access logs. Pay attention to 401 and 403 denials, cURL error 28 timeouts and repeated 5xx responses. A successful public homepage request is not an adequate loopback test because the server may resolve or route its own hostname differently.

A WordPress.org support case includes a WP-Cron spawning request returning HTTP 403; another WooCommerce support case identifies cURL timeout and internal-request failures. These are real user reports, not diagnoses of your particular site. Before relaxing security controls, confirm the exact request, origin and block rule with your host.

5. Is the runner alive but one action failing?

If the latest completion is recent, the runner has processed something. Inspect whether failures cluster around a single hook. The failed action’s log, the application log and the plugin or integration behind the callback matter more than the total number of queued actions. One broken plugin callback might throw a fatal error or repeatedly time out without making the scheduler library itself defective.

If the job appears in progress for an unusually long time, investigate claims, execution duration, and host limits rather than assuming the job simply never started. For payment, subscription, email, import, and webhook jobs, rerunning may duplicate side effects if the previous attempt partially succeeded.

You can inspect the Action Scheduler WP-CLI command surface without processing jobs:

wp action-scheduler status
wp action-scheduler action list --help

These subcommands are available only where the Action Scheduler WP-CLI integration is loaded. Consult the official WP-CLI reference and your installed version’s help. Commands named run, clean, delete, cancel and create change queue state; they are not read-only diagnostics.

6. If the queue runs but cannot catch up, measure capacity

A backlog is not always a stopped runner. Suppose 30 jobs arrive each minute but your site completes only 10 in that interval: the count and oldest pending age will increase even with functioning WP-Cron. Compare completions and arrivals for the same observation window before making a configuration change.

The Action Scheduler performance guide explains that web-runner processing has conservative request-time, memory and concurrency thresholds. Long-running callbacks, external API delays, database locking and limited PHP workers can all reduce throughput. WP-CLI is an officially supported alternative for large queues, but do not blindly raise concurrency or apply --force to a production store.

For a severe backlog, prepare a recovery window, capture the affected hooks and job dependencies, and coordinate with the host or the relevant plugin vendor. The official WP-CLI documentation cautions that filtering runners by hooks or groups can change ordering when actions depend on each other.

7. Choose a fix only after identifying the failed gate

Confirmed failure Targeted response How to verify it worked
Traffic-triggered cron does not fire frequently enough Use a correctly configured server cron per your host’s guidance WP-Cron events run without relying on a browser visit
Loopback is blocked Fix the exact firewall, authorization, networking or DNS condition The internal request succeeds and subsequent jobs actually complete
One callback fails Repair the responsible plugin, dependency or job data after reviewing logs That hook’s newly executed work completes with correct business outcomes
Insufficient throughput Profile slow work; consider managed WP-CLI processing and hosting capacity Oldest overdue age decreases and sustainable completion rate exceeds arrival rate
Check business effects as well as queue status. A green scheduler dashboard is not proof that downstream workflows succeeded.

Do not mass-delete overdue actions or blindly force-run batches. On an e-commerce site, capture a usable database and file recovery point before operational changes; verify any renewal, notification or order-side effects with the integration owner. The right remedy depends on the failed stage.

Where ModelGain Queue Health fits

ModelGain Queue Health for Action Scheduler is a read-only diagnostic companion. It summarizes queue-health signals, overdue and failed actions, runner indicators, and possible hook ownership; it can help package a privacy-conscious support report. It is not a cron replacement, a queue processor, or an auto-repair tool. An inferred callback owner is a lead for investigation, not proof of the cause.

Use its report alongside the built-in Scheduled Actions logs and your host’s actual request logs. If you need to install it, check the official WordPress.org listing for the current release and compatibility requirements. Our companion guide explains how to interpret overdue versus failed actions without destructive cleanup.

Frequently asked questions

Why do jobs run only when I visit wp-admin?

Action Scheduler can initiate processing from the admin-request shutdown hook as well as WP-Cron. That pattern suggests inspecting the unattended trigger path, but does not establish the cause without logs.

Is DISABLE_WP_CRON always the cause?

No. It may be intentionally enabled when an external server cron reliably invokes WordPress. Check whether that replacement actually runs. If neither automatic trigger works, pending jobs will age.

Should I manually run every pending WooCommerce action?

No. Some actions have monetary or irreversible side effects, and earlier attempts may have partly succeeded. Diagnose the hook, review logs, confirm idempotency and dependencies, and follow the owning plugin’s recovery process.

Can Action Scheduler work without WP-Cron?

Yes. The project’s official FAQ documents alternative queue initiation. The important question is whether your configured runner reliably executes due actions, not whether one particular trigger mechanism is enabled.

Does a successful HTTP loopback response prove that jobs finished?

No. It verifies only that the request reached and returned from some layer. Check action completion timestamps, logs and the business effect the callback was supposed to produce.

Primary documentation and real-world reports

This article is maintained as a practical reference. Check the linked official documentation for version-specific behavior and validate changes in a safe test environment.
More WordPress guides ↗