Scheduled tasks
WordPress runs Quickmunch's scheduled jobs for you. On a quiet site, one server cron entry keeps them on time.
Tools → Site Health · WooCommerce → Status → Scheduled Actions
How WordPress runs them
WordPress has its own scheduler, WP-Cron, and it needs no setup. Every time somebody loads a page, WordPress checks whether a job is due and runs it. On a busy site that is as good as on time. On a quiet one — a new site, a small town, the middle of the night — a due job waits for the next visitor, and that can be hours.
Email does not depend on it. Order confirmations, status updates and password resets leave the moment they happen. If mail is not arriving, the scheduler is not the cause — see Troubleshooting.
What runs, and when
| Job | Runs | What it does |
|---|---|---|
| Billing sweep | Daily | Renews the plan terms that renew themselves, opens a grace period when a renewal fails, and ends the terms that have lapsed — dropping the venue back to its plan's allowance, taking its sponsored placement out of rotation, and telling the owner. |
| Text message log clean-up | Daily | Deletes SMS log entries older than 30 days, so the log never grows without end. |
| WooCommerce's own jobs | As each is due | Cancelling unpaid orders once the hold-stock time passes, clearing expired sessions, and the background work some payment gateways do. Listed under WooCommerce → Status → Scheduled Actions. |
Renewals run before lapses on purpose: a term that renews itself must never be seen by the step that ends terms, and a term whose renewal just failed opens its grace period before anything else looks at it.
Make them run on time
Optional, and worth doing on any site that is not busy around the clock. It swaps "when somebody visits" for "every five minutes, whoever visits".
- Stop WordPress checking on page loads. In
wp-config.php, above the line that reads That's all, stop editing!, add:define( 'DISABLE_WP_CRON', true ); - Call it from the server instead. In your hosting control panel
(Cron Jobs), add one entry that runs every five minutes:
If your host blocks*/5 * * * * wget -q -O - "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1wget, run the file with PHP instead:*/5 * * * * cd /path/to/your/site && php wp-cron.php >/dev/null 2>&1
Every job checks whether it is due, so a single five-minute entry is enough for all of them; the daily jobs still run once a day.
How to tell it is working
- Tools → Site Health checks scheduled events and warns when one is late or has failed.
- WooCommerce → Status → Scheduled Actions lists WooCommerce's jobs, with tabs for Pending, Complete and Failed.
- With WP-CLI,
wp cron event listshows every scheduled job and when it is next due, andwp cron event run --due-nowruns whatever is due.
When it doesn't work
A plan that should have ended is still active
The billing sweep has not run yet. On a quiet site that can take a while — add the server cron entry above.
Unpaid orders are never cancelled
Check WooCommerce → Settings → Products → Inventory → Hold stock has a value; with it empty, WooCommerce never cancels anything. Then check scheduled jobs are running at all.
You added DISABLE_WP_CRON and now nothing runs
The server cron entry is missing or failing. Check the address is your site's own, or — for the PHP
form — that the path is absolute and the PHP binary is the right one; some hosts need a specific
binary such as /usr/local/bin/php82 rather than plain php.