{"id":375909,"date":"2026-09-27T22:31:18","date_gmt":"2026-09-27T22:31:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/scheduler-watchdog-stop-runaway-background-jobs\/"},"modified":"2026-09-27T22:49:07","modified_gmt":"2026-09-27T22:49:07","slug":"tillfoundry-scheduler-watchdog","status":"publish","type":"plugin","link":"https:\/\/dsb.wordpress.org\/plugins\/tillfoundry-scheduler-watchdog\/","author":15849168,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.7","stable_tag":"0.1.7","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"TillFoundry Scheduler Watchdog","header_author":"TillFoundry","header_description":"Scheduler Watchdog watches every Action Scheduler queue on your store, times and failure-tracks each hook, emails you the moment a hook breaks or stalls, and cleans up old actions safely.","assets_banners_color":"212c40","last_updated":"2026-09-27 22:49:07","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/tillfoundry.com\/product\/scheduler-watchdog\/","header_author_uri":"https:\/\/tillfoundry.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.7":{"tag":"0.1.7","author":"lijnam","date":"2026-09-27 22:49:07","revision":3716116}},"upgrade_notice":{"0.1.7":"<p>Recommended for every store. Fixes a saved-but-ignored setting: the slow-hook threshold now filters the slowest-hooks table and REST response, numeric settings enforce their declared minimum on save, and the &quot;Action Scheduler is required&quot; notice now appears on the plugin&#039;s own screens.<\/p>","0.1.6":"<p>Recommended for every store. Internal rename only: the plugin is the same Scheduler Watchdog, now named TillFoundry Scheduler Watchdog with its text domain aligned to the WordPress.org directory slug. Monitoring, alerting and cleanup are unchanged and no settings migrate.<\/p>","0.1.5":"<p>Recommended for every store. The retention settings are now visibly reconciled with Action Scheduler&#039;s own cleaner: the Cleanup tab reports the effective retention the store is actually getting, so a longer &quot;Keep ... (days)&quot; value is visibly honoured instead of silently cut short.<\/p>","0.1.4":"<p>Recommended for every store. Retention settings now demonstrably govern Action Scheduler&#039;s own cleaner as well as Scheduler Watchdog&#039;s cleanup, and a disabled watchdog no longer changes Action Scheduler&#039;s cleanup behaviour.<\/p>","0.1.3":"<p>Recommended for every store. A Shop Manager who can manage the plugin no longer sees the Developer tab, the queue-health cards explain themselves in visible text, touch controls get larger tap targets, and the licence wording now makes clear that no key is required.<\/p>","0.1.2":"<p>Recommended for anyone who has raised a &quot;Keep ... (days)&quot; retention setting: older complete, canceled and failed actions are no longer deleted earlier than configured by Action Scheduler&#039;s own cleaner. Also rebuilds the package from the current source.<\/p>","0.1.1":"<p>Recommended for anyone who has raised a &quot;Keep ... (days)&quot; retention setting, so older complete, canceled or failed actions are not deleted earlier than configured by Action Scheduler&#039;s own cleaner.<\/p>","0.1.0":"<p>Initial release. No action needed.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3716117,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3716117,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3716117,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3716117,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3716117,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3716117,"resolution":"1","location":"assets","locale":"","width":1440,"height":1080},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3716117,"resolution":"2","location":"assets","locale":"","width":1440,"height":1080},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3716117,"resolution":"3","location":"assets","locale":"","width":1440,"height":1080},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3716117,"resolution":"4","location":"assets","locale":"","width":1440,"height":1080}},"screenshots":{"1":"The queue health dashboard: 12,480 pending actions, the failures in the last fifteen minutes, and the hooks behind both.","2":"The event log, filtered by severity, hook and date \u2014 each alert with the message that explains it.","3":"Thresholds: what counts as a runaway job, how long a hook may take, and what happens when one appears.","4":"Cleanup: the dry-run preview of what a cleanup would remove before anything is deleted."}},"plugin_section":[262246],"plugin_tags":[225911,1110,283022,5603,286],"plugin_category":[45,54],"plugin_contributors":[200752],"plugin_business_model":[],"class_list":["post-375909","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-action-scheduler","plugin_tags-alerts","plugin_tags-background-jobs","plugin_tags-monitoring","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-security-and-spam-protection","plugin_contributors-lijnam","plugin_committers-lijnam"],"banners":{"banner":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/banner-772x250.png?rev=3716117","banner_2x":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/banner-1544x500.png?rev=3716117","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/icon.svg?rev=3716117","icon":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/icon.svg?rev=3716117","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/screenshot-1.png?rev=3716117","caption":"The queue health dashboard: 12,480 pending actions, the failures in the last fifteen minutes, and the hooks behind both."},{"src":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/screenshot-2.png?rev=3716117","caption":"The event log, filtered by severity, hook and date \u2014 each alert with the message that explains it."},{"src":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/screenshot-3.png?rev=3716117","caption":"Thresholds: what counts as a runaway job, how long a hook may take, and what happens when one appears."},{"src":"https:\/\/ps.w.org\/tillfoundry-scheduler-watchdog\/assets\/screenshot-4.png?rev=3716117","caption":"Cleanup: the dry-run preview of what a cleanup would remove before anything is deleted."}],"raw_content":"<!--section=description-->\n<p>Every WooCommerce background job runs through Action Scheduler: marketing and CRM sync, ERP and 3PL pushes, subscription renewals, review requests, email follow-ups, importers. When one integration misbehaves it can enqueue hundreds of thousands of actions or fire them in an ever-tightening loop. PHP workers are consumed, the database is hammered, and the storefront starts returning errors.<\/p>\n\n<p>Scheduler Watchdog sits beside Action Scheduler and watches it continuously.<\/p>\n\n<ul>\n<li>It samples queue depth and per-hook backlog.<\/li>\n<li>It times every action and records failures through Action Scheduler's own execution hooks.<\/li>\n<li>It shows one screen: total pending and past-due counts, the hooks with the highest failure rate, the slowest hooks, the biggest backlogs and the active alerts.<\/li>\n<li>It emails you the moment a hook breaks, stalls, or the queue runner stops firing.<\/li>\n<li>It cleans up old completed, failed and canceled actions under your retention rules, using Action Scheduler's own cleaner so nothing is deleted behind its back.<\/li>\n<\/ul>\n\n<p><strong>Built for real stores<\/strong><\/p>\n\n<ul>\n<li>Zero configuration to get started \u2014 activate it and the defaults are sensible.<\/li>\n<li>Every feature in this plugin is free, with no licence key and no locked capability.<\/li>\n<li>No tracking. The plugin makes no outbound request unless you enter a licence key.<\/li>\n<li>WooCommerce High-Performance Order Storage (HPOS) compatible.<\/li>\n<li>Works with Action Scheduler 3.9.x and 4.x, whether it is bundled inside WooCommerce or installed standalone.<\/li>\n<\/ul>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li>A dashboard of queue depth, pending, past-due, in-progress and failed-in-window counts.<\/li>\n<li>Top failing hooks, slowest hooks and largest backlogs.<\/li>\n<li>A WordPress dashboard widget.<\/li>\n<li>Email alerts for failed actions, stalled\/past-due hooks, a missing or overdue queue runner, and stale in-progress claims.<\/li>\n<li>A per-alert cooldown so you are not flooded.<\/li>\n<li>Safe, retention-based cleanup of old complete, failed and canceled actions \u2014 one click or on a daily schedule.<\/li>\n<li>Stale-claim recovery.<\/li>\n<li>Full control of alert recipients, thresholds and retention.<\/li>\n<\/ul>\n\n<p>Scheduler Watchdog never reads or writes orders, order items, refunds or customer records. It operates only on Action Scheduler's own queue. It stores no order, customer, refund or order-item data. The personal data it does store is limited to the alert-recipient email addresses you configure in its settings, and a small per-user notice flag that remembers which of the plugin's admin notices you have dismissed or still need to see.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This free plugin contacts no external service on its own: it declares only free capabilities, every one of them works with no licence key, and a site that never enters a key makes no outbound request. The optional licence client is retained as a dormant key-validation endpoint only; no paid plan is on sale, no capability is gated behind it, and it stays dormant until you choose to enter a key. If you do enter a key, it is sent to the TillFoundry licence server at <code>https:\/\/tillfoundry.com<\/code> <strong>only after you save it<\/strong>.<\/p>\n\n<p>The licence endpoints are:<\/p>\n\n<ul>\n<li><code>https:\/\/tillfoundry.com\/api\/v1\/activate<\/code> \u2014 called when you save a licence key, to register this installation against the key.<\/li>\n<li><code>https:\/\/tillfoundry.com\/api\/v1\/validate<\/code> \u2014 called when you press <strong>Verify licence now<\/strong>, and automatically in the background at most every twelve hours while a key is stored, to confirm the key is still valid.<\/li>\n<li><code>https:\/\/tillfoundry.com\/api\/v1\/deactivate<\/code> \u2014 called when you press <strong>Deactivate this site<\/strong>, to release the activation slot.<\/li>\n<\/ul>\n\n<p>Each request sends the same installation record plus the licence key:<\/p>\n\n<ul>\n<li>the licence key;<\/li>\n<li>the site URL and home URL;<\/li>\n<li>the plugin slug and plugin version;<\/li>\n<li>the WordPress version and PHP version;<\/li>\n<li>whether the site is multisite;<\/li>\n<li>the site locale.<\/li>\n<\/ul>\n\n<p>The request also carries the site URL in an <code>X-Site-URL<\/code> header and in the user-agent string. The service records the request IP address. See the provider's <a href=\"https:\/\/tillfoundry.com\/privacy-policy\/\">privacy policy<\/a> and <a href=\"https:\/\/tillfoundry.com\/terms\/\">terms of service<\/a>.<\/p>\n\n<p>If the licence server is unreachable, the plugin keeps working: monitoring, alerting and cleanup never depend on it, and a previously validated licence stays valid until the server can be reached again. No error from the licence service blocks a page or an admin action.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the ZIP through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, or upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Open <strong>WooCommerce \u2192 Scheduler Watchdog<\/strong> (or <strong>Tools \u2192 Scheduler Watchdog<\/strong> when WooCommerce is not active).<\/li>\n<li>Review the settings. No licence key is needed.<\/li>\n<\/ol>\n\n<p>Action Scheduler must be present for the plugin to do anything. It ships inside WooCommerce, or can be installed as a standalone plugin. The plugin declares no hard plugin dependency, so WordPress never blocks its activation over a missing plugin: it activates on any WordPress site that meets the version requirements, and when Action Scheduler is absent it shows a dismissible admin notice naming Action Scheduler as required and otherwise stays inert.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20require%20woocommerce%3F\"><h3>Does this plugin require WooCommerce?<\/h3><\/dt>\n<dd><p>No. WooCommerce is not required, and the plugin declares no hard plugin dependency, so WordPress will not refuse to activate it when WooCommerce is absent. Action Scheduler is the real dependency. WooCommerce bundles Action Scheduler, so on a normal store it is already there. If you run Action Scheduler standalone, monitoring, alerting and cleanup all work too; only the WooCommerce-specific HPOS declaration and the built-in WooCommerce critical-hook presets are skipped. When Action Scheduler itself is missing, the plugin still activates but stays inert and tells you what is missing.<\/p><\/dd>\n<dt id=\"what%20is%20action%20scheduler%3F\"><h3>What is Action Scheduler?<\/h3><\/dt>\n<dd><p>Action Scheduler is the background job queue used by WooCommerce and many extensions. Every scheduled task is stored as an \"action\" with a hook name, a due date and a status. Scheduler Watchdog reads that queue to measure it.<\/p><\/dd>\n<dt id=\"is%20there%20a%20paid%20plan%3F\"><h3>Is there a paid plan?<\/h3><\/dt>\n<dd><p>No paid plan is on sale. The complete plugin is free to download and use, with no licence key, no trial, no time limit and no capability that switches off. Monitoring, email alerting and safe cleanup are all included. Updates are manual downloads from this store: the plugin registers no WordPress update channel and checks for no update of its own.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20delete%20my%20jobs%3F\"><h3>Does the plugin delete my jobs?<\/h3><\/dt>\n<dd><p>Never pending or in-progress work. Cleanup only ever removes old <strong>complete<\/strong>, <strong>failed<\/strong> and <strong>canceled<\/strong> actions, through Action Scheduler's own cleaner. There are hard minimum ages of 7 days for complete\/canceled actions and 30 days for failed actions, regardless of what the settings say. A longer \"keep\" value is also applied to Action Scheduler's own cleaner \u2014 which otherwise removes complete\/canceled actions after 31 days and failed actions after about 90 days on its own schedule \u2014 so raising the setting to keep a year of history is actually honoured. Cleanup is off until you enable it, and a preview button shows exactly what would be removed first.<\/p><\/dd>\n<dt id=\"where%20are%20the%20debug%20logs%3F\"><h3>Where are the debug logs?<\/h3><\/dt>\n<dd><p>Enable <strong>Debug logging<\/strong> on the <strong>Advanced<\/strong> tab, then open <strong>WooCommerce \u2192 Status \u2192 Logs<\/strong> and select the <code>scheduler-watchdog<\/code> source. Without WooCommerce, entries go to the PHP error log instead.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20a%20high-volume%20store%3F\"><h3>Does it work on a high-volume store?<\/h3><\/dt>\n<dd><p>Yes. The metrics table is time-bucketed and pruned on a daily retention run (14 days by default), the dashboard caps the number of hooks it reads, and the shutdown fallback sampler is throttled to once a minute. On stores processing 500+ orders a day, sampling remains cheap because the hot path only writes to memory and flushes once per request.<\/p><\/dd>\n<dt id=\"is%20it%20hpos%20compatible%3F\"><h3>Is it HPOS compatible?<\/h3><\/dt>\n<dd><p>Yes. Scheduler Watchdog does not touch order storage at all. WooCommerce \u2192 Status \u2192 Compatibility lists it as HPOS compatible.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20my%20data%20anywhere%3F\"><h3>Does the plugin send my data anywhere?<\/h3><\/dt>\n<dd><p>Only if you enter a licence key, and then only to the licence server at <code>https:\/\/tillfoundry.com<\/code> to activate or validate that key. See <strong>External Services<\/strong> below for the exact endpoints and the data sent. Nothing is sent when no key is entered. No analytics, no telemetry, no external alerting service.<\/p><\/dd>\n<dt id=\"what%20does%20gdpr%20erasure%20mean%20for%20this%20plugin%3F\"><h3>What does GDPR erasure mean for this plugin?<\/h3><\/dt>\n<dd><p>Scheduler Watchdog stores no order, customer, refund or order-item data. It records the Action Scheduler hook names, counts, durations and action IDs it needs to measure the queue. It also stores two things that can contain personal data: the alert-recipient email addresses you configure, kept in the <code>scheduler_watchdog_settings<\/code> option, and per-user notice state kept in the <code>scheduler_watchdog_dismissed_notices<\/code> and <code>scheduler_watchdog_queued_notices<\/code> user-meta keys, which remembers which plugin notices a user has dismissed or still needs to see. To remove the recipient addresses, clear the <strong>Alert recipients<\/strong> field in the plugin settings. The per-user notice state is removed automatically when the affected WordPress user account is deleted. Enabling <strong>Delete data on uninstall<\/strong> removes the plugin's settings, custom tables and transients when the plugin is deleted. Failed actions can also record the error text returned by the failing integration in the plugin's own events log.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Fixed: the <strong>Flag a hook as slow above this average duration<\/strong> setting now actually decides which hooks are reported as slow. Raising the threshold hides faster hooks from the slowest-hooks table and the REST response, and lowering it surfaces more; previously the value was saved and shown but never applied, so the setting was a no-op and the on-screen promise was false.<\/li>\n<li>Fixed: every numeric setting now enforces its declared minimum on save. A crafted or malformed request could previously store 0 for fields documented as 1 or more \u2014 the top-hooks limit, the slow-hook threshold, the failure and stall thresholds, the queue-depth warning, the cleanup batch size and the retention ages \u2014 even though the on-screen field showed a floor. The 60-second minimum for the sample interval and the 7-day\/30-day cleanup floors are unchanged.<\/li>\n<li>Fixed: the <strong>Action Scheduler is required<\/strong> admin notice now appears on the plugin's own screens instead of only the WordPress dashboard. The dismissal check matched the text domain rather than the real screen id, so the notice was confined to <code>index.php<\/code> and a merchant whose Action Scheduler was missing never saw it where they could act on it.<\/li>\n<li>Fixed: the admin stylesheet and script are now enqueued using the plugin's declared menu slug, matching the same real screen ids, so the admin bundle loads on every Scheduler Watchdog screen and on no unrelated admin page.<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Changed: the plugin is now named <strong>TillFoundry Scheduler Watchdog<\/strong> and its text domain is <code>tillfoundry-scheduler-watchdog<\/code>, matching the WordPress.org directory slug. The admin menu slugs, store product slug, plugin file name and licence endpoints are unchanged, so no bookmark, setting or stored data moves.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Changed: the retention settings are now visibly reconciled with Action Scheduler's own cleaner. The Cleanup tab shows the effective retention the store is actually getting: a panel reports what Action Scheduler's own cleaner will keep (through the <code>action_scheduler_retention_period<\/code> filter and, on Action Scheduler 4.x, <code>action_scheduler_retention_period_for_failed<\/code>) next to what Scheduler Watchdog's own cleanup deletes. A merchant who asks to keep a year of history can now see that Action Scheduler honours it instead of losing the log at 31 days.<\/li>\n<li>Changed: on Action Scheduler 3.9.x, which does not purge failed actions itself, the panel says so instead of implying a failed-action retention period that core ignores.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Changed: retention settings are reconciled with Action Scheduler's own cleaner. A \"Keep complete actions (days)\", \"Keep canceled actions (days)\" or \"Keep failed actions (days)\" value above Action Scheduler's 31-day (complete\/canceled) or ~90-day (failed) default is now honoured by Action Scheduler's daily cleanup as well as by Scheduler Watchdog's own run. Action Scheduler's built-in default is never shortened; a shorter value still takes effect through Scheduler Watchdog's own cleanup and its 7-day\/30-day hard floors.<\/li>\n<li>Fixed: the retention filters are now inert while the master \"Enable Scheduler Watchdog\" switch is off, so a disabled watchdog no longer changes Action Scheduler's cleanup behaviour.<\/li>\n<li>Fixed: the stored licence key is masked in the Licence tab instead of being printed in the clear, and an unchanged masked field is never re-verified as if it were the key. Settings notices are escaped before they are printed.<\/li>\n<li>Release metadata: <code>Tested up to<\/code> is 6.0, the WordPress version this build is tested against.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Accessibility: each queue-health card now explains itself in visible text instead of a tooltip, so a sighted touch or keyboard user can read what \"Stale claims\" and the other cards mean. The text is still available to assistive technology.<\/li>\n<li>Accessibility: the dashboard, settings and event screen controls get a 44x44px minimum tap target on touch (coarse-pointer) devices, and the event screen gains the same visible focus outlines as the rest of the admin.<\/li>\n<li>The Developer tab and its two frontend switches are now shown and saved only for administrators with <code>manage_options<\/code>. A Shop Manager who can manage the plugin no longer sees them, and a save by that user leaves their stored values alone instead of resetting them.<\/li>\n<li>The Event Log and Settings submenu items now use short labels rather than repeating \"Scheduler Watchdog:\" in front of each.<\/li>\n<li>When Action Scheduler is not active, the dashboard shows a short \"No queue to watch yet\" empty state instead of repeating the full environment notice that already appears above it.<\/li>\n<li>The licence-expired message now says that every feature keeps working, so no action is needed. The licence status table no longer prints a \"Plan\" row.<\/li>\n<li>The Verify licence control now shows its no-JavaScript instruction before the disabled button, and the licence row wraps cleanly on narrow screens.<\/li>\n<li>The dashboard stops polling for fresh numbers while its browser tab is hidden and resumes when the tab becomes visible, so a background tab no longer burns a request per interval.<\/li>\n<li>Rebuilt the distributed package so the release ZIP is byte-identical to the current source tree.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Fixed: \"Keep complete actions (days)\", \"Keep canceled actions (days)\" and \"Keep failed actions (days)\" are now applied to Action Scheduler's own cleaner as well, so a value above Action Scheduler's 31-day (complete\/canceled) or ~90-day (failed) default is not cut short by Action Scheduler's separate daily cleanup. Scheduler Watchdog extends Action Scheduler's retention through its supported filters and never shortens Action Scheduler's own default.<\/li>\n<li>Fixed: rebuilt the distributed package so the release ZIP is byte-identical to the current source tree.<\/li>\n<li>Changed: the Cleanup settings now explain which retention value wins and where the hard minimum ages apply.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fixed: \"Keep complete actions (days)\", \"Keep canceled actions (days)\" and \"Keep failed actions (days)\" are now applied to Action Scheduler's own cleaner as well. A value above Action Scheduler's 31-day (complete\/canceled) or ~90-day (failed) default is no longer cut short by Action Scheduler's separate daily cleanup.<\/li>\n<li>Changed: the Cleanup settings now explain which retention value wins and where the hard minimum ages apply.<\/li>\n<li>Changed: the privacy wording is now specific. The readme makes no blanket no-personal-data claim; it states that no order, customer, refund or order-item data is stored and names the alert-recipient addresses and per-user notice state that are.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Queue health dashboard: pending, past-due, in-progress and failed-in-window counts, plus a WordPress dashboard widget.<\/li>\n<li>Top failing hooks, slowest hooks and largest backlogs.<\/li>\n<li>Email alerts for failed actions, stalled\/past-due hooks, a missing or overdue queue runner, and stale in-progress claims, with a per-alert cooldown.<\/li>\n<li>Safe, retention-based cleanup of old complete, failed and canceled actions through Action Scheduler's own cleaner, with hard minimum ages and a preview.<\/li>\n<li>Stale-claim recovery.<\/li>\n<li>Configurable recipients, thresholds and retention.<\/li>\n<li>HPOS compatibility declaration and multisite-aware uninstall behind an explicit opt-in.<\/li>\n<\/ul>","raw_excerpt":"Watch, alert on and clean up runaway WooCommerce background jobs before they take the store down.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/375909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=375909"}],"author":[{"embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lijnam"}],"wp:attachment":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=375909"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=375909"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=375909"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=375909"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=375909"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=375909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}