Last updated November 11, 2025
The Scheduler Monitor add-on is currently in beta.
The Scheduler Monitor add-on allows you to natively monitor and investigate Heroku Scheduler jobs. Consult different types of metrics to diagnose issues on one-off dynos started by Heroku Scheduler.
This service is an extension of the existing Application Metrics provided in the Heroku Dashboard. You can configure threshold alerting to actively monitor one-off dyno-related issues. In addition to raw metrics and alerts, Scheduler Monitor provides guidance and recommendations on how to correct specific one-off dyno problems.
Scheduler Monitor is language-agnostic, so it can integrate with apps in any programming language. All features are accessible from the Scheduler Monitor Dashboard.
Scheduler Monitor only considers metrics from detached scheduler one-off dynos started by Heroku Scheduler. It doesn’t include any other one-off dynos started by a user, for example via the Heroku Console.
Alert email notifications sent by Scheduler Monitor contain the one-off dyno’s command. Don’t put sensitive data directly in the command. Use config vars instead.
Provisioning the Add-on
Attach Scheduler Monitor to a Heroku application via the CLI:
See a list of all plans available here.
$ heroku addons:create scheduler-monitor
Creating one-off-metrics on sharp-mountain-4005... free
Your add-on has been provisioned successfully
After installing Scheduler Monitor, it’s fully integrated and configured. Scheduler Monitor doesn’t require or set any config vars. It picks up all relevant data automatically from your app.
Dashboard
The Scheduler Monitor dashboard allows you to investigate Heroku Scheduler jobs running in your Heroku app’s environment as one-off dynos using different types of metrics. In addition, you can create and manage the monitors for your Heroku Scheduler jobs.
You can access the dashboard via the CLI:
$ heroku addons:open scheduler-monitor
Opening scheduler-monitor for sharp-mountain-4005
or by visiting the Heroku Dashboard and selecting the application in question. Select Scheduler Monitor from the Add-ons menu.
Gathered Metrics

