Skip to content
cronpad
Schedules / Schedules

Schedules

A schedule tells cronpad when a job fires. You can write it in plain English (every weekday at 9am), standard cron (0 9 * * 1-5), Quartz cron (0 0 9 ? * MON-FRI), an iCalendar RRULE (FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=9), or as a single moment (2026-12-25T07:00:00+05:30). Every schedule is evaluated in the job’s timezone.

Formats

FormatExampleBest forPage
Natural languagesecond tuesday of every month at 9amReadable schedulesNatural language
Cron*/15 * * * *Familiar, compactCron and Quartz
Quartz0 0 18 L * ?“Last day”, “nearest weekday”, “third Friday”Cron and Quartz
RRULEFREQ=MONTHLY;BYDAY=-1FR;BYHOUR=17Calendar-style rules, generated by codeRRULE and one-off
One-offin 20 minutes, 2026-12-25T07:00:00ZRun onceRRULE and one-off

Automatic detection

By default ("kind": "auto") cronpad works out the format, in this order:

  1. An RFC 3339 timestamp → one-off.
  2. Five or six space-separated cron fields, or an @ descriptor (@daily) → cron.
  3. Contains ?, L, W or #, or has seven fields → Quartz.
  4. Contains FREQ= → RRULE.
  5. Anything else → natural language.

Set kind explicitly (cron, quartz, rrule, natural, once) when you want an error instead of a guess.

Validate and preview before saving

The public cron schedule validator previews any supported expression without signing in. Its expression and timezone are stored in the URL so you can share a preview, and the preview updates as you type.

every weekday at 9am · Preview this schedule

Every place you can enter a schedule shows what it means and when it will fire next:

curl -sS https://app.cronpad.com/api/v1/schedules/preview \
  -H "Content-Type: application/json" \
  -d '{"expr": "2nd tuesday of every month at 9am", "timezone": "Asia/Kolkata", "count": 3}'
{
  "kind_detected": "natural",
  "canonical": "FREQ=MONTHLY;BYDAY=2TU;BYHOUR=9;BYMINUTE=0;BYSECOND=0",
  "description": "At 09:00 on the second Tuesday of every month",
  "timezone": "Asia/Kolkata",
  "next": ["2026-11-10T03:30:00Z", "2026-12-08T03:30:00Z", "2027-01-12T03:30:00Z"]
}

The same check works offline with the CLI: cronpad schedule next "2nd tuesday of every month at 9am" --tz Asia/Kolkata -n 3. See Schedules API and CLI.

When a schedule can’t be parsed, the error says where and suggests a fix:

{
  "valid": false,
  "errors": [{"kind": "natural", "position": 6, "message": "unknown word \"tuesdy\"", "suggestion": "every tuesday at 9am"}]
}

Bounds

Any schedule can be limited with these job fields:

FieldMeaning
starts_atDon’t fire before this time.
ends_atDon’t fire after this time; the job becomes completed.
countFire at most this many times; the job becomes completed.
  • Timezones and DST: what happens at 02:30 on the night clocks change.
  • Misfires and overlap: what happens to runs missed during downtime, and to runs that would overlap.
  • Limits: the minimum interval between runs on cronpad Cloud.