{"id":349335,"date":"2026-08-21T18:36:48","date_gmt":"2026-08-21T18:36:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/cronitorex\/"},"modified":"2026-08-29T19:06:55","modified_gmt":"2026-08-29T19:06:55","slug":"crx-cron-health-monitor","status":"closed","type":"plugin","link":"https:\/\/fi.wordpress.org\/plugins\/crx-cron-health-monitor\/","author":23542940,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.1","stable_tag":"0.3.1","tested":"7.0.7","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"CRX Cron Health Monitor","header_author":"Cronitorex","header_description":"WP-Cron health, task attribution and a dead man's switch for your site. Know that your scheduled jobs actually ran.","assets_banners_color":"0e1721","last_updated":"2026-08-29 19:06:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/cronitorex.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":171,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.0":{"tag":"0.3.0","author":"dcwiklik","date":"2026-08-21 18:36:13","revision":3659501},"0.3.1":{"tag":"0.3.1","author":"dcwiklik","date":"2026-08-29 19:06:55","revision":3671826}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3659498,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3659498,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3659522,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3659522,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.0","0.3.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3659498,"resolution":"1","location":"assets","locale":"","width":1280,"height":960},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3659498,"resolution":"2","location":"assets","locale":"","width":1280,"height":960},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3659498,"resolution":"3","location":"assets","locale":"","width":1280,"height":960},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3659498,"resolution":"4","location":"assets","locale":"","width":1280,"height":960}},"screenshots":{"1":"Dashboard: Cron Health Score ring, stat tiles, run duration sparkline, detected problems and recent runs.","2":"Tasks: every scheduled task attributed to the plugin or theme that owns it, with schedule and last run.","3":"Configuration: account keys and the per-task monitor picker with sensible defaults.","4":"Site Health integration: cron state as a native WordPress health test."}},"plugin_section":[262246],"plugin_tags":[4567,5603,255120,29148,4568],"plugin_category":[54,59],"plugin_contributors":[276868],"plugin_business_model":[],"class_list":["post-349335","plugin","type-plugin","status-closed","hentry","plugin_section-dashboard-widgets","plugin_tags-cron","plugin_tags-monitoring","plugin_tags-scheduled-tasks","plugin_tags-uptime","plugin_tags-wp-cron","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-dcwiklik","plugin_committers-dcwiklik"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/crx-cron-health-monitor_0e1721.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/crx-cron-health-monitor\/assets\/screenshot-1.png?rev=3659498","caption":"Dashboard: Cron Health Score ring, stat tiles, run duration sparkline, detected problems and recent runs."},{"src":"https:\/\/ps.w.org\/crx-cron-health-monitor\/assets\/screenshot-2.png?rev=3659498","caption":"Tasks: every scheduled task attributed to the plugin or theme that owns it, with schedule and last run."},{"src":"https:\/\/ps.w.org\/crx-cron-health-monitor\/assets\/screenshot-3.png?rev=3659498","caption":"Configuration: account keys and the per-task monitor picker with sensible defaults."},{"src":"https:\/\/ps.w.org\/crx-cron-health-monitor\/assets\/screenshot-4.png?rev=3659498","caption":"Site Health integration: cron state as a native WordPress health test."}],"raw_content":"<!--section=description-->\n<p><strong>Your cron did not fail. It never ran.<\/strong> WP-Cron only fires when someone visits your site. That is why nightly backups silently wait until morning, why <code>DISABLE_WP_CRON<\/code> without a real cron kills every scheduled task without a word, and why a single fatal error can jam the whole queue while every dashboard stays green.<\/p>\n\n<p>Cronitorex shows you what is actually happening on your site, and tells you exactly who is responsible.<\/p>\n\n<h4>See your cron for the first time<\/h4>\n\n<ul>\n<li><strong>Cron Health Score (0-100)<\/strong> with named deductions: every lost point is a concrete problem with a concrete fix, never an opaque number<\/li>\n<li><strong>Task attribution<\/strong>: every cron hook mapped to the plugin or theme that registered it, with its version. An alert says \"WooCommerce 9.x\", not a cryptic hook name<\/li>\n<li><strong>Real execution data<\/strong>: how long each task took, how late it ran versus its schedule, peak memory, and fatals or timeouts caught mid-task<\/li>\n<li><strong>A task table that answers questions<\/strong>: what runs here, who owns it, when it runs next, how its last run went<\/li>\n<\/ul>\n\n<h4>Ten detections that name the problem<\/h4>\n\n<ol>\n<li>WP-Cron disabled with nothing triggering it (the most common silent death in WordPress)<\/li>\n<li>Night-time cron gaps: your site sleeps, so your nightly jobs do too<\/li>\n<li>Tasks running long after their scheduled time<\/li>\n<li>Overdue events piling up in the queue<\/li>\n<li>Tasks dying mid-run from fatal errors or PHP timeouts<\/li>\n<li>Orphaned events left behind by removed plugins<\/li>\n<li>Duplicated events doing the same work twice<\/li>\n<li>Tasks slow enough to hurt real visitors<\/li>\n<li>Emails failing to send (wp_mail failures are silent by default)<\/li>\n<li>Mail going through PHP mail() without SMTP, the classic road to the spam folder<\/li>\n<\/ol>\n\n<p>Each detection appears in the dashboard with a suggested fix, and in the native <strong>Site Health<\/strong> screen (Tools - Site Health), where WordPress admins already look.<\/p>\n\n<h4>The dead man's switch<\/h4>\n\n<p>Everything above runs locally and needs no account. But a tool that lives inside WordPress has a blind spot it cannot escape: <strong>when WP-Cron dies, the tool dies with it<\/strong>. A dead scheduler looks exactly like a healthy one from the inside.<\/p>\n\n<p>Connecting a free Cronitorex account closes that gap. The plugin sends a heartbeat every five minutes; when your cron stops, the heartbeat stops, and the silence itself raises an alert from outside within minutes. Nothing that runs inside your site can do this.<\/p>\n\n<h4>Per-task monitors (paid plans)<\/h4>\n\n<p>On paid plans, every recurring cron task gets its own monitor with its own history and alerts:<\/p>\n\n<ul>\n<li>Monitors are created for you, within your plan limit, with alert windows derived from how the task actually behaves (95th percentile of observed runs), not from guesses<\/li>\n<li>Every run reports start, completion or failure, with duration<\/li>\n<li>A task that disappears from the schedule gets its monitor paused, never deleted: destroying history stays a human decision<\/li>\n<\/ul>\n\n<h4>For developers<\/h4>\n\n<ul>\n<li><strong>WP-CLI<\/strong>: <code>wp cronitorex status<\/code>, <code>wp cronitorex doctor<\/code>, <code>wp cronitorex sync<\/code><\/li>\n<li>No external libraries, no JavaScript frameworks, no build step<\/li>\n<li>Instrumentation never touches other plugins' code and never slows a request: all reporting is non-blocking, and every failure of the monitoring itself is swallowed by design<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sends nothing anywhere until you connect an account. Once connected, telemetry is aggregate numbers and task names only: run counts, durations, lag. No task arguments, no post content, no emails, no personal data. Ever.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin can connect to the Cronitorex monitoring service (cronitorex.com). <strong>Nothing is sent anywhere until you enter your API keys<\/strong> on the Configuration tab; without keys the plugin is fully local.<\/p>\n\n<p>Once connected, it talks to two endpoints:<\/p>\n\n<ul>\n<li><code>https:\/\/api.cronitorex.com<\/code> - receives monitoring pings: the site heartbeat (aggregate counters: number of runs, failures, worst duration and delay) and, on paid plans with per-task monitors enabled, one ping per task run (task hook name, status, duration). Sent from your server whenever monitored tasks run.<\/li>\n<li><code>https:\/\/app.cronitorex.com\/api\/v1<\/code> - the management API, called only from explicit admin or WP-CLI actions (creating the heartbeat monitor, syncing per-task monitors, reading your plan limits).<\/li>\n<\/ul>\n\n<p>Data sent never includes task arguments, post content, emails or personal data.<\/p>\n\n<p>Service provided by Cronitorex: <a href=\"https:\/\/cronitorex.com\/legal\/terms-of-service\">Terms of Service<\/a>, <a href=\"https:\/\/cronitorex.com\/legal\/privacy-policy\">Privacy Policy<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Open the Cronitorex menu in wp-admin. The dashboard works immediately.<\/li>\n<li>Optional: create a free account at cronitorex.com, paste your Ingest API key (ck_) and, if you want the monitor created for you, a scoped Management API key (mk_, read + write).<\/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. Cronitorex observes and reports; it never takes over scheduling. If your site needs a real cron trigger, the plugin will tell you and link the instructions, but the change stays in your hands.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20deactivate%20the%20plugin%3F\"><h3>What happens when I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Cron behaviour returns to exactly what it was. Uninstalling also removes every option the plugin stored. Monitors in your Cronitorex account are left untouched, because deleting monitoring history should be a deliberate decision made in the panel, not a side effect.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Fixed: monitors that already existed were never configured, so the site heartbeat had no expected interval and could not alert when WP-Cron died. The plugin now reconciles interval, grace period and tags on every connect and sync, not only when it creates a monitor.<\/li>\n<li>Monitors are tagged with the site domain even when they were created automatically by the first ping, so the dashboard shows which site they belong to.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Renamed the plugin to CRX Cron Health Monitor (slug: crx-cron-health-monitor) to avoid confusion with unrelated third-party services.<\/li>\n<li>Removed bundled translation files; translations now go through translate.wordpress.org.<\/li>\n<li>Menu icon styling now uses wp_add_inline_style() instead of an inline  tag.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Per-task monitors (paid plans): every recurring cron hook gets its own monitor, history and alerts, created for you within your plan limit and paused (never deleted) when a hook disappears.<\/li>\n<li>Mail watch: wp_mail() send counters, failure capture, and detection of PHP mail() setups without SMTP.<\/li>\n<li>Site Health integration: cron state as a native test under Tools - Site Health.<\/li>\n<li>WP-CLI: wp cronitorex status | doctor | sync.<\/li>\n<li>Grace periods for per-task monitors are derived from observed run times (p95), not guesses.<\/li>\n<li>Brand icon in the admin menu.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: local cron dashboard with health score, attribution and detections; site heartbeat with automatic monitor creation.<\/li>\n<\/ul>","raw_excerpt":"WP-Cron health, task attribution and a dead man&#039;s switch for your site. Know that your scheduled jobs actually ran.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/349335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=349335"}],"author":[{"embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dcwiklik"}],"wp:attachment":[{"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=349335"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=349335"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=349335"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=349335"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=349335"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=349335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}