What is a Vercel cron expression?
Vercel Cron Jobs let you trigger a Route Handler on a schedule instead of manually or via an external request. That schedule is defined with a standard 5-field cron expression — minute, hour, day-of-month, month, and day-of-week — registered inside your project's vercel.json file. This tool builds that expression for you and shows exactly what it will do before you ship it.
Why not just write the cron expression by hand?
Cron syntax is compact but easy to get subtly wrong — a misplaced field can mean the difference between "every hour" and "once a year." This generator removes the guesswork: pick a schedule type, and the tool assembles a valid expression, explains it in plain English, and shows you the next 5 times it will actually run — all before you commit it to your codebase.
How to use this generator
- Pick a schedule type — every minute, every X minutes, hourly, daily, weekly, or monthly — or switch to Custom to type an expression directly.
- Fill in the fields that appear for your chosen schedule (hour, minute, day, etc.).
- Check the live validity badge and the plain-English description.
- Review the next 5 execution times to confirm the schedule does what you expect.
- Set your API route path and copy the generated
vercel.jsonsnippet into your project.
The 5 cron fields, explained
Every Vercel cron expression is five space-separated fields, read left to right. Here's what each one controls:
- Minute (0–59) — which minute of the hour the job fires on. A wildcard (
*) means every minute. - Hour (0–23) — the hour of the day, in 24-hour UTC time.
9means 9am UTC,21means 9pm UTC — there's no separate AM/PM field. - Day of month (1–31) — which date the job runs on, like the 1st or the 15th. Leave it as
*unless you need a specific date every month. - Month (1–12) — restricts the schedule to specific months. Almost always left as
*unless you're running something quarterly or seasonally. - Day of week (0–6) — the day of the week, where
0is Sunday and6is Saturday. Useful for "every Monday" or "every weekday" schedules.
Only two of these five ever combine to form most real schedules — usually hour + minute for a daily time, or day-of-week + hour + minute for a weekly one. Day-of-month and month are mostly left as wildcards unless you have a genuinely date- or season-specific job.
Common Vercel cron examples
| Expression | What it does |
|---|---|
*/5 * * * * | Every 5 minutes — good for lightweight polling or heartbeat checks |
0 * * * * | Once an hour, on the hour |
0 9 * * * | Every day at 9:00 AM UTC — a common daily digest/report time |
0 9 * * 1-5 | Every weekday at 9:00 AM UTC (Monday through Friday) |
0 8 * * 1 | Every Monday at 8:00 AM UTC — a typical weekly-report schedule |
0 0 1 * * | Midnight UTC on the 1st of every month — common for monthly billing jobs |
0 */6 * * * | Every 6 hours — a lighter-weight alternative to hourly for cache refreshes |
Common mistakes
- Forgetting Vercel runs everything in UTC. An expression that looks right at a glance can fire at 2am for your users if you meant local time instead of UTC.
- Setting both day-of-month and day-of-week. Vercel explicitly doesn't support combining the two — one of them has to stay a wildcard (
*), unlike some other cron implementations that treat the combination as "either/or". - Using named values like
MONorJAN. Vercel only accepts numeric values —1for Monday,1for January, and so on. - Assuming a 6-field or seconds-based format works. Vercel uses strict 5-field Unix cron — no seconds field, and no
L/W/#/?modifiers some other schedulers (like Quartz) support. - Forgetting the route has to actually exist and respond. A valid schedule in
vercel.jsondoes nothing if the API route it points to is missing, returns a non-2xx status, or times out — check your function logs after the first scheduled run. - Not accounting for plan limits. Cron frequency and total invocation allowances can differ by Vercel plan — verify your plan supports the interval you're configuring before relying on it in production.
Vercel Cron vs. Linux Cron
| Vercel Cron | Linux Cron (crontab) | |
|---|---|---|
| Fields | 5 (minute, hour, day-of-month, month, day-of-week) | 5 (same), some variants add seconds/year |
| Timezone | Always UTC | System's local timezone (configurable) |
Named values (MON, JAN) | Not supported | Supported in most implementations |
| Day-of-month + day-of-week together | Not allowed — one must be a wildcard | Allowed, treated as OR |
| Where it runs | Triggers an HTTP request to your API route | Runs a shell command directly on the host |
| Where it's defined | vercel.json in your repo, deployed with your app | A crontab file on the server, edited independently of your code |
A note on timezones
Vercel Cron schedules are always interpreted in UTC, regardless of which region your project is deployed to. All execution previews on this page are shown in UTC — convert to your local timezone before assuming a job ran "at 9am your time."