

The setup notice on the Plugins screen, shown until a monitor UUID is set, with a Settings link on the plugin's row.
WP-Cron stopped and nothing told you. WordPress runs its scheduled jobs only when someone visits the site. On a quiet site, a backup, a newsletter or a cleanup can stay stalled for weeks before anyone notices. Uptime monitors do not catch it: the site answers over HTTPS just fine, it simply is not running its jobs.
Cronheart turns WP-Cron into a dead-man switch. The plugin pings cronheart.com every five minutes, and sends a start, success or fail ping around every run of each event you register. If the pings stop, or a job fails, cronheart alerts you by email, Telegram, Slack, Discord, Microsoft Teams, Google Chat, PagerDuty or a signed webhook.
Step by step: Monitor WordPress cron with Cronheart.
cronheart_monitor( 'my_nightly_report', 'xxxxxxxx-…' );error_get_last() summary — the cronheart dashboard shows the cause without you tailing debug.log. This holds for runs through a page request, wp-cron.php, ALTERNATE_WP_CRON and WP-CLI’s wp cron event run.cronheart_monitor() helper and CRONHEART_EVENT_<HOOK>_UUID constants, which still work. A constant overrides an assignment made on this screen; an assignment made on this screen overrides the helper.wp-config.php constants for production (CRONHEART_HEARTBEAT_UUID, CRONHEART_EVENT_<HOOK>_UUID), with admin-UI fallback for sites where editing wp-config.php is not practical.curl), which most hosts enable.The plugin’s hard contract: a broken cronheart backend, an unreachable network, a misbehaving PSR-18 HTTP client — none of them may cause WP-Cron to fail. Every network / HTTP error is swallowed; with WP_DEBUG and WP_DEBUG_LOG on, a ping that fails leaves one line in the debug log. A third-party filter that throws while the plugin reads its settings is caught too. If cronheart goes down for a day, your wp_schedule_event callbacks still run normally; you just stop seeing pings on the dashboard. When the plugin cannot send pings safely (the PHP cURL extension is missing, or the endpoint setting is one it does not accept), it sends none and shows an error notice in wp-admin instead.
This plugin sends HTTP requests to cronheart.com in two distinct situations: the monitoring pings your scheduled jobs send, and the account-management calls the admin settings page makes. Both are opt-in: without configuration the plugin loads and does nothing — no telemetry, no usage statistics, no anonymous reports.
1. Monitoring pings (front end / WP-Cron). Sent on every scheduled WP-Cron run, but only when you supply a monitor UUID. The exact data sent per ping:
start / success / heartbeat pings. For a fail ping it holds the PHP error type, the file path and line, and the message of the fatal error or uncaught exception, or a one-line note that the event did not complete.User-Agent header (for example cron-monitor-php-sdk/1.9).2. Account management (wp-admin only). When — and only when — you save a cronheart.com API token, the Cronheart admin screens (Settings Cronheart, Settings Cronheart Events, Settings Cronheart Channels, and Settings Cronheart History) talk to the cronheart.com management API at https://cronheart.com/api/v1/.... Every such request carries the token as an Authorization: Bearer header and runs only while a logged-in administrator is on one of those screens — and, for the write actions below, only when that administrator clicks the control. Never on the front end, during WP-Cron, or in any other context. No token, no request. The calls are:
GET /api/v1/monitors — to populate the heartbeat picker, the “Your monitors” table, the per-event assignment dropdowns, and the Cronheart History monitor picker. Sends nothing beyond the token and paging parameters.GET /api/v1/account — to show your plan, monitor budget, and API rate-limit standing. Sends nothing beyond the token.POST /api/v1/monitors/<uuid>/pause (or /resume, /snooze, /unsnooze) — sent when you click a pause / resume / snooze / unsnooze button. Sends the monitor’s UUID (in the path) and the action; snooze also sends the chosen duration (1 hour, 4 hours, 1 day, or 1 week).POST /api/v1/monitors — sent when you click “Auto-create & assign” for a recurring event on the Cronheart Events screen. Sends the event’s hook name (as the monitor name), its schedule as an interval in seconds, the site timezone, and a grace period — all derived from the WP-Cron schedule — plus an idempotency key that is a SHA-256 hash of the site URL and the hook name (the URL itself is not sent), so a repeated click does not create a second monitor.GET /api/v1/channels — to populate the Cronheart Channels screen. Sends nothing beyond the token.POST /api/v1/channels/<id>/test — sent when you click “Send test” on a channel. This delivers a real notification to that channel’s destination (your configured email, Telegram, Slack, Discord, Microsoft Teams, Google Chat, PagerDuty, or webhook), so it is the one management call with an effect outside cronheart.com. Sends only the channel id (in the path).POST /api/v1/channels/<id>/rotate-secret — sent when you click “Rotate secret” on a webhook channel. cronheart.com mints a new signing secret (shown to you once) and invalidates the previous one. Sends only the channel id (in the path); the new secret is shown in the page and never stored by the plugin.GET /api/v1/monitors/<uuid>/pings and GET /api/v1/monitors/<uuid>/alerts — to populate the Cronheart History screen for the monitor you select. Reads the most recent page only. Sends the monitor’s UUID (in the path) and paging parameters.The lifecycle, create, test, and rotate-secret calls are the only requests that change anything — and “Send test” additionally delivers a real notification to the channel’s destination, while “Rotate secret” invalidates the old webhook secret — but each is one deliberate administrator click. The token is optional: without it the plugin makes none of these management calls — you assign monitors by hand (or via the constants / helper) and only the monitoring pings above are ever sent.
Cronheart.com Terms of Service · Privacy policy
Source code and issue tracker: github.com/alexander-po/cronheart-wp.
The plugin wraps the cron-monitor/php-sdk PHP package (also open source, MIT-licensed). Both projects are maintained independently.