{"id":542065,"date":"2026-07-02T09:11:57","date_gmt":"2026-07-02T09:11:57","guid":{"rendered":"https:\/\/webkul.com\/blog\/?p=542065"},"modified":"2026-07-02T09:12:51","modified_gmt":"2026-07-02T09:12:51","slug":"wordpress-action-scheduler-with-high-volume-stores","status":"publish","type":"post","link":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/","title":{"rendered":"WordPress Action Scheduler Limits with High-Volume Stores"},"content":{"rendered":"\n<p>If you run a busy WooCommerce store, a lot of what keeps it alive happens quietly in the background. Order emails, renewals, inventory syncs, and <a href=\"https:\/\/webkul.com\/blog\/webhooks-in-woocommerce\/\">webhooks<\/a> never run on the page the customer sees.<\/p>\n\n\n\n<p>The engine behind all of that is Action Scheduler. It works beautifully at first. But on high-volume stores, it slowly becomes one of the hardest-to-spot bottlenecks in the whole stack.<\/p>\n\n\n\n<p>When that queue backs up, the cost is real: late renewals, missed webhooks, and stale stock that leads to oversells.<\/p>\n\n\n\n<p>This guide shows why Action Scheduler becomes a bottleneck, how to spot it, and the fixes that actually move the needle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Who Should Read This Guide<\/h2>\n\n\n\n<p>It is written for two readers.<\/p>\n\n\n\n<p>If you own the store, you&#8217;ll learn the warning signs and the no-code steps you can take today.<\/p>\n\n\n\n<p>If you&#8217;re the engineer, you&#8217;ll get the queries, snippets, and server changes to fix it for good.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Action Scheduler Is \u2014 and Why Your Store Depends on It<\/h2>\n\n\n\n<p>Action Scheduler is a scalable, traceable job queue library that ships inside WooCommerce.<\/p>\n\n\n\n<p>It powers nearly every deferred operation in your store \u2014 order emails, inventory syncs, <a href=\"https:\/\/woocommerce.com\/document\/subscriptions\/renewal-process\/\">subscription renewals<\/a>, and webhook deliveries.<\/p>\n\n\n\n<p>Anything scheduled with <code>as_schedule_single_action()<\/code> or <code>as_schedule_recurring_action()<\/code> runs through it too.<\/p>\n\n\n\n<p>Under the hood, it is three parts working together:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A persistent queue backed by custom database tables.<\/li>\n\n\n\n<li>A scheduler that maps each action to a future timestamp.<\/li>\n\n\n\n<li>A runner that claims and executes those actions during request cycles.<\/li>\n<\/ul>\n\n\n\n<p>It uses four custom tables: <code>actionscheduler_actions<\/code>, <code>actionscheduler_logs<\/code>, <code>actionscheduler_groups<\/code>, and <code>actionscheduler_claims<\/code>.<\/p>\n\n\n\n<p>On a high-volume store, the <code>actions<\/code> table alone can grow into millions of rows. That growth is where most of the trouble starts.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1046\" height=\"1024\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp\" alt=\"Cron lock contention for action schedular\" class=\"wp-image-542955\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp 1046w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-300x294.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-250x245.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-768x752.webp 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1536x1504.webp 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-2048x2006.webp 2048w\" sizes=\"(max-width: 1046px) 100vw, 1046px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">The Life of a Single Action<\/h3>\n\n\n\n<p>Every job moves through a small set of statuses. Once you know them, the rest of this guide reads much easier.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>pending<\/strong> \u2014 scheduled and waiting for its time to arrive.<\/li>\n\n\n\n<li><strong>in-progress<\/strong> \u2014 claimed by a runner and executing right now.<\/li>\n\n\n\n<li><strong>complete<\/strong> \u2014 finished successfully.<\/li>\n\n\n\n<li><strong>failed<\/strong> \u2014 threw an error or timed out, and may be retried.<\/li>\n\n\n\n<li><strong>canceled<\/strong> \u2014 unscheduled before it ever ran.<\/li>\n<\/ul>\n\n\n\n<p>A healthy store moves actions from <code>pending<\/code> to <code>complete<\/code> quickly. A bottleneck is simply <code>pending<\/code> piling up faster than your runners can clear it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How the Queue Runs \u2014 and Why WP-Cron Holds It Back<\/h2>\n\n\n\n<p>By default, Action Scheduler piggybacks on WP-Cron. And <a href=\"https:\/\/webkul.com\/blog\/how-to-use-cron-job-in-wordpress-with-programming\/\">WP-Cron<\/a> is not a real cron job \u2014 it fires on page load.<\/p>\n\n\n\n<p>That single design choice creates three recurring problems on busy stores.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Triggered by traffic, not time.<\/strong> WP-Cron only fires when a visitor hits the site. During quiet hours, scheduled actions pile up silently.<\/li>\n\n\n\n<li><strong>Conservative defaults.<\/strong> Each runner claims a batch of up to 25 actions and keeps processing batches for at most 30 seconds before it stops.<\/li>\n\n\n\n<li><strong>Contention under concurrency.<\/strong> Many concurrent page requests can each try to start a runner. The claim mechanism stops double-execution, but the database work to coordinate those claims still adds load.<\/li>\n<\/ul>\n\n\n\n<p>A common misconception is that a cron run processes only one batch.<\/p>\n\n\n\n<p>It doesn&#8217;t. The runner loops, claiming batch after batch until it hits the time limit, the memory limit, or runs out of due actions.<\/p>\n\n\n\n<p>Here is a simplified version of that loop, so you can see where the cost lives:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">\/\/ Simplified from ActionScheduler_QueueRunner \u2014 illustrative, not verbatim\npublic function run( $context = &#039;WP Cron&#039; ) {\n    $processed = 0;\n\n    \/\/ Bail early if too many batches are already running concurrently\n    if ( $this-&gt;has_maximum_concurrent_batches() ) {\n        return $processed;\n    }\n\n    \/\/ Keep claiming and running batches until a limit is hit\n    do {\n        $in_batch   = $this-&gt;do_batch( $this-&gt;get_batch_size(), $context );\n        $processed += $in_batch;\n    } while ( $in_batch &gt; 0 &amp;&amp; ! $this-&gt;batch_limits_exceeded( $processed ) );\n\n    return $processed;\n}\n\n\/\/ One batch: claim due actions atomically, then run them\nprotected function do_batch( $size = 25, $context = &#039;&#039; ) {\n    $claim = $this-&gt;store-&gt;stake_claim( $size );\n\n    foreach ( $claim-&gt;get_actions() as $action_id ) {\n        $this-&gt;process_action( $action_id, $context );\n    }\n\n    $this-&gt;store-&gt;release_claim( $claim );\n    return count( $claim-&gt;get_actions() );\n}<\/pre>\n\n\n\n<p>The expensive step is <code>stake_claim()<\/code>.<\/p>\n\n\n\n<p>It runs an <code>UPDATE ... LIMIT<\/code> that stamps a unique <code>claim_id<\/code> onto a batch of due, unclaimed rows.<\/p>\n\n\n\n<p>On a healthy table, that update is cheap.<\/p>\n\n\n\n<p>On a bloated table with degraded indexes, it scans far more rows than it claims \u2014 blocking other runners that wait their turn.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Action Scheduler Becomes a Bottleneck at Scale<\/h2>\n\n\n\n<p>High-volume stores rarely hit just one limit.<\/p>\n\n\n\n<p>They hit several at once, and the symptoms compound.<\/p>\n\n\n\n<p>In ecommerce terms, a slow queue is not just a tech problem.<\/p>\n\n\n\n<p>A late renewal is lost revenue, a dropped webhook breaks fulfillment, and a stalled sync causes oversells.<\/p>\n\n\n\n<p>You likely have a queue problem if you recognize any of these signs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Order or shipping emails arrive minutes \u2014 or hours \u2014 late.<\/li>\n\n\n\n<li>Subscription renewals process well after their due time.<\/li>\n\n\n\n<li>The admin &#8220;Scheduled Actions&#8221; screen is slow or times out.<\/li>\n\n\n\n<li>The pending count keeps climbing and never settles back down.<\/li>\n<\/ul>\n\n\n\n<p>Three forces drive that degradation. Here is how each one works.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. The Queue Fills Faster Than It Drains<\/h3>\n\n\n\n<p>Every extension that uses Action Scheduler adds to the same queue.<\/p>\n\n\n\n<p>On a store doing 500+ orders a day with subscriptions, memberships, and sync plugins, tens of thousands of pending actions is normal.<\/p>\n\n\n\n<p>A batch of 25 simply cannot drain that fast enough.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. The Tables Bloat and Slow Every Query<\/h3>\n\n\n\n<p>By default, Action Scheduler keeps completed and failed actions for around 30 days before cleanup.<\/p>\n\n\n\n<p>At high volume, the <code>actions<\/code> and <code>logs<\/code> tables swell into the millions of rows.<\/p>\n\n\n\n<p>Every query that touches them \u2014 including the admin &#8220;Scheduled Actions&#8221; screen \u2014 gets slower.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Actions Get Stuck Mid-Run<\/h3>\n\n\n\n<p>Slow or memory-leaking callbacks don&#8217;t always fail cleanly.<\/p>\n\n\n\n<p>They can exhaust PHP&#8217;s memory limit mid-batch and take the whole runner down with them.<\/p>\n\n\n\n<p>When that happens, the actions already claimed in that batch stay marked <code>in-progress<\/code> with their claim still attached.<\/p>\n\n\n\n<p>Action Scheduler does try to recover on its own.<\/p>\n\n\n\n<p>Its cleaner resets actions stuck past <code>action_scheduler_timeout_period<\/code> (default 300 seconds), and marks repeat offenders <code>failed<\/code> after <code>action_scheduler_failure_period<\/code>.<\/p>\n\n\n\n<p>But recovery only runs when a runner runs.<\/p>\n\n\n\n<p>On a stalled queue, those resets are delayed too \u2014 and that gap is where renewals fire late, webhooks drop, and stock updates stall.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Store Owners Can Do Right Now<\/h2>\n\n\n\n<p>You don&#8217;t have to be a developer to act on this.<\/p>\n\n\n\n<p>Most of the relief comes from three decisions you can make today.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Move the Site to a Real Cron Job<\/h3>\n\n\n\n<p>Ask your host to disable WP-Cron and run cron on a fixed schedule instead.<\/p>\n\n\n\n<p>Most managed WooCommerce hosts offer this as a setting or a quick support request.<\/p>\n\n\n\n<p>This removes the &#8220;no traffic, no processing&#8221; gap and is the single highest-impact change you can make.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Install the Official High-Volume Helper<\/h3>\n\n\n\n<p>WooCommerce maintains a free, open-source plugin \u2014 Action Scheduler \u2013 High Volume \u2014 that safely raises batch size, concurrency, and time limits.<\/p>\n\n\n\n<p>Have your developer or host install it once.<\/p>\n\n\n\n<p>There are no settings to configure and no custom code for you to maintain.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Watch the Queue From Your Dashboard<\/h3>\n\n\n\n<p>Open <strong>WooCommerce \u2192 Status \u2192 Scheduled Actions<\/strong>. The Pending tab shows everything waiting to run.<\/p>\n\n\n\n<p>Check it weekly. A queue that drains back down after busy periods is healthy.<\/p>\n\n\n\n<p>A Pending count that only ever grows is your warning sign.<\/p>\n\n\n\n<p>If pending stays high after these steps, hand this article to a developer and continue with the diagnostics and fixes below.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to Diagnose a Slow Action Scheduler Queue<\/h2>\n\n\n\n<p>Before you change anything, get hard numbers.<\/p>\n\n\n\n<p>These queries and snippets give you a clear read on queue health.<\/p>\n\n\n\n<p>One note first: the SQL below assumes the default <code>wp_<\/code> table prefix. Swap it for your own if you changed it at install time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Measure Queue Depth and the Oldest Pending Action<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\">-- Current state of the action queue, grouped by status and hook\nSELECT\n    status,\n    hook,\n    COUNT(*) AS total,\n    MIN(scheduled_date_gmt) AS oldest,\n    MAX(scheduled_date_gmt) AS newest\nFROM wp_actionscheduler_actions\nGROUP BY status, hook\nORDER BY total DESC;\n\n-- Check the claim query&#039;s plan.\n-- If &quot;type&quot; in the EXPLAIN output shows &quot;ALL&quot;, it&#039;s doing a full table scan.\nEXPLAIN SELECT action_id\nFROM wp_actionscheduler_actions\nWHERE claim_id = 0\n  AND status = &#039;pending&#039;\n  AND scheduled_date_gmt &lt;= UTC_TIMESTAMP()\nORDER BY scheduled_date_gmt ASC\nLIMIT 25;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Queue Lag Report in PHP<\/h3>\n\n\n\n<p>This logs counts by status and the lag of the oldest pending action.<\/p>\n\n\n\n<p>Lag is the real health signal \u2014 a deep queue that still drains on time is fine.<\/p>\n\n\n\n<p>Treat this as a temporary diagnostic. It runs count queries on every request.<\/p>\n\n\n\n<p>Capture your baseline, then remove it \u2014 don&#8217;t leave per-request queries running on a busy store.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\/**\n * Logs queue health on shutdown.\n * Add to: \/wp-content\/mu-plugins\/as-diagnostics.php\n *\/\nfunction store_queue_health_report() {\n    if ( ! class_exists( &#039;ActionScheduler&#039; ) ) {\n        return;\n    }\n\n    global $wpdb;\n    $store    = ActionScheduler::store();\n    $statuses = &#091; &#039;pending&#039;, &#039;in-progress&#039;, &#039;failed&#039;, &#039;complete&#039; ];\n\n    \/\/ query_actions() returns a count when &#039;count&#039; is passed as the query type\n    foreach ( $statuses as $status ) {\n        $count = $store-&gt;query_actions( &#091; &#039;status&#039; =&gt; $status ], &#039;count&#039; );\n        error_log( &quot;AS Health &#091;{$status}]: {$count} actions&quot; );\n    }\n\n    \/\/ Lag = now minus the oldest pending scheduled time\n    $oldest = $wpdb-&gt;get_var(\n        &quot;SELECT MIN(scheduled_date_gmt)\n         FROM {$wpdb-&gt;prefix}actionscheduler_actions\n         WHERE status = &#039;pending&#039;&quot;\n    );\n\n    if ( $oldest ) {\n        $lag_sec = time() - strtotime( $oldest . &#039; UTC&#039; );\n        error_log( &quot;AS Health: oldest pending lag = {$lag_sec}s&quot; );\n    }\n}\nadd_action( &#039;shutdown&#039;, &#039;store_queue_health_report&#039; );<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Find and Reset Stuck In-Progress Actions<\/h3>\n\n\n\n<p>Use this only as a manual fallback when the built-in cleaner can&#8217;t run because the queue itself is stalled.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">-- Actions stuck &quot;in-progress&quot; for over 10 minutes are suspect\nSELECT\n    a.action_id,\n    a.hook,\n    a.status,\n    a.last_attempt_gmt,\n    TIMESTAMPDIFF(MINUTE, a.last_attempt_gmt, UTC_TIMESTAMP()) AS minutes_stuck,\n    a.args\nFROM wp_actionscheduler_actions a\nWHERE a.status = &#039;in-progress&#039;\n  AND a.last_attempt_gmt &lt; DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 MINUTE)\nORDER BY minutes_stuck DESC\nLIMIT 50;\n\n-- Reset them to pending and drop the claim so a runner can retry\nUPDATE wp_actionscheduler_actions\nSET    status   = &#039;pending&#039;,\n       claim_id = 0\nWHERE  status   = &#039;in-progress&#039;\n  AND  last_attempt_gmt &lt; DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 MINUTE);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Developer Fixes That Restore Throughput<\/h2>\n\n\n\n<p>The rest of this guide is the engineer&#8217;s track.<\/p>\n\n\n\n<p>Each fix is a small snippet you can drop into an mu-plugin, plus the server and database changes that back it up.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fix 1 \u2014 Increase Batch Size and Concurrency<\/h3>\n\n\n\n<p>Action Scheduler exposes filters for batch size, concurrency, and the time limit.<\/p>\n\n\n\n<p>The defaults are deliberately safe, not fast.<\/p>\n\n\n\n<p>The official <code>action-scheduler-high-volume<\/code> plugin sets sensible values: batch size \u00d74, concurrent batches \u00d72, and a 120-second time limit.<\/p>\n\n\n\n<p>The snippet below mirrors that.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\/**\n * Scale up Action Scheduler throughput.\n * Add to: \/wp-content\/mu-plugins\/as-tuning.php\n *\n * Rule of thumb: batch_size x avg_action_ms &lt; (time_limit x 0.8 x 1000)\n *\/\n\n\/\/ Actions per batch (default: 25)\nadd_filter( &#039;action_scheduler_queue_runner_batch_size&#039;, function() {\n    return 100;\n});\n\n\/\/ Max concurrent batches (default: 5). Raising this increases server load \u2014\n\/\/ scale it to your CPU and DB headroom, and watch load after each change.\nadd_filter( &#039;action_scheduler_queue_runner_concurrent_batches&#039;, function() {\n    return 10;\n});\n\n\/\/ Time limit per runner in seconds (default: 30).\n\/\/ Keep PHP max_execution_time comfortably above this value.\nadd_filter( &#039;action_scheduler_queue_runner_time_limit&#039;, function() {\n    return 120;\n});<\/pre>\n\n\n\n<p>Note that concurrency does not require system cron.<\/p>\n\n\n\n<p>Action Scheduler can fan out work through its async (loopback HTTP) runner even on WP-Cron \u2014 system cron just makes it predictable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fix 2 \u2014 Reduce Log Retention and Purge in Chunks<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\/**\n * Trim retention from ~30 days to 7 days.\n * Add to: \/wp-content\/mu-plugins\/as-cleanup.php\n *\/\nadd_filter( &#039;action_scheduler_retention_period&#039;, function() {\n    return WEEK_IN_SECONDS;\n});\n\n\/**\n * One-time bulk purge of old finished actions.\n * Run via WP-CLI or a custom admin trigger \u2014 NOT on every request.\n * Chunked deletes keep table locks short.\n *\/\nfunction purge_old_as_actions() {\n    global $wpdb;\n    $cutoff = gmdate( &#039;Y-m-d H:i:s&#039;, strtotime( &#039;-7 days&#039; ) );\n\n    do {\n        $deleted = $wpdb-&gt;query( $wpdb-&gt;prepare(\n            &quot;DELETE FROM {$wpdb-&gt;prefix}actionscheduler_actions\n             WHERE status IN (&#039;complete&#039;,&#039;failed&#039;,&#039;canceled&#039;)\n               AND scheduled_date_gmt &lt; %s\n             LIMIT 500&quot;,\n            $cutoff\n        ));\n    } while ( $deleted === 500 );\n}<\/pre>\n\n\n\n<p>For routine cleanup, prefer the built-in WP-CLI <code>clean<\/code> command shown later \u2014 it removes orphaned logs too, not just the action rows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fix 3 \u2014 Deduplicate Before Scheduling<\/h3>\n\n\n\n<p>A big source of bloat is code that schedules an action without checking whether one is already pending.<\/p>\n\n\n\n<p>WooCommerce core guards against this \u2014 many third-party plugins do not.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\/**\n * Safe single-action scheduler \u2014 avoids duplicate pending actions.\n *\n * @param string $hook  Action hook name.\n * @param array  $args  Arguments passed to the action.\n * @param int    $delay Seconds from now to run.\n * @return int|false    Action ID, or false if one is already scheduled.\n *\/\nfunction schedule_once( $hook, $args = &#091;], $delay = 0 ) {\n    if ( as_has_scheduled_action( $hook, $args ) ) {\n        return false; \/\/ Already pending \u2014 skip\n    }\n    return as_schedule_single_action(\n        time() + $delay,\n        $hook,\n        $args,\n        &#039;my-plugin-group&#039;\n    );\n}\n\n\/\/ Usage: a single, de-duplicated inventory sync per order\nadd_action( &#039;woocommerce_order_status_processing&#039;, function( $order_id ) {\n    schedule_once(\n        &#039;sync_inventory_for_order&#039;,\n        &#091; &#039;order_id&#039; =&gt; $order_id ],\n        30\n    );\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Fix 4 \u2014 Keep the Indexes Healthy<\/h3>\n\n\n\n<p>Past a few million rows, MySQL&#8217;s planner can misjudge the table and fall back to a full scan on the claim query.<\/p>\n\n\n\n<p>Refresh statistics and confirm the composite claim index is present.<\/p>\n\n\n\n<p>Run these with <code>wp db query &lt; fix-indexes.sql<\/code>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">-- Refresh planner statistics\nANALYZE TABLE wp_actionscheduler_actions;\n\n-- Rebuild the table to defragment indexes (online on MySQL 5.7+ \/ MariaDB 10.3+)\nALTER TABLE wp_actionscheduler_actions ENGINE=InnoDB;\n\n-- Action Scheduler ships this composite index for the claim query.\n-- Confirm it exists:\nSHOW INDEX FROM wp_actionscheduler_actions\nWHERE Key_name = &#039;claim_id_status_scheduled_date_gmt&#039;;\n\n-- If it is somehow missing, recreate it\nCREATE INDEX claim_id_status_scheduled_date_gmt\n    ON wp_actionscheduler_actions (claim_id, status, scheduled_date_gmt);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Architectural Upgrades for High-Volume Stores<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Replace WP-Cron with a Real System Cron<\/h3>\n\n\n\n<p>This is the single highest-impact change.<\/p>\n\n\n\n<p>Stop firing cron on page loads and run it on a fixed schedule instead.<\/p>\n\n\n\n<p><strong>Step 1<\/strong> \u2014 Disable WP-Cron&#8217;s HTTP trigger in <code>wp-config.php<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">define( &#039;DISABLE_WP_CRON&#039;, true );<\/pre>\n\n\n\n<p><strong>Step 2<\/strong> \u2014 Add a real cron entry with <code>crontab -e<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\"># Run all due WP-Cron events every minute\n* * * * * \/usr\/local\/bin\/wp --path=\/var\/www\/html cron event run --due-now --quiet &gt;&gt; \/var\/log\/wpcron.log 2&gt;&amp;1\n\n# Drive the Action Scheduler queue directly for higher throughput.\n# --force overrides the concurrent-batch limit, so keep this to a single\n# entry to avoid overlapping runs piling onto the database.\n* * * * * \/usr\/local\/bin\/wp --path=\/var\/www\/html action-scheduler run --force &gt;&gt; \/var\/log\/as-runner.log 2&gt;&amp;1<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">WP-CLI Commands for Queue Management<\/h3>\n\n\n\n<p>Running the queue from the command line avoids the constraints of a normal web request, which makes it the better tool for large queues.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\"># Overall queue status (counts by status)\nwp action-scheduler status\n\n# Run the queue now \u2014 useful after a cron gap. --force ignores concurrency limits.\nwp action-scheduler run --force\n\n# Clean up old actions. Defaults to &#039;complete&#039; and &#039;canceled&#039; older than ~31 days.\nwp action-scheduler clean --batch-size=200 --pause=1\n\n# Target a specific status and age, in chunks, pausing between batches\nwp action-scheduler clean --status=failed --batch-size=100 --before=&#039;30 days ago&#039; --pause=2<\/pre>\n\n\n\n<p>There is no top-level <code>cancel<\/code> or <code>delete<\/code> command \u2014 pruning is done through <code>clean<\/code>.<\/p>\n\n\n\n<p>To cancel specific actions, use <code>as_unschedule_all_actions( $hook )<\/code> in code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Monitor the Queue So It Never Surprises You Again<\/h2>\n\n\n\n<p>Reactive debugging is expensive.<\/p>\n\n\n\n<p>The monitor below schedules itself and alerts Slack when a threshold is crossed \u2014 before customers notice.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">&lt;?php\n\/**\n * Self-scheduling queue health monitor.\n * Runs every 5 minutes via Action Scheduler.\n * Add to: \/wp-content\/mu-plugins\/as-monitor.php\n *\/\n\nadd_action( &#039;init&#039;, function() {\n    if ( ! function_exists( &#039;as_has_scheduled_action&#039; ) ) {\n        return;\n    }\n    if ( ! as_has_scheduled_action( &#039;monitor_as_queue_health&#039; ) ) {\n        as_schedule_recurring_action(\n            time(),\n            5 * MINUTE_IN_SECONDS,\n            &#039;monitor_as_queue_health&#039;,\n            &#091;],\n            &#039;monitoring&#039;\n        );\n    }\n});\n\nadd_action( &#039;monitor_as_queue_health&#039;, function() {\n    $store      = ActionScheduler::store();\n    $thresholds = &#091;\n        &#039;pending_max&#039;     =&gt; 10000,\n        &#039;in_progress_max&#039; =&gt; 50,\n        &#039;failed_max&#039;      =&gt; 100,\n    ];\n\n    \/\/ Pass &#039;count&#039; as the query type to get totals, not row data\n    $pending     = $store-&gt;query_actions( &#091; &#039;status&#039; =&gt; &#039;pending&#039; ],     &#039;count&#039; );\n    $in_progress = $store-&gt;query_actions( &#091; &#039;status&#039; =&gt; &#039;in-progress&#039; ], &#039;count&#039; );\n    $failed      = $store-&gt;query_actions( &#091; &#039;status&#039; =&gt; &#039;failed&#039; ],      &#039;count&#039; );\n\n    $alerts = &#091;];\n\n    if ( $pending &gt; $thresholds&#091;&#039;pending_max&#039;] ) {\n        $alerts&#091;] = &quot;Pending queue: {$pending} actions&quot;;\n    }\n    if ( $in_progress &gt; $thresholds&#091;&#039;in_progress_max&#039;] ) {\n        $alerts&#091;] = &quot;Stuck in-progress: {$in_progress} actions&quot;;\n    }\n    if ( $failed &gt; $thresholds&#091;&#039;failed_max&#039;] ) {\n        $alerts&#091;] = &quot;Failed actions: {$failed}&quot;;\n    }\n\n    if ( ! empty( $alerts ) ) {\n        $webhook = get_option( &#039;slack_webhook_url&#039; );\n        if ( ! $webhook ) {\n            return;\n        }\n        wp_remote_post( $webhook, &#091;\n            &#039;body&#039;    =&gt; wp_json_encode( &#091;\n                &#039;text&#039; =&gt; &#039;*Action Scheduler Alert* | &#039; . get_bloginfo( &#039;name&#039; )\n                          . &quot;\\n&quot; . implode( &quot;\\n&quot;, $alerts ),\n            ] ),\n            &#039;headers&#039; =&gt; &#091; &#039;Content-Type&#039; =&gt; &#039;application\/json&#039; ],\n        ]);\n    }\n});<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Where to Start \u2014 Impact vs. Effort<\/h2>\n\n\n\n<p>You don&#8217;t need to apply everything at once.<\/p>\n\n\n\n<p>Work top to bottom \u2014 the high-impact, low-effort wins come first.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Optimization<\/th><th>Expected Impact<\/th><th>Effort<\/th><\/tr><\/thead><tbody><tr><td>Real system cron<\/td><td>High \u2014 removes traffic-driven timing gaps<\/td><td>Low<\/td><\/tr><tr><td>Increase batch size<\/td><td>High \u2014 roughly 4x throughput per run<\/td><td>Low<\/td><\/tr><tr><td>Reduce log retention<\/td><td>High \u2014 large table-size reduction<\/td><td>Low<\/td><\/tr><tr><td>Index maintenance<\/td><td>Medium \u2014 restores claim-query efficiency<\/td><td>Medium<\/td><\/tr><tr><td>Deduplicate scheduling<\/td><td>Medium \u2014 stops re-accumulation<\/td><td>Medium<\/td><\/tr><tr><td>Concurrent runners<\/td><td>High \u2014 near-linear scaling, watch server load<\/td><td>Medium<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Action Scheduler is solid engineering, but it was designed for moderate workloads rather than stores processing thousands of orders daily. Its biggest risk is that performance issues develop gradually instead of causing obvious failures.<\/p>\n\n\n\n<p>As delays accumulate, renewals can run late and pending actions can grow rapidly. Fixing the bottleneck requires a layered approach with queue optimization, database maintenance, and ongoing monitoring.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you run a busy WooCommerce store, a lot of what keeps it alive happens quietly in the background. Order emails, renewals, inventory syncs, and webhooks never run on the page the customer sees. The engine behind all of that is Action Scheduler. It works beautifully at first. But on high-volume stores, it slowly becomes <a href=\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\">[&#8230;]<\/a><\/p>\n","protected":false},"author":612,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1773],"tags":[],"class_list":["post-542065","post","type-post","status-publish","format-standard","hentry","category-woocommerce"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WordPress Action Scheduler Limits with High-Volume Stores - Webkul Blog<\/title>\n<meta name=\"description\" content=\"Discover how Action Scheduler impacts high-volume WooCommerce stores and learn proven ways to diagnose bottlenecks and boost performance.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WordPress Action Scheduler Limits with High-Volume Stores - Webkul Blog\" \/>\n<meta property=\"og:description\" content=\"Discover how Action Scheduler impacts high-volume WooCommerce stores and learn proven ways to diagnose bottlenecks and boost performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\" \/>\n<meta property=\"og:site_name\" content=\"Webkul Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webkul\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-02T09:11:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-02T09:12:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp\" \/>\n<meta name=\"author\" content=\"Satish Tiwari\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webkul\" \/>\n<meta name=\"twitter:site\" content=\"@webkul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Satish Tiwari\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\"},\"author\":{\"name\":\"Satish Tiwari\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/e5bee80ea33c27cfbc1a924d884ad45a\"},\"headline\":\"WordPress Action Scheduler Limits with High-Volume Stores\",\"datePublished\":\"2026-07-02T09:11:57+00:00\",\"dateModified\":\"2026-07-02T09:12:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\"},\"wordCount\":1689,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp\",\"articleSection\":[\"WooCommerce\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\",\"url\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\",\"name\":\"WordPress Action Scheduler Limits with High-Volume Stores - Webkul Blog\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp\",\"datePublished\":\"2026-07-02T09:11:57+00:00\",\"dateModified\":\"2026-07-02T09:12:51+00:00\",\"description\":\"Discover how Action Scheduler impacts high-volume WooCommerce stores and learn proven ways to diagnose bottlenecks and boost performance.\",\"breadcrumb\":{\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-scaled.webp\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-scaled.webp\",\"width\":2560,\"height\":2507},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webkul.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress Action Scheduler Limits with High-Volume Stores\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webkul.com\/blog\/#website\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"name\":\"Webkul Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webkul.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webkul.com\/blog\/#organization\",\"name\":\"WebKul Software Private Limited\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"width\":380,\"height\":380,\"caption\":\"WebKul Software Private Limited\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webkul\/\",\"https:\/\/x.com\/webkul\",\"https:\/\/www.instagram.com\/webkul\/\",\"https:\/\/www.linkedin.com\/company\/webkul\",\"https:\/\/www.youtube.com\/user\/webkul\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/e5bee80ea33c27cfbc1a924d884ad45a\",\"name\":\"Satish Tiwari\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1f76693dee3ae6960710aa365820ad57841f56e1593ab8c85f516247d47ee4b5?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1f76693dee3ae6960710aa365820ad57841f56e1593ab8c85f516247d47ee4b5?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"caption\":\"Satish Tiwari\"},\"description\":\"Satish, a skilled Software Engineer, specializes in WooCommerce, focusing on WordPress Theme and Headless Development. Expertise drives innovative, custom solutions that enhance user experiences and deliver high-performance results across eCommerce platforms.\",\"url\":\"https:\/\/webkul.com\/blog\/author\/satishtiwari-mg628webkul-in\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WordPress Action Scheduler Limits with High-Volume Stores - Webkul Blog","description":"Discover how Action Scheduler impacts high-volume WooCommerce stores and learn proven ways to diagnose bottlenecks and boost performance.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/","og_locale":"en_US","og_type":"article","og_title":"WordPress Action Scheduler Limits with High-Volume Stores - Webkul Blog","og_description":"Discover how Action Scheduler impacts high-volume WooCommerce stores and learn proven ways to diagnose bottlenecks and boost performance.","og_url":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/","og_site_name":"Webkul Blog","article_publisher":"https:\/\/www.facebook.com\/webkul\/","article_published_time":"2026-07-02T09:11:57+00:00","article_modified_time":"2026-07-02T09:12:51+00:00","og_image":[{"url":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp","type":"","width":"","height":""}],"author":"Satish Tiwari","twitter_card":"summary_large_image","twitter_creator":"@webkul","twitter_site":"@webkul","twitter_misc":{"Written by":"Satish Tiwari","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#article","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/"},"author":{"name":"Satish Tiwari","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/e5bee80ea33c27cfbc1a924d884ad45a"},"headline":"WordPress Action Scheduler Limits with High-Volume Stores","datePublished":"2026-07-02T09:11:57+00:00","dateModified":"2026-07-02T09:12:51+00:00","mainEntityOfPage":{"@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/"},"wordCount":1689,"commentCount":0,"publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"image":{"@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage"},"thumbnailUrl":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp","articleSection":["WooCommerce"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/","url":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/","name":"WordPress Action Scheduler Limits with High-Volume Stores - Webkul Blog","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage"},"image":{"@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage"},"thumbnailUrl":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-1046x1024.webp","datePublished":"2026-07-02T09:11:57+00:00","dateModified":"2026-07-02T09:12:51+00:00","description":"Discover how Action Scheduler impacts high-volume WooCommerce stores and learn proven ways to diagnose bottlenecks and boost performance.","breadcrumb":{"@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#primaryimage","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-scaled.webp","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2026\/06\/wp-cron-lock-contention-scaled.webp","width":2560,"height":2507},{"@type":"BreadcrumbList","@id":"https:\/\/webkul.com\/blog\/wordpress-action-scheduler-with-high-volume-stores\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webkul.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WordPress Action Scheduler Limits with High-Volume Stores"}]},{"@type":"WebSite","@id":"https:\/\/webkul.com\/blog\/#website","url":"https:\/\/webkul.com\/blog\/","name":"Webkul Blog","description":"","publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webkul.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webkul.com\/blog\/#organization","name":"WebKul Software Private Limited","url":"https:\/\/webkul.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","width":380,"height":380,"caption":"WebKul Software Private Limited"},"image":{"@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webkul\/","https:\/\/x.com\/webkul","https:\/\/www.instagram.com\/webkul\/","https:\/\/www.linkedin.com\/company\/webkul","https:\/\/www.youtube.com\/user\/webkul\/"]},{"@type":"Person","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/e5bee80ea33c27cfbc1a924d884ad45a","name":"Satish Tiwari","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1f76693dee3ae6960710aa365820ad57841f56e1593ab8c85f516247d47ee4b5?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1f76693dee3ae6960710aa365820ad57841f56e1593ab8c85f516247d47ee4b5?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","caption":"Satish Tiwari"},"description":"Satish, a skilled Software Engineer, specializes in WooCommerce, focusing on WordPress Theme and Headless Development. Expertise drives innovative, custom solutions that enhance user experiences and deliver high-performance results across eCommerce platforms.","url":"https:\/\/webkul.com\/blog\/author\/satishtiwari-mg628webkul-in\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/542065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/users\/612"}],"replies":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/comments?post=542065"}],"version-history":[{"count":29,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/542065\/revisions"}],"predecessor-version":[{"id":546883,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/542065\/revisions\/546883"}],"wp:attachment":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/media?parent=542065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/categories?post=542065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/tags?post=542065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}