CronTool
Cron expression editor & debugger

Cron every month — `0 0 1 * *` explained

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.

Examples

  • 018***
    Every day at 18:00
  • 0*/5***
    Every 5 hours
  • 018**1-5
    Weekdays at 18:00
  • 001**
    Once a month

Cheatsheet

FieldRequiredValues RangeWildcardsminuteYes0-59, - * / hourYes0-59, - * / day of monthYes1-31, - * / L W monthYes1-12, - * /day of weekYes0-7, - * / L

Calendar

View future cron matches in a calendar

April 2026

Showing next 1000 cron schedules

Loading...

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

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

Vercel cron jobs

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

AWS EventBridge

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

Quartz (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.

Frequently asked questions

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.

Is there a `@monthly` alias?

Yes — Unix cron implementations accept `@monthly` as a shortcut for `0 0 1 * *` (1st of every month at midnight). Not portable to Vercel, AWS, or Quartz; use the explicit form for cross-platform clarity.

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).

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

Standard cron: enumerate the last day of each month length — three cron lines. Extended cron: `0 0 L * *` (Quartz, AWS, robfig, dragonmantank, ncrontab don't all support it — see the dedicated guide).

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.

Ready to schedule it?

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.

Free forever tier ・ No credit card required

Your next schedule
GET/wp-cron.php?doing_wp_cron=1

Schedule

every 5 minutes

Next run

in 23s

Apihustle Logo

This tool is part of the Apihustle suite - a collection of tools to test, improve and get to know your API inside and out.

  • Clobbr logo

    Clobbr

    The app & CLI tool to test API endpoint speed.

    Visit
  • Crontap logo

    Crontap

    Schedule recurring API calls using cron syntax.

    Visit
  • CronTool logo

    CronTool

    Debug multiple cron expressions on a calendar.

    Visit

  • Page AI

    AI Website Generator that designs and writes clean code.

    Visit
  • Shipixen

    Generate customized boilerplates in minutes.

    Visit
  • Page UI

    Landing page UI components for React & Next.js

    Visit