{"id":368900,"date":"2026-09-27T06:14:48","date_gmt":"2026-09-27T06:14:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/harvify-cron-monitor\/"},"modified":"2026-09-27T06:14:36","modified_gmt":"2026-09-27T06:14:36","slug":"harvify-cron-monitor","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/harvify-cron-monitor\/","author":23508132,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.21","stable_tag":"1.0.21","tested":"7.1.3","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Harvify Cron Monitor","header_author":"harv","header_description":"Monitor, manage, and troubleshoot WordPress cron \u2014 with execution history, overdue\/missed\/broken-cron detection, and Action Scheduler visibility.","assets_banners_color":"8276cb","last_updated":"2026-09-27 06:14:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":139,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.21":{"tag":"1.0.21","author":"jethalal","date":"2026-09-27 06:14:36","revision":3715044}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3715044,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3715044,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3715044,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3715044,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3715044,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.21"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3715058,"resolution":"1","location":"assets","locale":"","width":1078,"height":1100},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3715058,"resolution":"2","location":"assets","locale":"","width":1078,"height":1100},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3715058,"resolution":"3","location":"assets","locale":"","width":1078,"height":993}},"screenshots":{"1":"Every scheduled event, with overdue and broken ones flagged.","2":"Execution history: every run, its duration, memory and status.","3":"A licence adds alerting, auto-retry and multisite."}},"plugin_section":[262246],"plugin_tags":[225911,4567,5603,255120,4568],"plugin_category":[54,59],"plugin_contributors":[280380],"plugin_business_model":[],"class_list":["post-368900","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-action-scheduler","plugin_tags-cron","plugin_tags-monitoring","plugin_tags-scheduled-tasks","plugin_tags-wp-cron","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-jethalal","plugin_committers-jethalal"],"banners":{"banner":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/banner-772x250.png?rev=3715044","banner_2x":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/banner-1544x500.png?rev=3715044","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/icon.svg?rev=3715044","icon":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/icon.svg?rev=3715044","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/screenshot-1.png?rev=3715058","caption":"Every scheduled event, with overdue and broken ones flagged."},{"src":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/screenshot-2.png?rev=3715058","caption":"Execution history: every run, its duration, memory and status."},{"src":"https:\/\/ps.w.org\/harvify-cron-monitor\/assets\/screenshot-3.png?rev=3715058","caption":"A licence adds alerting, auto-retry and multisite."}],"raw_content":"<!--section=description-->\n<p>Harvify Cron Monitor shows you exactly what your site's scheduler is doing \u2014 and tells you when it stops. Unlike basic cron viewers, it records an execution history (duration, memory, success\/error) so you can see what actually ran, not just what is scheduled.<\/p>\n\n<p><strong>Free features:<\/strong><\/p>\n\n<ul>\n<li><strong>List all WP-Cron events<\/strong> \u2014 hook, next run, recurrence, arguments, callbacks<\/li>\n<li><strong>Full event management<\/strong> \u2014 run now, pause\/resume, delete, with a safety guard\non WordPress core events<\/li>\n<li><strong>Add events<\/strong> \u2014 schedule an existing hook by name, or an HTTP request<\/li>\n<li><strong>Execution history with timestamps<\/strong> \u2014 every run, its duration, memory, and\nstatus<\/li>\n<li>Overdue, missed, and broken-cron detection (including DISABLE_WP_CRON\nwarnings)<\/li>\n<li>Action Scheduler queue visibility (precise timing for AS jobs)<\/li>\n<li>CSV export of history<\/li>\n<li><strong>Dashboard widget<\/strong> \u2014 cron health at a glance<\/li>\n<\/ul>\n\n<p><strong>Pro features.<\/strong> These are not part of this plugin and are not included in this\ndownload. They are provided by a separate plugin distributed by Harvify:<\/p>\n\n<ul>\n<li><strong>Alerts on missed, failed and long-running events<\/strong> \u2014 Email, Slack, Discord,\nand Telegram<\/li>\n<li>Auto-retry for failed events (bounded attempts with backoff)<\/li>\n<li><strong>Per-hook performance metrics<\/strong> \u2014 average\/max duration and memory, added by\nthe separate Pro plugin (not included in this download)<\/li>\n<li>Email digests (daily or weekly) summarizing cron activity<\/li>\n<li><strong>Multisite network view<\/strong> \u2014 cron health across every site<\/li>\n<\/ul>\n\n<h3>A note on timing accuracy<\/h3>\n\n<p>Action Scheduler events are measured precisely (we hook its before\/after execution events). WordPress core has no native per-event start\/finish hook, so WP-Cron timings are <strong>best-effort<\/strong>: we bracket each due hook's callback on the cron request and record a fatal\/timeout via the shutdown handler. WP-Cron rows are labelled \"approx.\" in the history so you always know which numbers are exact.<\/p>\n\n<h3>Security<\/h3>\n\n<p>This plugin does not evaluate code. It schedules hooks that already exist on your site, and can optionally perform an HTTP request on a schedule. There is no code editor and no author-supplied code is ever stored or executed.<\/p>\n\n<ul>\n<li>Creating, editing, and running events requires the <code>manage_options<\/code> capability and a valid nonce.<\/li>\n<li>URL events use WordPress's safe HTTP API (SSRF protections apply) and only accept http(s).<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to Freemius, the licensing and update service Harvify uses to\nsell and deliver the Pro tier of its plugins.<\/p>\n\n<p>Nothing is sent to Freemius unless you choose to send it. On activation you are shown\nFreemius's standard opt-in screen. Until you answer it a fresh install makes no\noutbound request at all, and if you choose Skip the free tier stays fully usable\nand still sends nothing. Data is transmitted only when you take one of these\nactions:<\/p>\n\n<ul>\n<li><strong>You click \"Allow &amp; Continue\" on the Freemius opt-in screen.<\/strong> This sends your\nsite address, your administrator email address, and your WordPress, PHP and active\nplugin\/theme details, so Harvify can provide support and know which environments to\ntest against. Skipping that screen sends nothing and leaves the plugin working\nnormally.<\/li>\n<li><strong>You enter a Pro Bundle licence key.<\/strong> This sends the key together with your site\naddress so the licence can be activated for that site. While a licence is active the\nsite also re-checks periodically that it is still valid and whether a Pro update is\navailable.<\/li>\n<\/ul>\n\n<p>Service provided by Freemius, Inc. - https:\/\/freemius.com\/\nTerms of service: https:\/\/freemius.com\/terms\/\nPrivacy policy: https:\/\/freemius.com\/privacy\/<\/p>\n\n<h4>URL cron events (optional, no default destination)<\/h4>\n\n<p>Cron Monitor can run a \"URL event\": a scheduled request to an address you supply. No\nURL event exists until an administrator creates one, and there is no default\ndestination, so a fresh install contacts nothing. An administrator can also switch\nURL events off entirely in Settings, which stops any that already exist from running.<\/p>\n\n<p>Sent: an HTTP GET to the URL you entered. The plugin adds no page content and no\ninformation about your users. As with every HTTP request WordPress makes, the\nstandard request header identifies the sender as \"WordPress\/; \", so the destination you chose can see your site address.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/harvify-cron-monitor\/<\/code><\/li>\n<li>Activate via <strong>Plugins \u2192 Installed Plugins<\/strong><\/li>\n<li>Go to <strong>Harvify \u2192 Cron Monitor<\/strong><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20wp-cron%3F\"><h3>Does this replace WP-Cron?<\/h3><\/dt>\n<dd><p>No. It monitors and manages the existing WP-Cron system and, when present, Action Scheduler. It does not change how cron is triggered.<\/p><\/dd>\n<dt id=\"why%20are%20some%20durations%20marked%20%22approx.%22%3F\"><h3>Why are some durations marked \"approx.\"?<\/h3><\/dt>\n<dd><p>WordPress core does not expose a per-event start\/finish hook, so WP-Cron timings are best-effort. Action Scheduler jobs are measured exactly.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20run%20custom%20php%3F\"><h3>Does this plugin run custom PHP?<\/h3><\/dt>\n<dd><p>No. It schedules hooks that already exist on your site and can make scheduled HTTP requests. It contains no code editor and no evaluator.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.21<\/h4>\n\n<ul>\n<li>Removed the Freemius <code>anonymous_mode<\/code> option, so activation now shows Freemius's\nstandard opt-in screen. Nothing is sent before you answer it, and choosing Skip\nleaves the free tier fully usable and still sends nothing.<\/li>\n<li>The \"External services\" section now describes that flow accurately, and no longer\nlists alert channels that are not part of this download.<\/li>\n<\/ul>\n\n<h4>1.0.18<\/h4>\n\n<ul>\n<li><strong>Removed: scheduled execution of custom PHP \u2014 from the free build and the Pro\nbuild alike.<\/strong> The evaluator, the \"Allow PHP events\" setting, the \"PHP code\" option\non the add-event form and the settings control that switched it on are all gone.\nThis is not a feature that moved behind a licence: no build of 1.0.18 contains it,\nand there is nothing to upgrade to in order to get it back. Any PHP event you had\nscheduled stops running. Schedule an existing hook, or a URL event, instead.<\/li>\n<li>Changed: per-hook performance metrics are now supplied by the separately\ndistributed Pro plugin rather than being present-but-inactive in this download.<\/li>\n<li><strong>Changed: every identifier this plugin owns has been renamed<\/strong> off its old\nthree-character <code>hcm_<\/code> prefix, which is shorter than WordPress.org accepts.\nFunctions, options, cron hooks and the plugin's own actions and filters are now\n  harvify_cron_*; global constants are <code>HARVIFY_CRON_*<\/code>; classes are\n  Harvify_Cron_*.<\/li>\n<li><strong>Developers: the REST namespace is now <code>harvify-cron\/v1<\/code>. The old <code>hcm\/v1<\/code>\nnamespace is GONE and there is no compatibility alias<\/strong> \u2014 any code that calls\n  hcm\/v1 routes will 404 until it is updated. Also renamed: the admin script and\nstyle handle <code>hcm-admin<\/code> is now <code>harvify-cron-admin<\/code>, the localized JavaScript\nobject <code>hcmAdmin<\/code> is now <code>harvifyCronAdmin<\/code>, and the plugin's hooks are now\n  harvify_cron_run_recorded, <code>harvify_cron_digest_frequency_changed<\/code> and\n  harvify_cron_fs_loaded.<\/li>\n<li>Your configuration is carried across for you. On the first page load after\nupdating, your settings, your custom schedules, your uninstall-data preference and\nevery event you had scheduled are migrated onto the new names. Nothing has to be\nre-entered and no event has to be rescheduled by hand. Execution history is\nuntouched \u2014 the database tables are unchanged.<\/li>\n<li>Hardened: the add-event endpoint now rejects any event type other than a\nstandard hook or a URL outright. Previously an unrecognised type was quietly\ntreated as a standard event when a hook name happened to be supplied. Nothing\nwas ever executed either way, but the refusal is now explicit.<\/li>\n<li>Corrected the External services section: URL events are described accurately as a\ncapability that is available by default with no destination configured, and the\ndisclosure now states that WordPress's standard request header identifies your\nsite address to a URL event's destination.<\/li>\n<li>No other behaviour changes. Monitoring, event listing, history, failure detection,\nscheduling and URL events are unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>Added: a single <strong>Support<\/strong> entry in the Harvify menu, so you can reach us from\ninside WordPress. Until now no plugin offered a contact route at all. One entry for\nthe whole suite rather than one per plugin.<\/li>\n<li>No behaviour changes.<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>Added: an <strong>External services<\/strong> section to this readme, naming every third-party\nservice the plugin can contact, exactly what is sent, when, and each provider's terms\nand privacy policy. Required for WordPress.org submission.<\/li>\n<li>Changed: the <code>Contributors<\/code> field now names the correct WordPress.org account.<\/li>\n<li>No behaviour changes.<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>Rebuild: the published 1.0.12 package was generated from an earlier tree. No behaviour\nchanges beyond bringing the package back in step with the source.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Added: a single <strong>Manage licence<\/strong> link on the Plan screen, so an active customer can\ndeactivate this site, change their licence key or re-check their licence without\nneeding a URL from support. No per-plugin Account tab is added.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li><strong>Fixed: updating the plugin did not update its database.<\/strong> WordPress only runs a plugin's\nsetup routine when you <em>activate<\/em> it, never when it updates \u2014 so a change to the plugin's own\ntables never reached sites that had simply updated. On those sites some features failed with a\ndatabase error. The update now applies itself on the next page load.<\/li>\n<li><strong>One upgrade link instead of one per plugin.<\/strong> With several Harvify plugins active the\nmenu showed a row called \"Upgrade\" for each of them, all identically labelled, and it kept\nsaying Upgrade to people who had already bought. They are replaced by a single <strong>Plan<\/strong>\nscreen that says what the bundle costs, what it covers, and whether your licence is active.<\/li>\n<li><strong>The dashboard is quiet again.<\/strong> Each plugin used to add its own \"opt in to make this\nbetter\" notice to the main WordPress dashboard, so five plugins meant five notices. Harvify\nplugins now share one queue: promotional notices appear only on Harvify's own screens, and\nonly one at a time. Licence and account messages are never held back.<\/li>\n<li><strong>Fixed: the \"Data &amp; uninstall\" box covered the page.<\/strong> It was being drawn into the admin\nfooter, which WordPress pins to the bottom of the screen, so it floated on top of whatever was\nunderneath it. It now sits in the page like any other card. Saving it also tells you what it\nsaved, instead of just reloading.<\/li>\n<li><strong>Fixed: the upgrade screen advertised the wrong number of sites.<\/strong> Several plugins listed\nthe Freelancer and Agency plans as covering 5 and 25 sites. They cover 3 and 10.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li><strong>The new \"Data &amp; uninstall\" control did not appear on this plugin's screen.<\/strong> Its shared-package\nloader never listed <code>admin-ui<\/code>, so the package shipped in the download but was never loaded and\nthe control could not render -- which also meant the opt-in could never be switched on. Fixed by\nloading the package. Your data was never at risk: with the control unreachable the plugin always\ntook the safe path and kept everything.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li><strong>Uninstall no longer destroys your data by default.<\/strong> Deleting the plugin used to remove\neverything it had stored, with no way to stop it -- so deleting it to troubleshoot took the lot\nwith it. Now the default is to KEEP your data, and a new <strong>Data &amp; uninstall<\/strong> control on the\nplugin's own screen lets you opt in to a full wipe if that is what you want. Scheduled jobs are\nalways tidied up either way, and the wipe works with no internet connection.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li><strong>Fixed: the tables ran off the right-hand side of the screen.<\/strong> The scheduled-events table\nhas six columns and a hook name that cannot wrap, so on a 1280px display it came out wider\nthan the window: the Status and Actions columns were cut off past the edge, and the whole\nadmin page grew a horizontal scrollbar that took the sidebar and header with it. Hook names\nnow wrap, and each table sits in its own scrolling area, so any overflow stays inside the\ncard instead of dragging the page sideways. All four tables are fixed, not just the one.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Housekeeping: removed five admin screens that nothing could reach \u2014 the pre-SPA PHP pages,\nreplaced by the current monitoring app. No feature changes; one of them was shipping inside\nthe premium build.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li><strong>New: long-running event alerts.<\/strong> Cron Monitor has always recorded how long every task took;\nit can now tell you when one takes longer than a threshold you set (30 seconds by default), on\nthe same channels as the missed and failed alerts. Only durations the monitor measured\ndirectly count \u2014 runs it could only estimate are marked \"approx.\" and never trigger an alert,\nso the channel stays worth listening to. One alert per hook per six hours.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Your licence is now manageable from the plugin itself. The Account screen was previously\nhidden, which also hid <strong>Deactivate License<\/strong> \u2014 so a licence could not be released from one\nsite to move it to another without contacting support. It is visible again, along with the\nlicence key, plan, Sync and Change License.<\/li>\n<li><strong>Harvify \u2192 Tools<\/strong> now opens with a <strong>Your licences<\/strong> table: every installed Harvify plugin,\nthe plan it is on, whether Pro features are actually running, and a link to its Account screen.\nFreemius gives each product its own separate Account page, so this is the one place that\nanswers \"what am I on\" across the whole bundle.<\/li>\n<li>The repeated <em>\"Opt in to make \u2026 better!\"<\/em> admin notice no longer appears. Licence, plan and\nupdate notices are unaffected \u2014 only the opt-in prompt is suppressed.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Change: License activation now uses per-plugin key entry \u2014 enter your bundle license key on each Pro plugin to unlock Pro. Improves activation reliability.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>New: custom cron schedules \u2014 define named intervals (name, display, seconds; minimum 60s) that register via cron_schedules and are available to any event; deletion is blocked while an event still uses the schedule.<\/li>\n<li>New: inline event edit \u2014 change an existing event's schedule and\/or next-run time in place (no more delete + re-add). Timing only: the hook, arguments and payload are never touched, so no new code-execution surface.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>New admin design system (Harvify Admin Kit): the admin screen is now a single-page app with a branded header, first-run onboarding, section navigation (Cron Events, History, Insights, Settings), skeleton loader, coaching empty states, an at-a-glance Insights panel (scheduled events, overdue, 7-day runs\/errors, cron-health warnings), and a contextual, dismissible upgrade card. UI layer only \u2014 event management, execution history, detection and free\/Pro gating are unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Internal: uninstall cleanup now runs on Freemius's after_uninstall hook (removed uninstall.php) for Freemius Deployment compatibility. What gets removed on uninstall is unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>WP-Cron event listing + full management (run\/pause\/resume\/delete) with core-event guard.<\/li>\n<li>Add standard and URL events (security-contained).<\/li>\n<li>Execution history with precise Action Scheduler timing and best-effort WP-Cron timing.<\/li>\n<li>Overdue\/missed\/broken-cron detection + dashboard widget + CSV export.<\/li>\n<li>Pro: Email\/Slack\/Discord\/Telegram alerts, auto-retry, per-hook performance, digests, multisite view.<\/li>\n<\/ul>","raw_excerpt":"Monitor, manage, and troubleshoot WordPress cron \u2014 with execution history, overdue\/missed\/broken-cron detection, and Action Scheduler visibility.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368900","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368900"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jethalal"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368900"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368900"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368900"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368900"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368900"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}