Skip to main content

Cron every month explained

0 0 1 * *

At 00:00, on day 1 of the month.

Next runs · UTC

Calendar

September 2026 · UTC

0 runs

About this tool

The cron expression for every month is 0 0 1 * * - at midnight on the 1st of every month. The day-of-month 1 is the only constraint; the rest are wildcards. To run on a different day, change the day-of-month value. To run at a different time, change the minute and hour.
Monthly cron drives the slowest cadence in most production crontabs - billing close, monthly reports, audit log archives, big-cleanup sweeps. Test these carefully: a monthly bug only surfaces twelve times a year.

Picking a day in the month

The day-of-month field accepts:

  • A literal day (1, 15, 28).
  • A list of days (1,15 for 1st and 15th).
  • A range (1-7 for the first week).
  • A step (1-31/3 for every 3rd day).
  • The L modifier for “last day” (extended cron only - see the dedicated guide).

The trickiest case: months without a 31st (Feb, Apr, Jun, Sep, Nov). 0 0 31 * * simply doesn't fire in those months. If you want “the last day” semantics, see the last-day-of-month guide.

Every month on different platforms

Linux crontab

crontab
0 0 1 * * /path/to/monthly.sh
# Or with @monthly alias:
@monthly /path/to/monthly.sh

Vercel cron jobs

json
{
  "crons": [
    { "path": "/api/cron/monthly", "schedule": "0 0 1 * *" }
  ]
}

AWS EventBridge

crontab
cron(0 0 1 * ? *)
# Or last day of month:
cron(0 0 L * ? *)

Quartz (Java)

java
Trigger trigger = newTrigger()
    .withSchedule(cronSchedule("0 0 0 1 * ?"))
    .build();
// Last day of month variant:
cronSchedule("0 0 0 L * ?")

Variations on every month

  • 0 0 1 * * - first of every month at midnight.
  • 0 9 1 * * - first of every month at 09:00.
  • 0 0 15 * * - fifteenth of every month.
  • 0 0 1,15 * * - twice a month (1st and 15th).
  • 0 0 L * * - last day of every month (extended cron only).
  • 0 0 1 1,4,7,10 * - quarterly (1st of Jan, Apr, Jul, Oct).
  • 0 0 1 1 * - yearly (Jan 1st).
  • 0 0 * * 0 - every week (~4x as frequent).

Monthly cron pitfalls

  • Day 31 doesn't exist everywhere - 0 0 31 * * fires in 7 of 12 months, silently skipping Feb / Apr / Jun / Sep / Nov. If you want the actual last day, use L (extended cron) or the multi-cron pattern.
  • February 29 - only fires in leap years. The schedule looks valid but is sparse. Verify on the calendar.
  • Long-running monthly jobs - the next firing is 28-31 days away, so “eventual” failures aren't self-healing. Add explicit alerting and a manual rerun procedure.
  • Timezone - “monthly at midnight” is very different in UTC vs your local zone. Pin the timezone explicitly for monthly jobs that produce business-facing outputs.

Examples

  • 0 18 * * *
    Every day at 18:00
  • 0 */5 * * *
    Every 5 hours
  • 0 18 * * 1-5
    Weekdays at 18:00
  • 0 0 1 * *
    Once a month, on the 1st at midnight

Cheatsheet

Full cheatsheet
FieldReq.RangeWildcards
minuteyes0-59, - * /
houryes0-23, - * /
day of monthyes1-31, - * /
monthyes1-12 or JAN-DEC, - * /
day of weekyes0-6 or names; some dialects use 0-7 or 1-7 — see Dialects, - * /

Frequently asked questions

Syntax

What is the cron expression for every month?

0 0 1 * *. Minute and hour are 0; day-of-month is 1 (the 1st of the month); month and day-of-week are wildcards. The job fires once a month, on the 1st at midnight. Pick a different day-of-month to shift the firing. Expression: 0 0 1 * *

Open in editor
Is there a @monthly alias?

Yes. Many Vixie-derived implementations accept @monthly as a shortcut for 0 0 1 * *, the first day at midnight. Vercel, AWS, and Quartz require explicit cron expressions.

Timing

Is every month the same as every 31 days?

No. Calendar months vary in length (28, 29, 30 or 31 days). 0 0 1 * * fires exactly once per calendar month, regardless of length. A 31-day-interval cron would drift relative to the calendar.

Days and months

How do I run on the first day of the month?

0 0 1 * * - at midnight on the 1st. The day-of-month value 1 matches every 1st. Combine with the month field to restrict to specific months: 0 0 1 1,4,7,10 * fires only on the 1st of January, April, July and October (quarterly). Expression: 0 0 1 * *

Open in editor
How do I run on the last day of the month?

Use the syntax for your scheduler: Quartz uses 0 0 0 L * ?, and AWS uses cron(0 0 L * ? *). Vixie cron, robfig/cron, and NCrontab need a daily runtime check; recent node-cron and dragonmantank accept 0 0 L * *.

Last day of month guide
How do I run monthly on the 15th?

Use 0 0 15 * *. It runs at midnight on day 15 of every month; change the minute and hour for another time. Expression: 0 0 15 * *

Open in editor
Should a monthly cron use the first day or L?

Use day 1 when work belongs at the start of a month and L when it belongs on the final calendar day. L is unavailable in standard Vixie cron.

What happens to a monthly cron scheduled for day 31?

0 0 31 * * simply has no occurrence in months without a 31st. Use a universally present day or a verified last-day pattern instead. Expression: 0 0 31 * *

Open in editor

Timezones and DST

Which timezone controls a monthly cron?

The scheduler timezone controls which local date is the first or last day. Pin the intended business timezone instead of relying on the host default.

Can DST affect monthly cron?

Yes, when the chosen local time is skipped or repeated. Midnight often avoids common transition hours, but UTC and idempotency provide stronger predictability.

Platforms

What is monthly on the first in Spring cron?

Use 0 0 0 1 * *. Spring includes seconds first, so the expression fires at second 0, minute 0, hour 0 on day 1. Expression: 0 0 0 1 * *

Open in editor
What is monthly on the first in AWS EventBridge?

Use cron(0 0 1 * ? *). EventBridge requires six fields including year and ? in one of the two day fields.

Can Vercel Hobby run a monthly cron?

Yes. A monthly schedule is within Hobby's once-per-day limit; 0 0 1 * * runs at 00:00 UTC on each first day.

Debugging

How should a failed monthly cron be retried?

Use explicit retries and alerting rather than waiting for next month. Make the operation idempotent with a month key so a manual rerun is safe.

Crontap

Can Crontap run a monthly job?

Yes. You can schedule an HTTP job on Crontap with 0 0 1 * *, selecting the timezone that defines the monthly boundary. Expression: 0 0 1 * *

Open in editor

Write the cron here. Run it on Crontap.

Point Crontap at any URL. Pick any cron. Done.

WordPress, Shopify, Railway, Cloud Run, Vercel, HubSpot, Ghost, your own box. If it answers HTTP, Crontap can drive it on a clock you can read, in the timezone that actually matters, and page you when something breaks.

1.9k+ teams · Free forever tier · No credit card