Events
The Event plot displays one-off dyno lifecycle events per specific one-off dyno.
Execution Time
The Execution Time plot displays summary metrics for one-off dyno execution times.
Throughput
The throughput plot displays the number of one-off dynos broken down by exit status (0, null, or anything greater than 0).
- One-off dynos that result in a null status code are considered to have been interrupted.
- One-off dynos that result in anything greater than 0 (zero) are considered to have failed.
- One-off dynos that result in a 0 (zero) status code are considered to have succeeded.
Concurrency
The concurrency plot displays summary metrics of the number of one-off dynos running at the same time.
Data Resolution
There are 4 levels of data resolution in Scheduler Monitor:
- 1 minute (Past 3 hrs)
- 10 minutes (72-48 hrs ago, 48-24 hrs ago, and past 24 hrs)
- 30 minutes (Past 72 hrs)
- 1 hour (Past 7 days)
Data Filter
Scheduler Monitor enables you to analyze the metrics data of a subset of your one-off dynos by filtering based on one-off dyno attributes.
Either filter only by command by providing part of the applicable command, or explicitly filter based on one or more specific attributes by using the attribute:value syntax.
Filtering through the input field in the Dashboard applies to all plots at once. This ability allows you to correlate metrics data of different plots.
Attributes
| Name | Description | Example |
|---|---|---|
| command | command used to start this process | "python scrape.py" |
| state | current status of process (either: running, succeeded, failed, or interrupted) | "interrupted" |
| name | the name of this process on this dyno | "scheduler.4321" |
| size | dyno size (either: free, hobby, standard-1X, standard-2X, performance-m, performance-l, private-s, private-m or private-l) | "performance-l" |
You can use 2 different match types, an exact match, or a partial match. Exact matches include double quotes. For example, "standard-1X" only matches if it’s exactly equal to the test string. Partial matches, e.g standard, don’t include double quotes and match if the test string contains the filter value.
Prepend - to exclude metrics data containing a certain test string e.g. -type:release, -state:succeeded, or -command:"python scrape.py"
Real-World Examples
To only get metrics data related to one-off dynos running command echo “Hello World!”:
echo "Hello World!"
To filter out one-off dynos running a command containing Hello World:
-Hello World
To only get metrics data related to one-off dynos running command echo “Hello World!” that either failed or were interrupted:
command:echo "Hello World!" state:failed state:interrupted
To only get metrics data related to one-off dynos running command echo “Hello World!” that did not succeed:
command:echo "Hello World!" -state:succeeded
To only get metrics data related to one-off dynos of size Performance-L that are currently running:
state:running size:performance-l
To only get metrics data related to one-off dynos that succeeded:
state:succeeded
To only get metrics data related to a one-off dyno with a specific name:
name:scheduler.1234
Alternatively, filter metrics data in a specific plot by using the plot’s legend buttons. Doing so doesn’t affect the metrics data displayed in the other plots.
Monitors and Threshold Alerting
Scheduler Monitor allows you to create different types of monitors that check specific aspects of one-off dynos and open alerts based on various settings.
Alert email notifications contain the one-off dyno’s command. Don’t put sensitive data directly in the command. Use config vars instead.
Types of Monitors
Heroku Scheduler Job Failure
Monitor the one-off dyno exit status. Given a sensitivity setting of 1, this type of monitor opens an alert whenever a one-off dyno fails to successfully execute a specific command. An exit status greater than 0 (zero) is considered a failure.
Heroku Scheduler Job Interruption
Monitor whether a one-off dyno fails to exit on its own. Given a sensitivity setting of 1, this type of monitor opens an alert whenever something forces a one-off dyno executing a specific command to exit.
Heroku Scheduler Job Execution Time
Monitor the one-off dyno execution time. Given a sensitivity setting of 1, this type of monitor opens an alert whenever a one-off dyno takes longer to execute a specific command than your threshold setting.
Heroku Scheduler Job Concurrency
Monitor the number of one-off dynos started by specific Heroku Scheduler job. Given a sensitivity setting of 1, this type of monitor opens an alert whenever the number of concurrent one-off dynos is at or exceeds your threshold setting.
Heroku Scheduler Concurrency
Monitor the total number of scheduler one-off dynos running inside of your Heroku app’s environment. Given a sensitivity setting of 1, this type of monitor opens an alert whenever the total number of concurrent one-off dynos is at or exceeds your threshold setting.
Monitors exist independently from one another. A single one-off dyno can meet the alert conditions of different monitors, setting off multiple alerts.
Sensitivity Setting
You can configure a sensitivity setting for every monitor. This setting determines how many consecutive times a monitor must meet the alert conditions before actually opening an alert.
Alert Notifications
By default, the distribution for email notifications is to all app owners and collaborators for non-team accounts, and admins for people in a Heroku team. Alternatively, you can add additional email addresses, such as for email-based PagerDuty integration.
Although Scheduler Monitor supports multiple additional addresses, the preferred approach is to use your email platform to create an alias. You can manage group membership outside of the alert notification framework.
Migrating Between Plans
Application owners must carefully manage the migration timing to ensure proper application function during the migration process.
Use the heroku addons:upgrade command to migrate to a new plan.
$ heroku addons:upgrade scheduler-monitor:newplan
-----> Upgrading scheduler-monitor:newplan to sharp-mountain-4005... done, v18 ($49/mo)
Your plan has been updated to: scheduler-monitor:newplan
Troubleshooting One-Off Dyno Issues
Scheduler Monitor lets you monitor one-off dynos used by Heroku Scheduler to run your scheduled jobs. One-off dynos are dynos that run a specific command until it exits. They run alongside other dynos, exactly like the app’s web, worker, and other formation dynos. One-off dynos are ideal for performing one-off administrative or maintenance tasks for your Heroku app.
The following sections covers troubleshooting the most common issues with working with one-off dynos.
One-Off Dyno Failures
Whenever a one-off dyno exits with an exit status greater than 0 (zero), it’s considered to have failed. There can be several reasons why the one-off dyno exited with an error code:
- Issues can occur during the provisioning of the one-off dyno. Check your one-off dyno’s app logs for any information, as these issues get logged most of the time.
command not foundin your one-off dyno’s app logs indicates that the command provided for the one-off dyno doesn’t exist. Try investigating why. Did you make a typo or forget to push your changes to your Heroku app’s environment?- Check for application-level errors. Review your one-off dyno’s app logs for any errors, warnings, or additional information. Try to reproduce it locally and start debugging from there.
One-Off Dyno Interruptions
Whenever something forces a one-off dyno to exit instead of exiting on its own, it’s considered to have been interrupted. Sometimes this forced exit is harmless, for example, when a user kills the one-off dyno using the Heroku CLI.
A forced exit can also mean that your one-off dyno keeps running indefinitely until it reached its TTL (Time-To-Live). Upon creation, a one-off dyno gets a TTL value assigned in seconds. Heroku automatically kills the dyno after the number of seconds passes.
The following example shows what appears in your one-off dyno’s app logs when Heroku kills a dyno in this way :
Cycling
State changed from up to complete
Stopping all processes with SIGTERM
Process exited with status 143
The one-off dyno’s command either took longer to run than its TTL, or it failed to exit on its own after performing the required actions. Test your command locally and make sure it exits properly before running it using a one-off dyno.
When using the Heroku Scheduler add-on, it creates a one-off dyno with a TTL value that is equal to the job’s interval. For example, for a job executed every 10 minutes, it creates one-off dynos with a TTL value of 600 seconds (10 minutes).
Removing the Add-on
You can remove Scheduler Monitor via the CLI:
This action destroys all associated data and can’t be undone!
$ heroku addons:destroy scheduler-monitor
-----> Removing scheduler-monitor from sharp-mountain-4005... done, v20 (free)
Support
Submit all Scheduler Monitor support and runtime issues via one of the Heroku Support channels. Any non-support issues or product feedback is welcome at support@schedulermonitor.com.