Migrate from Vercel cron

Import vercel.json cron entries into a SteadyCron manifest with a single command — remove Vercel's once-per-day and UTC-only restrictions.

Vercel’s hobby plan limits cron jobs to once per day in UTC. Even on paid plans, schedules are tied to vercel.json — changing them requires a redeploy, there are no retries, and logs are thin with no alerting.

steadycron import vercel converts your vercel.json cron entries into a SteadyCron manifest in one command.

Quick start

# 1. Generate the manifest (reads vercel.json in the current directory)
steadycron import vercel \
  --base-url https://app.example.com \
  --cron-secret-env CRON_SECRET \
  -o steadycron.yaml

# 2. Review and validate
steadycron validate steadycron.yaml

# 3. Set the secret and apply
echo "CRON_SECRET=your-secret-here" > secrets.env
steadycron apply steadycron.yaml --env-file secrets.env --namespace prod

How it works

The importer reads vercel.json (or a path you supply as the first argument) and emits one http GET job per cron entry, with the full URL built from --base-url + path and timezone: UTC.

--cron-secret-env NAME — instead of inlining the secret value, the manifest emits:

headers:
  Authorization: Bearer ${CRON_SECRET}

The ${…} placeholder is resolved at sync/apply time via --env-file or the process environment. The manifest itself never contains the secret.

--dry-run — preview what would be generated without writing a file.

After migrating

Once SteadyCron is handling a job, remove (or comment out) the corresponding entry from vercel.json and redeploy — this prevents double-firing the same endpoint.

After that, tighten your schedules and set per-job timezones — both are capabilities Vercel doesn’t expose.

What you gain

Vercel cronSteadyCron
Minimum intervalOnce per day (hobby)Configurable (by plan)
TimezoneUTC onlyPer-job, DST-aware
Retries on failureNoneYes — configurable
Timeout enforcementNoneYes — per job
Heartbeat monitoringNoYes
AlertingNoEmail, Slack, Discord, Telegram, webhook
Change scheduleEdit vercel.json + redeployDashboard, CLI, or YAML — no redeploy
Execution logPlatform logs, ephemeralPer-run status, body, duration

Next steps