{"id":377511,"date":"2026-10-06T13:23:48","date_gmt":"2026-10-06T13:23:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/cronwatch\/"},"modified":"2026-10-07T04:32:56","modified_gmt":"2026-10-07T04:32:56","slug":"cronwatch","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cronwatch\/","author":23575565,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.12.3","stable_tag":"0.12.3","tested":"7.1.3","requires":"6.1","requires_php":"8.2","requires_plugins":null,"header_name":"CronWatch","header_author":"Jon C. Phillips","header_description":"Watches WP-Cron: records every scheduled event's runs and tells you when one is missed, fails, gets stuck or runs slow.","assets_banners_color":"f4f4f5","last_updated":"2026-10-07 04:32:56","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/cronwatch.dev\/","header_author_uri":"https:\/\/joncphillips.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":169,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.12.1":{"tag":"0.12.1","author":"joncphillips","date":"2026-10-06 13:23:11","revision":3730873},"0.12.2":{"tag":"0.12.2","author":"joncphillips","date":"2026-10-07 04:09:41","revision":3731843},"0.12.3":{"tag":"0.12.3","author":"joncphillips","date":"2026-10-07 04:32:56","revision":3731853}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3730873,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3730873,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3730873,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3730873,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3730873,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.12.1","0.12.2","0.12.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3730873,"resolution":"1","location":"assets","locale":"","width":1380,"height":1100},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3730873,"resolution":"2","location":"assets","locale":"","width":1380,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3730873,"resolution":"3","location":"assets","locale":"","width":1380,"height":1111},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3730873,"resolution":"4","location":"assets","locale":"","width":1220,"height":1252}},"screenshots":{"1":"The dashboard in wp-admin (CronWatch in the admin menu): every WP-Cron event's health at a glance, and the last 24 hours as a timeline of when each event was due, when it ran and for how long.","2":"An event's page on the dashboard: its last seven days, its runs with their output and errors, the button to silence it, and Delete history.","3":"CronWatch, Settings: where alerts go (email, Slack, a webhook, and more channels below them), the grace a run is given, and the JSON API with its token.","4":"The foot of the settings page: the \"Send a test alert\" button and the watched events with their health, last run and next due time."}},"plugin_section":[],"plugin_tags":[1110,4567,5603,255120,4568],"plugin_category":[54,59],"plugin_contributors":[284702],"plugin_business_model":[],"class_list":["post-377511","plugin","type-plugin","status-publish","hentry","plugin_tags-alerts","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-joncphillips","plugin_committers-joncphillips"],"banners":{"banner":"https:\/\/ps.w.org\/cronwatch\/assets\/banner-772x250.png?rev=3730873","banner_2x":"https:\/\/ps.w.org\/cronwatch\/assets\/banner-1544x500.png?rev=3730873","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/cronwatch\/assets\/icon.svg?rev=3730873","icon":"https:\/\/ps.w.org\/cronwatch\/assets\/icon.svg?rev=3730873","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cronwatch\/assets\/screenshot-1.png?rev=3730873","caption":"The dashboard in wp-admin (CronWatch in the admin menu): every WP-Cron event's health at a glance, and the last 24 hours as a timeline of when each event was due, when it ran and for how long."},{"src":"https:\/\/ps.w.org\/cronwatch\/assets\/screenshot-2.png?rev=3730873","caption":"An event's page on the dashboard: its last seven days, its runs with their output and errors, the button to silence it, and Delete history."},{"src":"https:\/\/ps.w.org\/cronwatch\/assets\/screenshot-3.png?rev=3730873","caption":"CronWatch, Settings: where alerts go (email, Slack, a webhook, and more channels below them), the grace a run is given, and the JSON API with its token."},{"src":"https:\/\/ps.w.org\/cronwatch\/assets\/screenshot-4.png?rev=3730873","caption":"The foot of the settings page: the \"Send a test alert\" button and the watched events with their health, last run and next due time."}],"raw_content":"<!--section=description-->\n<p>WordPress runs its scheduled events (WP-Cron) only when someone visits the site. On a quiet site they run late or not at all, and when an event's code fails nobody hears about it. CronWatch records every WP-Cron event as it runs, in your own database, and alerts you when:<\/p>\n\n<ul>\n<li>an event is missed: it did not run within its recurrence plus a grace (10 minutes by default),<\/li>\n<li>a run fails: its code threw an exception, hit a fatal error or exited,<\/li>\n<li>a run gets stuck: it started and never finished,<\/li>\n<li>a run is much slower than usual,<\/li>\n<\/ul>\n\n<p>and again when the event recovers. Every condition alerts once, when it starts, and once more when it ends; nothing repeats while it lasts.<\/p>\n\n<p>It needs no change to your code or your other plugins. Every scheduled event becomes a job:<\/p>\n\n<ul>\n<li>A recurring event (hourly, twice daily, daily, weekly, or any schedule a plugin adds) is a job named <code>wp:&lt;hook&gt;<\/code>, expected every interval of its recurrence. One scheduled with arguments is <code>wp:&lt;hook&gt;:&lt;key&gt;<\/code>, the key being the start of WordPress's own key for those arguments, so the same hook with two sets of arguments is two jobs.<\/li>\n<li>Single events (<code>wp_schedule_single_event<\/code>, such as a scheduled post's publishing) are one job per hook, with no schedule: they are one-offs, so a failure is reported but there is no cadence to miss. If WP-Cron stops running altogether, the recurring events WordPress itself schedules (update checks, twice daily and hourly) are reported missed, which is how you find out.<\/li>\n<li>An event that is no longer scheduled (its plugin was deactivated, say) keeps its history and is never reported missed.<\/li>\n<\/ul>\n\n<p>What a run prints is kept as its output. Your own code can add lines with <code>do_action( 'cronwatch_log', 'sent 40 emails' );<\/code>.<\/p>\n\n<p>Alerts go by email (through <code>wp_mail()<\/code>, the way the site sends its other mail), to Slack, or to any URL as a signed JSON webhook. If you use them, they can also go to Discord, by email through Resend, Postmark, SendGrid, Mailgun or Amazon SES, by text message through Twilio, or to Sentry, Honeybadger, Datadog, Rollbar, Bugsnag or New Relic. Set them under CronWatch, Settings, where you can also send a test alert and see each event's health.<\/p>\n\n<p>The CronWatch menu in wp-admin opens the dashboard, for administrators: every event's health at a glance, the last 24 hours as a timeline (when each event was due, when it ran and for how long, and the slots nothing ran in), and for each event its last seven days, its runs with their output and errors, a button to silence it for a while, and, at the foot of its page, Delete history. \"Run check now\" is on the board.<\/p>\n\n<h4>Ask Claude about your cron<\/h4>\n\n<p>CronWatch speaks the same small JSON API in every language it runs in, and <a href=\"https:\/\/www.npmjs.com\/package\/@cronwatch\/mcp\">@cronwatch\/mcp<\/a> lets Claude and other AI assistants read it: which events are failing, what a run printed, silencing one for the night. The API is off until you turn it on under CronWatch, Settings, with a token; the page then shows the address and the line that adds it to Claude Code. Only requests that carry the token are answered, and only the API is exposed: the dashboard stays in wp-admin.<\/p>\n\n<p>CronWatch is the WordPress plugin of <a href=\"https:\/\/cronwatch.dev\/\">the CronWatch library<\/a>, which also watches jobs in TypeScript, Ruby, Python, PHP, Go, Rust, Elixir, Java and .NET apps and keeps the same tables in every language.<\/p>\n\n<h4>Why a check that runs on page visits misses a quiet site<\/h4>\n\n<p>CronWatch finds missed runs with a check every five minutes, which it schedules as a WP-Cron event of its own. WP-Cron runs only when someone (or something) loads a page, so on a site with no visits the check does not run either: the same silence that stops your events stops the check that would report them. A site that gets regular traffic is covered as it is; for every other site, and for events that must run on time, run WP-Cron and the check from the server's own cron instead:<\/p>\n\n<ol>\n<li><p>Turn off WP-Cron's page-load trigger in <code>wp-config.php<\/code>:<\/p>\n\n<p>define( 'DISABLE_WP_CRON', true );<\/p><\/li>\n<li><p>Add a crontab line that runs due events every five minutes, either through WP-CLI:<\/p>\n\n<p>*\/5 * * * * cd \/path\/to\/site &amp;&amp; wp cron event run --due-now --quiet<\/p>\n\n<p>or by requesting wp-cron.php:<\/p>\n\n<p>*\/5 * * * * curl -s https:\/\/example.com\/wp-cron.php &gt; \/dev\/null<\/p><\/li>\n<li><p>And run CronWatch's check from the crontab too, so it happens whether or not WP-Cron does:<\/p>\n\n<p>*\/5 * * * * cd \/path\/to\/site &amp;&amp; wp cronwatch check --quiet<\/p>\n\n<p>wp cronwatch check prints one line, such as <code>cronwatch: checked 12 jobs, sent 1 alert<\/code>. Many hosts offer a \"real cron\" setting that does the same as these lines.<\/p><\/li>\n<\/ol>\n\n<h4>For developers<\/h4>\n\n<ul>\n<li><code>cronwatch_alerts<\/code> (filter): the list of alert channels (the ones the settings made). Add any object implementing <code>Cronwatch\\Alerts\\AlertChannel<\/code>, or a callable taking the <code>Cronwatch\\Alert<\/code>.<\/li>\n<li><code>cronwatch_watch_event<\/code> (filter): return false to leave an event unwatched. Given <code>true<\/code>, the hook, its arguments and its recurrence name (null for a single event).<\/li>\n<li><code>cronwatch_job_options<\/code> (filter): a job's options (<code>grace<\/code>, <code>timeout<\/code>, <code>maxDuration<\/code>, <code>failuresBeforeAlert<\/code>, <code>description<\/code>, <code>tags<\/code>), given the options, the hook, its arguments and its recurrence. Options CronWatch refuses are written to the error log, and the job keeps its own.<\/li>\n<li><code>cronwatch_client_args<\/code> (filter): the arguments the library's client is made with (its store, alert channels, default grace and error handler).<\/li>\n<li><code>cronwatch_reject_unsafe_urls<\/code> (filter): whether an alert URL may not reach a private address or an unusual port (WordPress's <code>reject_unsafe_urls<\/code>). True on a multisite network, where a site's administrators may not be the network's, and false otherwise; given the URL's origin.<\/li>\n<li><code>cronwatch_log<\/code> (action): <code>do_action( 'cronwatch_log', ...$parts )<\/code> adds a line for the output of the event running now, the parts joined with spaces and anything not a string written as JSON. With the plugin inactive it does nothing, so the code needs no check for it.<\/li>\n<\/ul>\n\n<p>The plugin carries only the alert channels its settings offer. Developers who need other channels or AI triage of alerts can install <a href=\"https:\/\/packagist.org\/packages\/cronwatch\/cronwatch\">the cronwatch\/cronwatch Composer package<\/a>, which has them, and add them with these filters.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>CronWatch sends nothing anywhere until you set an alert channel, and it has no tracking, statistics or calls home of any kind. Runs, output and state stay in three tables in your own database (<code>wp_cronwatch_jobs<\/code>, <code>wp_cronwatch_runs<\/code> and <code>wp_cronwatch_state<\/code>, with your table prefix). Values that look like secrets (API keys, tokens, passwords) are blanked from run output and errors before they are stored. The services an alert can go to are listed under \"External services\" below.<\/p>\n\n<p>The JSON API is off unless you turn it on. When it is on, anyone who has the token can read the events, their runs and their output, silence or forget them, and run the check, so keep the token as you would a password, and make a new one under CronWatch, Settings, if it leaks. The plugin itself sends nothing to anyone through it: it only answers requests that carry the token.<\/p>\n\n<h4>Licence<\/h4>\n\n<p>The plugin is GPLv2 or later. It includes the cronwatch\/cronwatch PHP library (in <code>lib\/<\/code>), which is MIT licensed; the MIT licence is compatible with the GPL, and the library's licence text is in <code>lib\/LICENSE<\/code>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>CronWatch contacts an outside service only to deliver an alert, and only one the site's owner has set up under CronWatch, Settings: nothing is sent while no alert channel is set. An alert is sent when a watched event is missed, fails, gets stuck or runs slow, when it recovers, and when you press \"Send a test alert\". It holds the job's name and description, what went wrong and when, and the run that raised it with the end of its output and its error (with values that look like secrets blanked).<\/p>\n\n<ul>\n<li>Email: sent with <code>wp_mail()<\/code>, the way your site sends its other mail (your host, or an SMTP or mail service plugin you chose), to the addresses you enter, with a link to the event's page in your wp-admin. The plugin itself contacts no mail service.<\/li>\n<li>Slack: when you enter a Slack incoming webhook URL, each alert is posted to it as a message, with the alert described above and a link to the event's page in your wp-admin. Slack is a service of Slack Technologies: <a href=\"https:\/\/slack.com\/main-services-agreement\">terms of service<\/a>, <a href=\"https:\/\/slack.com\/trust\/privacy\/privacy-policy\">privacy policy<\/a>.<\/li>\n<li>Webhook: when you enter a webhook URL, each alert is posted to it as JSON (the alert described above, and the job's definition), signed with the secret you give, if any. The URL is your own endpoint, or a service you chose, whose terms then apply; the plugin sends nothing to it until you enter it.<\/li>\n<\/ul>\n\n<p>Under More channels, each of these services is contacted only once you have filled in its fields (your own account's key or token, and where to send), and is then sent each alert described above, with a link to the event's page in your wp-admin. The plugin sends nothing to any of them until then.<\/p>\n\n<ul>\n<li>Discord, at the channel webhook URL you enter, as a message: <a href=\"https:\/\/discord.com\/terms\">terms of service<\/a>, <a href=\"https:\/\/discord.com\/privacy\">privacy policy<\/a>.<\/li>\n<li>Resend, Postmark, SendGrid, Mailgun and Amazon SES, through their APIs, as an email from the address and to the addresses you enter: Resend (<a href=\"https:\/\/resend.com\/legal\/terms-of-service\">terms<\/a>, <a href=\"https:\/\/resend.com\/legal\/privacy-policy\">privacy<\/a>), Postmark (<a href=\"https:\/\/postmarkapp.com\/terms-of-service\">terms<\/a>, <a href=\"https:\/\/postmarkapp.com\/privacy-policy\">privacy<\/a>), SendGrid, a Twilio service (<a href=\"https:\/\/www.twilio.com\/en-us\/legal\/tos\">terms<\/a>, <a href=\"https:\/\/www.twilio.com\/en-us\/legal\/privacy\">privacy<\/a>), Mailgun (<a href=\"https:\/\/www.mailgun.com\/legal\/terms\/\">terms<\/a>, <a href=\"https:\/\/www.mailgun.com\/legal\/privacy-policy\/\">privacy<\/a>) and Amazon SES, an Amazon Web Services service (<a href=\"https:\/\/aws.amazon.com\/service-terms\/\">terms<\/a>, <a href=\"https:\/\/aws.amazon.com\/privacy\/\">privacy<\/a>).<\/li>\n<li>Twilio, through its API, as a text message from the number you enter to the numbers you enter (not for recoveries): <a href=\"https:\/\/www.twilio.com\/en-us\/legal\/tos\">terms<\/a>, <a href=\"https:\/\/www.twilio.com\/en-us\/legal\/privacy\">privacy<\/a>.<\/li>\n<li>Sentry, Honeybadger, Datadog, Rollbar, Bugsnag and New Relic, through their APIs, as an event or error in the project your key belongs to: Sentry (<a href=\"https:\/\/sentry.io\/terms\/\">terms<\/a>, <a href=\"https:\/\/sentry.io\/privacy\/\">privacy<\/a>), Honeybadger (<a href=\"https:\/\/www.honeybadger.io\/terms\/\">terms<\/a>, <a href=\"https:\/\/www.honeybadger.io\/privacy\/\">privacy<\/a>), Datadog (<a href=\"https:\/\/www.datadoghq.com\/legal\/terms\/\">terms<\/a>, <a href=\"https:\/\/www.datadoghq.com\/legal\/privacy\/\">privacy<\/a>), Rollbar (<a href=\"https:\/\/rollbar.com\/terms\/\">terms<\/a>, <a href=\"https:\/\/rollbar.com\/privacy\/\">privacy<\/a>), Bugsnag, a SmartBear service (<a href=\"https:\/\/smartbear.com\/terms-of-use\/\">terms<\/a>, <a href=\"https:\/\/smartbear.com\/privacy\/\">privacy<\/a>) and New Relic (<a href=\"https:\/\/newrelic.com\/termsandconditions\/terms\">terms<\/a>, <a href=\"https:\/\/newrelic.com\/termsandconditions\/privacy\">privacy<\/a>).<\/li>\n<\/ul>\n\n<p>The plugin contacts no other service.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin. It creates its three tables and schedules its check.<\/li>\n<li>Under CronWatch, Settings, enter where alerts should go and send a test alert.<\/li>\n<li>If the site is not visited every few minutes, set up the server cron described above.<\/li>\n<li>Open CronWatch in wp-admin for the dashboard.<\/li>\n<\/ol>\n\n<p>On a multisite network it can be activated network wide: every site gets its own tables and check, including sites made later.<\/p>\n\n<p>It needs PHP 8.2 or newer and MySQL 5.7.8 or MariaDB 10.3 or newer (the versions with the JSON functions it reads state with). Deleting the plugin removes its tables, settings and scheduled check.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20slow%20my%20site%20down%3F\"><h3>Does it slow my site down?<\/h3><\/dt>\n<dd><p>No. On an ordinary page view it does nothing but note, when WP-Cron runs an event, which one it is. The work (a few queries per event) happens in the cron request, and the check runs every five minutes.<\/p><\/dd>\n<dt id=\"an%20event%20is%20reported%20missed%20but%20my%20site%20is%20fine\"><h3>An event is reported missed but my site is fine<\/h3><\/dt>\n<dd><p>The event did not run within its recurrence plus the grace. On a quiet site that is WP-Cron waiting for a visit: see \"Why a check that runs on page visits misses a quiet site\". If an event is late by design, raise the grace under CronWatch, Settings, or give that job its own with the <code>cronwatch_job_options<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20watch%20events%20of%20one%20plugin%20only%3F\"><h3>Can I watch events of one plugin only?<\/h3><\/dt>\n<dd><p>Yes, with the <code>cronwatch_watch_event<\/code> filter.<\/p><\/dd>\n<dt id=\"is%20the%20dashboard%20public%3F\"><h3>Is the dashboard public?<\/h3><\/dt>\n<dd><p>No. It is in wp-admin, for users who may manage options, and every change it makes carries a WordPress nonce. The JSON API is the only part that can be reached from outside wp-admin, and only when you turn it on with a token.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.12.3<\/h4>\n\n<ul>\n<li>From the library: the dashboard's footer names the CronWatch version serving it, linked to the changelog. Nothing is fetched to check for a newer release.<\/li>\n<\/ul>\n\n<h4>0.12.2<\/h4>\n\n<ul>\n<li>From the library: on an event's page in the dashboard, Silence opens the choice of how long, and one click silences it; Forget is now Delete history, at the foot of the page, with a warning that it cannot be undone.<\/li>\n<\/ul>\n\n<h4>0.12.1<\/h4>\n\n<ul>\n<li>The settings offer every alert channel, not only email, Slack and the webhook: Discord, email through Resend, Postmark, SendGrid, Mailgun or Amazon SES, text messages through Twilio, and Sentry, Honeybadger, Datadog, Rollbar, Bugsnag and New Relic. Each sends once its required fields are set; keys and tokens are never shown again once saved, and a channel only partly filled in is named in a notice. The services each one contacts are listed under External services.<\/li>\n<\/ul>\n\n<h4>0.12.0<\/h4>\n\n<ul>\n<li>Released with the library 0.12.0, which adds the <code>under_floor<\/code> alert: a job that runs cleanly but reports a metric below its <code>floor<\/code>, or at 0 after runs that never were, sends one warning. Jobs take a <code>floor<\/code> option beside <code>budget<\/code>.<\/li>\n<\/ul>\n\n<h4>0.11.1<\/h4>\n\n<ul>\n<li>Released with the library 0.11.1, whose own dashboard gains a light and dark switch (Cmd+Shift+D); the dashboard in wp-admin is unchanged and follows the system's setting.<\/li>\n<\/ul>\n\n<h4>0.11.0<\/h4>\n\n<ul>\n<li>The <code>cronwatch_log<\/code> action is the documented way to add a line to a run's output; the <code>cronwatch_log()<\/code> function still works.<\/li>\n<li>The JSON API's root answers what is serving it: the library, its language and version, and the API's version.<\/li>\n<li>The JSON API's silence and unsilence answer the job's summary instead of its stored state.<\/li>\n<li>The webhook's body starts with <code>\"schema\": 1<\/code>, the payload's version; its JSON Schema is at https:\/\/cronwatch.dev\/schemas\/webhook\/1.json.<\/li>\n<li>A job's stored state keeps the fields a newer release wrote, so sites and apps on different 1.x releases can share one database.<\/li>\n<li>A blank <code>CRONWATCH_ENV<\/code> or <code>APP_ENV<\/code> counts as unset.<\/li>\n<li>One malformed job, run or state row (a hand edit, a damaged database) affects only its own job instead of stopping every check or the whole dashboard, and a state row that is not JSON is replaced by the next write.<\/li>\n<li>The webhook signing secret is saved exactly as typed. Before, saving it escaped <code>&lt;<\/code>, removed <code>%XX<\/code> and collapsed spaces, so every signature failed at the receiver. A secret with a line break, a tab or another control character is refused, and the saved one kept.<\/li>\n<\/ul>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>An alert is saved in the same write that records the failure, so a PHP process killed before the alert went out no longer loses it: the next check sends it.<\/li>\n<li>A cron hook whose job options the <code>cronwatch_job_options<\/code> filter made invalid is reported and skipped, instead of stopping the check for every other job.<\/li>\n<li>An event's output is passed on as it is written, instead of held in memory until the event ends.<\/li>\n<li>Output is redacted before it is shortened, so a secret cut in half at the limit can no longer show.<\/li>\n<li>Webhook URLs and keys are kept out of the stack traces of failed alert sends.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Carries version 0.9.0 of the CronWatch library.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Carries version 0.8.0 of the CronWatch library.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Carries version 0.7.0 of the CronWatch library.<\/li>\n<li>The dashboard reads a request's body from <code>php:\/\/input<\/code> only, never from a path or URL.<\/li>\n<li>\"Send a test alert\" says where the alert really went: with no channel set, that it was written to the PHP error log, where alerts go until you set one up.<\/li>\n<li>A save that refuses both the grace and the API token shows both notices, not only one.<\/li>\n<li>Before anything is recorded, the dashboard says that WP-Cron's events appear after the first check, and how to run it now.<\/li>\n<\/ul>\n\n<h4>0.6.1<\/h4>\n\n<ul>\n<li>First release: WP-Cron events recorded as jobs, missed, failed, stuck and slow alerts by email, Slack and webhook, <code>wp cronwatch check<\/code>.<\/li>\n<li>The dashboard in wp-admin: health, the last 24 hours, each event's week and runs.<\/li>\n<li>The JSON API for @cronwatch\/mcp, off until turned on with a token.<\/li>\n<li>Network activation on multisite, including sites made later.<\/li>\n<\/ul>","raw_excerpt":"Watches WP-Cron: records every scheduled event&#039;s runs and tells you when one is missed, fails, gets stuck or runs slow.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/377511","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=377511"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/joncphillips"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=377511"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=377511"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=377511"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=377511"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=377511"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=377511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}