Pay For Results. Our new Performance Model is live.

wp_actionscheduler_actions: Why It Gets Huge and How to Clean It Up

The wp_actionscheduler_actions table is usually the biggest table on a WooCommerce site. It grows because failed actions were never cleared before Action Scheduler 4.0.0 — and unlike a log table, you must not truncate it.

Picture of Adam Walters
Adam Walters

Founder

wp_actionscheduler_actions. Why it gets huge, and why truncating it deletes work that hasn’t run yet.
IN THIS ARTICLE

On a WooCommerce site, wp_actionscheduler_actions is very often the largest table in the database. WooCommerce own engineering team describes the Action Scheduler tables as some of the busiest in many WooCommerce databases, so if yours has grown alarming, you are in normal company.

It is also the one table in this series you should not empty with a raw truncate, and the reason is worth two minutes of your time.

What Is the wp_actionscheduler_actions Table?

Action Scheduler is the background job queue that WooCommerce and many other plugins use to run work outside the page request: subscription renewals, order syncs, emails, imports, webhooks. Since Action Scheduler 3.0 it stores that queue in its own custom tables prefixed actionscheduler_, rather than in a custom post type as older versions did.

Two tables do the heavy lifting. wp_actionscheduler_actions holds the actions themselves along with their status, and wp_actionscheduler_logs holds the log entries attached to them. You can see the same data in the admin under Tools, then Scheduled Actions, or under WooCommerce, then Status, then Scheduled Actions if WooCommerce is installed.

Diagram showing Action Scheduler purged completed and cancelled actions while failed actions were kept indefinitely before version 4.0.0

Why It Grows So Large

Here is the part most guides get wrong. Action Scheduler has always purged completed and cancelled actions. The table does not balloon because nothing was ever cleaned up.

It balloons because, before Action Scheduler 4.0.0, failed actions were never cleared at all. They accumulated indefinitely. On a busy store with a flaky integration quietly failing a few hundred times a day, that is millions of rows nobody asked for.

The old cleanup design made it worse. Deletion of old actions ran inline on every queue batch and processed only a small slice each time, so on high volume stores the tables could grow faster than cleanup could manage.

What Changed in Action Scheduler 4.0.0

Action Scheduler 4.0.0, announced by WooCommerce in June 2026, changed both halves of that problem.

Before 4.0.0From 4.0.0
Failed actionsKept indefinitely. The main cause of runaway tables.Removed once older than three months.
When cleanup runsInline on every queue batch, a small slice at a time.A dedicated daily job at 3am site time.
How much it deletesA small slice per batch, easily outpaced by growth.Larger batches, a minimum of 250 per run.
Completed and cancelledAlways purged.Always purged. Unchanged.
Source: the WooCommerce developer blog announcement for Action Scheduler 4.0.0.

If your table is enormous and you have only recently updated, some of this will resolve itself. Give the daily job time to work through the backlog before you reach for phpMyAdmin.

Three filters control the new behaviour if you need to tune it:

  • action_scheduler_retention_period_for_failed changes how long failed actions are kept.
  • action_scheduler_enable_failed_action_cleanup disables failed action cleanup entirely.
  • action_scheduler_cleanup_batch_size adjusts how many rows each run deletes, for hosts that cannot take the larger batches.

Why You Should Not Truncate This Table

This is the important difference between wp_actionscheduler_actions and the log tables people clean up alongside it.

A log table records what already happened. This table records what has not happened yet. Pending actions are live, queued work: the renewal that has not run, the email that has not sent, the sync that is waiting its turn. Truncate the table and that work does not get rescheduled. It is simply gone, silently, and on a subscription store that is a billing problem rather than a database one.

StatusWhat the row representsSafe to delete?
PendingWork that is queued and has not run yet.No. Deleting this cancels real work with no warning.
In-progressWork that is running right now.No. Leave it alone.
FailedWork that ran and errored.Yes, and from 4.0.0 this now happens automatically after three months.
Complete / CancelledFinished or abandoned work.Yes, and Action Scheduler has always purged these itself.
Check the status breakdown at Tools, then Scheduled Actions before deleting anything.
Comparison showing pending and in-progress Action Scheduler rows must never be deleted, while failed, complete and cancelled rows are safe

