Docs › Heroku Scheduler with RunVouch

Heroku Scheduler with RunVouch

Heroku's own documentation calls Scheduler a best-effort service: a run can be skipped without a trace. For a nightly agent that is exactly the failure you cannot see from the logs.

How it runs on Heroku Scheduler

Scheduler starts a one-off dyno with the command you enter. Add runvouch to requirements.txt and prefix the command.

Store the key

Set the key as a config var: heroku config:set RUNVOUCH_KEY=rv_...; one-off dynos inherit it.

Wrap the job

# Scheduler command field
rv run nightly-report --log /tmp/report.log -- python report.py
# cadence registered once, from anywhere with the key
rv agent nightly-report --cadence 24h --grace 30m --evidence

rv fails open: if RunVouch is unreachable the job still runs and you get one warning line.

Register the cadence and caps

rv agent nightly-report --cadence 24h --grace 30m --max-runtime 1h --evidence --cap-run-cost 2

Register the agent once, from anywhere with the key. Cadence is what turns a schedule that stopped into an alert; --evidence makes a run without evidence a failure; the caps pause the agent when it overspends.

What goes silent on Heroku Scheduler

What RunVouch detects

AlertWhat it means here
MISSEDcadence plus grace passed and no run started
FAILEDnon-zero exit or a reported failure, with the stderr excerpt
NO_EVIDENCEthe run said ok but the file, URL or assertion you required is missing
STALLEDa run started and never ended within max runtime
RETRY_STORMthe same tool called with identical input many times in one run
BUDGET_RUN / BUDGET_DAYcost cap crossed; the agent is paused until you resume it
DRIFTduration or output size far off its 7-run baseline

Need a key? Get a free key · Stuck? contact