Recuro.

25 Ready-to-Use Cron Expressions for Common Schedules

·
Updated March 22, 2026
· Recuro Team
cronreference

Quick Summary — TL;DR

  • A cron expression has five fields: minute, hour, day of month, month, and day of week.
  • This post provides 25 ready-to-use cron schedules covering intervals from every minute to once a year.
  • Watch out for edge cases: day-of-month vs day-of-week conflicts, February date issues, and overlapping executions.
  • Always specify the minute field, use UTC, and test your expressions before deploying.
Cron Expression Examples

25 ready-to-use schedules organized by frequency. Copy the one you need.

Each expression uses the standard five-field format: minute, hour, day-of-month, month, day-of-week. If you need a refresher on operators like *, /, and ,, see the cron syntax cheat sheet.


Every minute / second-level intervals

ScheduleExpressionNotes
Every minute* * * * *Useful for health checks
Every 5 minutes*/5 * * * *Good for polling APIs
Every 10 minutes*/10 * * * *Dashboard refreshes
Every 15 minutes*/15 * * * *Common for sync jobs
Every 30 minutes*/30 * * * *Report generation

Need sub-minute scheduling? Standard cron tops out at one-minute granularity — there’s no way to express “every 30 seconds” in a cron expression. If you need second-level intervals, use a loop with a sleep inside a once-per-minute cron job, or use a scheduler that supports sub-minute intervals natively.

Hourly schedules

ScheduleExpressionNotes
Every hour (on the hour)0 * * * *Cache invalidation
Every 2 hours0 */2 * * *Data aggregation
Every 6 hours0 */6 * * *Digest emails
Every hour during business hours (9–17)0 9-17 * * *Only during work hours

Daily schedules

ScheduleExpressionNotes
Once a day at midnight0 0 * * *Classic daily cleanup
Once a day at 6 AM0 6 * * *Morning report
Once a day at 9 AM UTC0 9 * * *Start-of-business trigger
Twice a day (9 AM and 9 PM)0 9,21 * * *Two-pass sync
Every day at 11:30 PM30 23 * * *End-of-day summary

Weekly schedules

ScheduleExpressionNotes
Every Monday at 9 AM0 9 * * 1Weekly standup reminder
Every Friday at 5 PM0 17 * * 5Weekly report
Weekdays only at 8 AM0 8 * * 1-5Skip weekends
Weekends only at noon0 12 * * 0,6Weekend maintenance
Every Wednesday and Friday at 3 PM0 15 * * 3,5Bi-weekly deploys
Every Monday and Thursday at 6 AM0 6 * * 1,4Bi-weekly digest

Monthly and beyond

ScheduleExpressionNotes
First day of every month at midnight0 0 1 * *Monthly billing
15th of every month at noon0 12 15 * *Mid-month check-in
Last weekday of every month0 18 28-31 * 1-5Approximate — run and check date in your handler
Every quarter (Jan, Apr, Jul, Oct 1st)0 0 1 1,4,7,10 *Quarterly reports
Once a year on Jan 1st0 0 1 1 *Annual cleanup

Real-world application schedules

Here are cron expressions paired with specific use cases — copy these directly into your scheduler:

Use caseExpressionWhy this schedule
SSL certificate expiry check0 9 * * 1Weekly is enough; certs expire in 90 days
Database backup0 2 * * *2 AM avoids peak traffic
Stale session cleanup0 */4 * * *Every 4 hours keeps the sessions table small
Invoice generation0 6 1 * *1st of month, early morning before business hours
Trial expiration emails0 10 * * *10 AM in the user’s likely timezone for better open rates
Exchange rate sync0 */2 * * 1-5Every 2 hours on weekdays (markets are closed on weekends)
Sitemap regeneration30 3 * * *3:30 AM; offset from midnight to avoid contention
Cache warming*/5 * * * *Every 5 minutes keeps cache hot
Abandoned cart reminders0 11,18 * * *11 AM and 6 PM — two nudges per day
Weekly analytics export0 1 * * 0Sunday at 1 AM, after the full week’s data is in

Edge cases and gotchas

Day-of-month vs day-of-week conflict

When both day-of-month and day-of-week are set, most cron daemon implementations run the job when either condition is met, not both. This is a genuine gotcha that’s been confusing developers for decades — the cron man page buries it, and nothing warns you when you write the expression:

Terminal window
# You might think: "1st of the month, but only if it's a Monday"
# Actually means: "Every 1st of the month AND every Monday"
0 9 1 * 1

To run only on the 1st Monday of the month, handle the logic in your application code and schedule the job to run every Monday:

Terminal window
# Run every Monday at 9 AM, check the date in your handler
0 9 * * 1

February and the 29th–31st

0 0 31 * * runs only in months with 31 days — it silently skips February, April, June, September, and November. If you want “last day of the month,” there’s no native cron expression for it. Use 0 0 28-31 * * and check the date in your handler.

Overlapping executions

If a job takes 10 minutes and runs every 5 minutes, you’ll have overlapping executions. Two instances of your sync job writing to the same records simultaneously. Two billing runs processing the same invoices, charging customers twice. The job succeeds from cron’s perspective — it ran, it exited 0. The data is the thing that’s wrong, and it’s often subtly wrong in ways that take hours to spot.

The tricky part: this only happens under load. In development your jobs finish in 2 seconds. In production, with a real dataset, they take 12 minutes. And suddenly your 5-minute interval is a problem.

Solutions:

  • Use a lock file or database lock to prevent concurrent runs
  • Set a timeout shorter than the interval
  • Use a scheduler that supports concurrency control

*/N doesn’t mean “every N from the last run”

*/10 * * * * means “every minute divisible by 10” (0, 10, 20, 30, 40, 50) — not “10 minutes after the last execution.” If your job runs at :10 and takes 12 minutes, the :20 trigger still fires on schedule. Cron is clock-based, not interval-based.


Tips for writing cron expressions

  1. Always specify the minute field. Using * * * * * with a specific hour still fires every minute of that hour — not once.
  2. Use UTC. Store and schedule in UTC to avoid daylight saving surprises. Convert to local time in your application layer.
  3. Test before deploying. Paste your expression into a cron explainer tool to verify the next few run times.
  4. Keep it simple. If your expression is getting complex, consider splitting it into two simpler schedules.
  5. Document the intent. 0 9 * * 1 is meaningless without context — add a label like “Weekly Monday standup reminder” alongside it.

Use with Recuro

Every expression above works directly with Recuro’s cron scheduler. Paste the expression, point it at any HTTP endpoint — Recuro handles execution, retries, and alerting.


Stop managing infrastructure. Start scheduling jobs.

Recuro handles cron scheduling, retries, alerts, and execution logs — so you can focus on building your product.

No credit card required