How to Clean It Up Safely

In order of preference:

1. Update Action Scheduler first. On 4.0.0 or later the failed action backlog clears itself, which is the cause in the large majority of cases. Updating WooCommerce usually brings the newer version with it.

2. Fix whatever is failing. A table full of failed actions is a symptom. Open Tools, then Scheduled Actions, filter to failed, and look at the hook name. It is usually one integration failing over and over. Clearing the rows without fixing the hook just refills the table.

3. Delete by status, never wholesale. If you must intervene manually, back up the database, then delete only rows with a failed, complete or cancelled status. Never touch pending or in-progress.

4. Remember the logs table. wp_actionscheduler_logs holds entries tied to the actions and is frequently larger than the actions table itself. Whatever you do to one, account for the other.

Not sure which table is your problem? Start with how to find the one table slowing your WordPress database, which covers all of them and the question to ask before deleting anything.

Related Database Tables

If you are working through an oversized WordPress database, this is rarely the only large table. The Wordfence pair are the usual companions, and the advice for them is different because they genuinely are logs: see what the wp_wfHits table is and how to shrink it and what wffilemods is and whether you can empty it. If you run Yoast, the wp_yoast_indexable table is a third case again: a cache that has to be rebuilt rather than emptied.

On a WooCommerce store, the sessions table fails the same way and for the same reason. The general rule across all of them: work out whether the table is a log, a cache, or a queue before you delete anything. Only the first is safe to empty on a whim.

wp_actionscheduler_actions FAQs

What is the wp_actionscheduler_actions table?

It is the queue table for Action Scheduler, the background job system WooCommerce and many other plugins use to run work outside the page request. It holds each scheduled action and its status. Since Action Scheduler 3.0 this lives in custom tables prefixed actionscheduler_ rather than in a custom post type.

Can I truncate the wp_actionscheduler_actions table?

You should not. Unlike a log table it contains pending actions, which are real queued work such as subscription renewals, emails and syncs that have not run yet. Truncating deletes that work without rescheduling it. Delete by status instead, and only failed, complete or cancelled rows.

Why is my Action Scheduler table so big?

Almost always because of failed actions. Action Scheduler has always purged completed and cancelled actions, but before version 4.0.0 failed actions were kept indefinitely. One integration failing repeatedly can generate millions of rows over time.

What changed in Action Scheduler 4.0.0?

Failed actions are now removed once they are older than three months, and cleanup moved from an inline slice on every queue batch to a dedicated daily job at 3am site time that deletes in larger batches of at least 250. Both changes target tables that previously grew faster than cleanup could manage.

Where do I view scheduled actions in WordPress?

Under Tools then Scheduled Actions, or under WooCommerce then Status then Scheduled Actions if WooCommerce is installed. From there you can filter by status, sort by hook name or scheduled date, view the log entries for an action, and run a pending action manually.

What about the wp_actionscheduler_logs table?

It stores the log entries attached to each action and is often larger than the actions table itself. It is a genuine log, so it is safer to clear, but treat the two together since the entries relate to the actions they describe.

If a table like this got large enough to find, something has probably been failing quietly for a while. Catching that is part of what we do under a maintenance plan, and it is part of what we cover under managed WordPress hosting.

Is your competitor stealing traffic?

Get a free competitor spy report. See their keywords, backlinks, and map rankings.

SHARE:
There is no market rate for a lead. There is only the price your own…
August 27, 2026
A shared lead has a lower sticker price and a lower close rate. Which one…
August 27, 2026
Yelp bills by the click, not by the lead. That single difference changes the arithmetic,…
August 27, 2026
Get the Blueprint

Join 5,000+ local business owners receiving weekly growth tactics.

Performance Partner Application

We invest our own capital to generate your leads. To ensure this partnership is profitable for both of us, we need to verify a few details about your business.

Let's Connect.

Have a specific question or need a custom proposal? Fill out the form and our team will get back to you within 24 hours.

Get Your Free Audit

See where you stand before you launch.