# Run a Cron Job Every Hour

> The cron expression for every hour is 0 * * * *. What the fields mean, when it runs next, and how to offset from the top of the hour.

```
0 * * * *
```

In plain English: At minute 0.

0 in the minute field with a wildcard hour fires once an hour, on the hour — 00:00, 01:00, 02:00, and so on. The minute is pinned to 0; if it were also *, the job would run every minute. That single 0 is the most common beginner fix in cron debugging.

## Field by field

| Field | Value | Meaning |
|---|---|---|
| Minute | `0` | 0 |
| Hour | `*` | every hour |
| Day of month | `*` | every day |
| Month | `*` | every month |
| Day of week | `*` | every weekday |

## Variations

- `17 * * * *` — hourly at :17 past — off the congested top of the hour
- `0 9-17 * * *` — hourly, but only 09:00 through 17:00
- `0 */2 * * *` — every 2 hours instead

## FAQ

### Why does my 'hourly' job run every minute?

You probably wrote * * * * * instead of 0 * * * *. A wildcard minute matches all 60 minutes; pinning it to one value is what makes the schedule hourly.

### Should hourly jobs run at minute 0?

Only if they must align to the clock. Minute 0 is when everyone's jobs fire — picking a random minute like :17 or :43 spreads load and often runs faster on shared infrastructure.

## Related schedules

- [*/30 * * * * — Run a Cron Job Every 30 Minutes](https://www.devkult.com/cron/every-30-minutes.md)
- [0 */2 * * * — Run a Cron Job Every 2 Hours](https://www.devkult.com/cron/every-2-hours.md)
- [0 */6 * * * — Run a Cron Job Every 6 Hours](https://www.devkult.com/cron/every-6-hours.md)

Open the interactive page: https://www.devkult.com/cron/every-hour