Migrating production infrastructure? Get up to ₹10,000 in migration credits. Apply now
voroaBlog
Background Workers

Heroku Scheduler: Limits, Costs and Alternatives in 2026

· · 6 min read

Heroku Scheduler limits and costs, and how the alternatives compare for scheduled jobs

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

Advertisement

How the add-on works

You add it from the Resources tab or with one command:

bash
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

Diagram: what happens when a scheduled run is still going at the next run time - delayed until it finishes on Render, skipped on Railway, and started anyway (overlap) on plain cron and Voroa unless you take a lock; Heroku's scheduler instead stops a run at its interval

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

  1. List your jobs. Copy each command, its frequency and its next run time from the Scheduler dashboard.
  2. Convert to cron. “Every 10 minutes” is */10 * * * *, “every hour at :30” is 30 * * * *, “daily at 03:30 UTC” is 30 3 * * *. Our guide to cron every 5 minutes has more patterns.
  3. Fix the timezone. If the new platform uses IST, a daily 03:30 UTC job becomes 0 9 * * *.
  4. Make jobs safe to run twice. Every platform above can, in some case, run late, overlap or repeat.
  5. 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 support@getvoroa.com.

Advertisement