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
| Field | Value | Meaning |
|---|---|---|
| Minute | */15 | every 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
| Expression | Meaning |
|---|---|
0,15,30,45 * * * * | At minute 0,15,30,45 past hour *, every day — explicit list for crons that reject steps |
*/15 * * * 1-5 | Every 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 * * * *"; setconcurrencyPolicy: Forbidto prevent overlapping pods andtimeZoneif 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.