Tidy Dev Tools

Cron every 15 minutes

Expression: */15 * * * * — Every 15 minutes.

Every 15 minutes

Next 5 runs in UTC, from 1 Jan 2026 (example)

When to use it

Quarter-hourly jobs fit reports, synchronisation tasks and billing meters that have to be reasonably fresh but not instant. The expression */15 is equivalent to the explicit list 0,15,30,45, which some very old cron implementations and a few hosting control panels require. Ninety-six runs a day is a comfortable rhythm for importing orders from a marketplace, pulling exchange rates or rebuilding a search index incrementally. Compared with every five minutes it cuts invocations by two thirds while keeping data at most a quarter of an hour stale, a trade-off most dashboards accept.

Field by field

FieldValueMeaning
Minute*/15every 15th minute: 0, 15, 30 and 45
Hour*every hour
Day of the month*every day of the month
Month*every month
Day of the week*every day of the week

Real-world example

*/15 * * * * /usr/bin/php /var/www/app/artisan orders:import --since=20m

Imports marketplace orders every quarter hour. Asking for the last 20 minutes gives a five-minute overlap, so an order is not missed if one run starts late.

Variants

ExpressionMeaning
0,15,30,45 * * * *At minute 0,15,30,45 past hour *, every day — explicit list for crons that reject steps
*/15 * * * 1-5Every 15 minutes, on weekdays (Monday to Friday) — every quarter hour, Monday to Friday only
7-59/15 * * * *At minute 7-59/15 past hour *, every day — quarter-hourly, offset to :07, :22, :37 and :52

Pitfalls

  • Steps restart every hour: */25 runs at :00, :25 and :50, then again at :00 — a ten-minute gap. Only divisors of 60 give even spacing.
  • Jobs at :00 compete with hourly and daily jobs scheduled by everyone else. Prefer an offset such as 7-59/15 when exact timing does not matter.
  • Make imports idempotent: a run that fails halfway will be retried by the next one, which must not create duplicates.

Questions

How do I see whether the quarter-hourly runs actually happened?

Check the system journal (journalctl -u cron or grep CRON /var/log/syslog), write a timestamp to your own log, or ping a monitoring URL at the end of every successful execution.

Is */15 the same as 0/15?

In standard cron, 0/15 is not portable; some implementations reject it. Write */15 or the explicit list 0,15,30,45, which every cron understands.

Can I run every 15 minutes starting at 09:10?

Use 10-59/15 9-17 * * * for 09:10, 09:25, 09:40 and 09:55 each hour. Cron cannot express a single starting moment followed by an interval.

The same schedule elsewhere

  • GitHub Actions: on: schedule: - cron: '*/15 * * * *'. Always UTC, and runs can start several minutes late when runners are busy.
  • Kubernetes CronJob: schedule: "*/15 * * * *"; set concurrencyPolicy: Forbid to prevent overlapping pods and timeZone if you need local time.
  • Cloudflare Workers: crons = ["*/15 * * * *"] under [triggers] in wrangler.toml, evaluated in UTC.

Before you deploy

Use absolute paths, because cron starts commands with a minimal PATH and without your shell profile. Make the job idempotent so a late or repeated run does no harm, log its exit code, and let a dead-man's-switch monitor alert you when an expected run never happens.

Other schedules