WooCommerce Scheduled Actions Stuck Pending? Causes & Fix
If WooCommerce → Status → Scheduled Actions shows a growing list of Pending actions with dates in the past, nothing is running your queue. Renewals, emails and stock syncs all stall behind it. Here's how to find out why and drain it.
Last updated: 16 Jul 2026 · ~6 min read
The most common cause is DISABLE_WP_CRON set to true in wp-config.php with no server cron put in its place. Action Scheduler's queue runner is itself a WP-Cron event, so when WP-Cron never fires, the queue never runs and every action sits on Pending forever. Add a real server cron that hits wp-cron.php, or run wp action-scheduler run to drain the backlog now.
What a "pending" scheduled action actually means
Action Scheduler is the background job queue WooCommerce and its extensions use for anything that shouldn't happen during a page load — subscription renewals, webhook deliveries, order emails, analytics imports. Each job is a row with a scheduled date and a status. Pending means the job is due (or overdue) and simply hasn't been picked up yet.
From the store owner's side it looks like a list of stale dates in the Scheduled Actions screen. From the customer's side it looks like nothing at all — no renewal charge, no email, no status change. That's what makes this one dangerous: it is completely silent, and the backlog compounds every day it goes unnoticed.
The most common causes (most likely first)
DISABLE_WP_CRONis true and no server cron replaced itwp-config.phpcontainsdefine( 'DISABLE_WP_CRON', true );but there is no matching cron job on the server. Action Scheduler's runner hooks onto the WP-Cron eventaction_scheduler_run_queue— kill WP-Cron and you kill the runner. By far the #1 cause.- WP-Cron is enabled, but the site gets almost no trafficActions run in bursts — a clump complete right after you log in, then nothing for hours. WP-Cron only fires when someone loads a page, so a quiet store has no heartbeat.
- Stale rows in
wp_actionscheduler_claimsfrom a crashed runnerActions sit on In-progress rather than Pending, with a start date hours or days old. A PHP fatal or memory limit killed the batch mid-run, so the claim was never released and the cleaner that would release it never ran either. - The backlog is arriving faster than one batch can clear itActions are completing, but the pending count still climbs. The runner processes 25 actions per batch by default and stops at a 30-second time limit — if your store queues more than that per minute, the queue never catches up.
- Loopback requests are blocked
Tools → Site Healthreports that the loopback request failed. Action Scheduler's async runner calls the site back over HTTP to start a batch; a firewall, WAF, HTTP auth or a bad local DNS entry blocks it. - The action's own callback fatals every time it runsThe same hook cycles Pending → In-progress → Failed, or the same few actions retry endlessly while everything behind them waits. The queue isn't stuck — one job is poisoning it.
Where to look first
- Open
WooCommerce → Status → Scheduled Actionsand click the Pending tab — are the scheduled dates in the past? If yes, the queue is genuinely stalled, not just busy. - Search
wp-config.phpforDISABLE_WP_CRON. If it'strue, ask your host whether a server cron was ever added. True with no cron job = cause 1, and you're done diagnosing. - Check the In-progress tab. Anything in-progress for more than a few minutes is a stale claim (cause 3) — a runner died mid-batch.
- Open
Tools → Site Health → Status. A failed loopback or a "WP-Cron isn't running" notice confirms cause 5 or cause 1. - Watch the pending count for ten minutes. Falling but too slowly? That's throughput (cause 4), not a dead runner — raise the batch size or add a more frequent cron.
Want to know the queue is stalling before the renewals do?
Reading the Scheduled Actions table by hand tells you there's a backlog — it doesn't tell you why, and it only tells you when you happen to look. DiagnosticIQ's free dashboard checks the WP-Cron constant, the loopback, the claims table and the pending backlog together, and names the reason the queue runner isn't firing. Then it keeps watching, so the next Action Scheduler backlog reaches you before it reaches your subscribers.
Get the free plugin →Made by Prima Digital — the team behind this guide. Free forever; no card to install.
How to know you fixed it
Reload WooCommerce → Status → Scheduled Actions after a minute — overdue actions should be moving to Complete on their own, and the newest Pending dates should be in the future, not the past.
Frequently asked
Will the stuck actions still run once I fix cron?
Yes. Pending actions aren't discarded — they run as soon as a runner picks them up, oldest first. Expect a burst of catch-up activity, including renewal charges and emails that are days overdue.
Can I just delete the backlog?
Only if you know what's in it. Deleting pending actions cancels real work — unsent emails, uncharged renewals. Fix the runner first, let the queue drain, then clean up what's genuinely stale.
Is it safe to disable WP-Cron?
Yes, and on a busy store it's better — but only if you replace it with a server cron hitting wp-cron.php every minute. Disabling it with nothing behind it is what causes this.
How do I force the queue to run right now?
With WP-CLI: wp action-scheduler run. That drains the due actions immediately and is the fastest way to confirm the queue itself is healthy and only the trigger was missing.