Scheduled for nine, published never
The marketing team schedules a post for Monday morning to go with a campaign email. On Monday, the email goes out, the link leads to a page that does not exist, and the post sits in the dashboard marked "Missed schedule". Someone publishes it by hand and it happens again next month.
Once you start looking, other things turn up. The backup plugin's last run was weeks ago. WooCommerce subscription renewals were late. Abandoned-basket emails never went out. Nobody connected them, because each one failed quietly.
Why WordPress misses its schedule
WP-Cron is a stand-in for a real scheduler. Every time a page loads, WordPress checks whether any task is due and, if so, tries to run it in the background. That design has predictable weak points.
| Cause | Effect |
|---|---|
| Low traffic at the scheduled time | Nothing triggers WP-Cron, so tasks wait |
| Full-page caching or a CDN | Visitors never reach WordPress, so the check never happens |
| Security rules blocking wp-cron.php | The background request is refused |
| One task crashing or hanging | The queue behind it is held up |
| Too many scheduled tasks from plugins | Runs take longer and time out |
| WP-Cron disabled with no replacement | Someone turned it off for speed and nothing took over |
The last one is surprisingly common. Disabling WP-Cron is standard advice for performance, but only works if a real server task is set up in its place.
What silent failures cost
Missed posts are the visible symptom, and even those have a cost when they are tied to a campaign, an announcement or a product launch. A link in an email or a social post that leads to a missing page wastes the attention you paid for.
The costlier failures are hidden: backups that never ran, renewal payments that were late, follow-up emails that were never sent, stock feeds that stopped updating. By the time someone notices, the gap has been there for a while, and nothing recorded it.
How we make scheduled tasks reliable
- List every scheduled task on the site, what plugin created it, how often it should run and when it last ran, using tools such as WP Crontrol.
- Remove orphaned tasks left by plugins that were uninstalled.
- Find and fix the tasks that fail or hang, reading the error logs to see why.
- Disable visitor-triggered WP-Cron and replace it with a real cron job on the server, or a scheduled call from the host or an external service, on a regular interval.
- Move heavy work, such as large imports or email batches, to a proper background queue like Action Scheduler, so it cannot block everything else.
- Make sure security and caching rules allow the scheduler to run.
- Add monitoring that alerts someone if the scheduler stops, or if key jobs such as backups or renewals have not run when expected.
After the fix
Scheduled posts go live when they should. Backups, renewals, reminders and feeds run on a real clock regardless of traffic. If a job stops, someone is told, rather than finding out when a customer complains or a restore is needed.
Is this happening on your site?
- Posts show "Missed schedule" in the dashboard
- Backup plugins report old last-run dates
- WooCommerce emails or renewals are late or missing
- The site uses heavy caching or a CDN
- Someone disabled WP-Cron to speed things up
- Tasks seem to run only when someone logs in