Heroku Scheduler: Limits, Costs and Alternatives in 2026
Sagar Tayde · · 6 min read
Heroku Scheduler is Heroku’s free add-on for running a command on a timetable: every 10 minutes, every hour or once a day. It is the quickest way to get a cron job on Heroku, and for many apps it is enough.
This guide explains how it works, the limits that matter, and how the common alternatives compare. Every platform fact below comes from that platform’s own documentation, checked on 7 November 2026.
On this page
- How the add-on works
- The five limits that matter
- What it costs
- The clock process: Heroku’s own alternative
- How other platforms schedule jobs
- Moving a scheduled job off Heroku
- FAQ
How the add-on works
You add it from the Resources tab or with one command:
heroku addons:create scheduler:standard
Then, in its dashboard, you enter a command such as rake send_digest or python manage.py cleanup,
pick a frequency and a dyno size, and set the next run time.
At each run, Heroku starts a one-off dyno, runs your command in it, and shuts it down. It is the same
as typing heroku run your-command, so if a command works with heroku run, it will work here.
The five limits that matter
1. Only three frequencies. Every 10 minutes, every hour, or every day. There is no cron expression, so “weekdays at 9 am” or “every 5 minutes” cannot be set directly.
2. Times are in UTC. A daily job set for 03:30 runs at 9:00 am in India. Add the offset yourself when you pick the time.
3. Runs are best-effort. Heroku says job execution is “expected but not guaranteed”. In very rare cases a job may be skipped, and in very rare cases it may run twice. Heroku recommends a clock process for critical production jobs.
4. Each run is a fresh dyno. Nothing you write to disk survives between runs, and start-up time is part of every run. That is good for isolation and bad for very frequent, very short jobs.
5. A run is killed at its interval. Heroku says a scheduler dyno will not run longer than its scheduling interval: a 10-minute job is stopped after about 10 minutes, an hourly job after about an hour. Because of timing jitter, two runs of the same job may briefly overlap.
What it costs
The add-on itself is free. The one-off dynos it starts are billed like any other dyno usage, and they appear on your invoice as a “scheduler” dyno type.
So the cost depends on how long each run lasts and how often it runs. A two-minute job every 10 minutes is about 288 minutes of dyno time a day, about 144 hours a month. A two-minute daily job is about one hour a month.
The clock process: Heroku’s own alternative
For jobs that must run, Heroku points to a custom clock process: a small process in your Procfile
that runs all the time and decides when jobs are due.
web: node web.js
worker: node worker.js
clock: node clock.js
It gives you full cron expressions and your own timezone. The trade-offs, from Heroku’s guidance:
- It runs 24/7, so you pay for a dyno all month.
- Run exactly one clock dyno. Scaling it to two schedules every job twice.
- Dynos restart at least once a day, so the clock needs start-up logic to catch runs it missed.
That duplicate-run warning is real. We measured it for in-process schedulers: two processes ran every job twice, in both Node.js and Python.
How other platforms schedule jobs

Each platform handles the three hard questions differently: how often, what happens if a run is still going, and which timezone.
| Platform | Shortest interval | If the last run is still going | Timezone | Billing |
|---|---|---|---|---|
| Heroku Scheduler | 10 minutes | Killed at the interval; brief overlap possible | UTC | One-off dyno time |
| Heroku clock process | Any cron | Your code decides | Any | A dyno running 24/7 |
| Render Cron Jobs | Cron expression | Next run is delayed until it finishes | UTC | Per second of run time, $1 minimum a month |
| Railway cron | 5 minutes | Next run is skipped | UTC | Service usage |
GitHub Actions schedule |
5 minutes, can be delayed | Separate workflow run | UTC by default | Actions minutes |
| Voroa Cron Job | 1 minute | Can overlap; use a lock. Skipped while the service is stopped | IST | The size you pick for the service, billed monthly |
Sources: Heroku Scheduler and clock process docs, the Render cron job docs, the Railway cron docs and the GitHub Actions schedule docs, all checked on 7 November 2026.
Three things stand out. Railway requires your process to exit after each run. Render guarantees only one run at a time by delaying the next. And every hosted scheduler here except Voroa schedules in UTC by default, which matters if your users are in India.
Moving a scheduled job off Heroku
- List your jobs. Copy each command, its frequency and its next run time from the Scheduler dashboard.
- Convert to cron. “Every 10 minutes” is
*/10 * * * *, “every hour at :30” is30 * * * *, “daily at 03:30 UTC” is30 3 * * *. Our guide to cron every 5 minutes has more patterns. - Fix the timezone. If the new platform uses IST, a daily 03:30 UTC job becomes
0 9 * * *. - Make jobs safe to run twice. Every platform above can, in some case, run late, overlap or repeat.
- Check the effect, not just the log. After the first run, confirm the rows were written or the email went out.
On Voroa, create a Cron Job from your repository with the same command and the converted schedule, and add your environment variables. Runs are skipped while the service is stopped, including after a free workspace uses its monthly free hours, until the 1st.
Steps are in scheduling a task on Voroa, and worker or cron job helps if your job is really a long-running process. More on running workers is on the background workers page.
FAQ
Is Heroku Scheduler free? The add-on is free, but each run uses a one-off dyno, and that dyno time is billed like other dyno usage.
What is the minimum interval for Heroku Scheduler? Every 10 minutes. The other choices are hourly and daily. It does not accept cron expressions.
What timezone does Heroku Scheduler use? UTC. Subtract 5 hours 30 minutes from the Indian time you want.
Is Heroku Scheduler reliable? Heroku describes runs as expected but not guaranteed: very rarely a job is skipped or runs twice. For critical jobs it recommends a clock process.
How do I run a Heroku job every 5 minutes? Not with Scheduler. Use a clock process with a cron library, or a platform that accepts cron expressions.
What is the best Heroku Scheduler alternative? It depends on your stack. Pick one that accepts full cron expressions, states what happens to overlapping runs, and schedules in the timezone your users live in.
Checked 7 November 2026 against each platform’s documentation. Found something out of date? Write to [email protected].