Cron Schedule Pre-Deploy Verification: 5 Steps Before You Push Any Cron Change
Table of Contents
Cron expression bugs are nearly invisible until they cause problems: a job that was supposed to run weekdays running on Saturdays, a timezone offset that silently moves a daily report from 9 AM to 2 PM, a schedule change that lands in a maintenance window nobody planned for. These bugs reach production because cron expressions are hard to review as raw strings.
This 5-step checklist builds the visualizer into your deploy workflow so expression errors get caught before they go live — not in a 2 AM post-mortem.
Step 1: Rebuild the Expression From Scratch in the Generator
Before trusting an expression you're about to deploy, open the free cron expression generator and rebuild it from the stated requirement — not from the expression itself.
Ask: "What was this schedule supposed to do?" Then build it fresh from that description. Compare the result to the expression you're deploying. If they match, the expression is almost certainly correct. If they differ, you have a divergence to investigate.
This step is most valuable when:
- You inherited a cron expression from someone else and can't verify original intent from the git history
- You're modifying an existing expression and want to confirm the change is only what you intended
- You're adapting a standard expression for a platform-specific format (adding seconds field for Spring Boot, adding
?for AWS EventBridge)
Time cost: 2 minutes. Defect prevention: catches copy-paste errors, field-order mistakes, and off-by-one errors before you ever deploy.
Step 2: Verify Next 20 Run Times in the Crontab Visualizer
Open the free crontab visualizer and paste the expression. The calendar shows the next 20 run times in your browser's local timezone. Check three things:
- Day of week correctness: If the job is supposed to run weekdays, are all 20 entries on Monday–Friday? Any Saturday or Sunday entry means the expression is wrong.
- Time of day correctness: Are all entries at the intended hour and minute? If you see a different time than expected, suspect a timezone issue (go to Step 3).
- Frequency correctness: Count entries per day/week/month. A job intended to run twice a day should show exactly 2 entries per day in the calendar — not 1, not 3.
The calendar view catches errors that are invisible in a five-character string:
0 9 * * 1-5— correct weekday schedule, confirmed visually0 9 * * 1,5— only Monday and Friday, not Mon–Fri (comma vs dash confusion)0 9 1-5 * *— days 1 through 5 of the month, not weekdays (fields swapped)
The last two examples look nearly identical as strings. On the calendar, they're immediately obvious.
Sell Custom Apparel — We Handle Printing & Free ShippingStep 3: Verify Timezone Math
If the visualizer shows the right days but the wrong time — or if the expression is intended for a platform that only accepts UTC — verify the timezone conversion before deploying.
The crontab visualizer shows run times in your browser's local timezone. If your server runs in UTC, a job written as 0 9 * * 1-5 runs at 9:00 AM UTC — which is 4:00 AM or 5:00 AM Eastern depending on DST. The visualizer shows you the UTC time as your local time, which may look wrong if you were expecting to see 9:00 AM local.
Timezone verification steps:
- Identify what timezone the target platform uses (check the platform docs — GitHub Actions and Kubernetes default to UTC; Linux crontab uses the system timezone)
- If the platform is UTC and your intent is local time, convert: "9 AM New York" is
14 * * * 1-5in standard time,13 * * * 1-5in daylight saving time - If the platform supports timezone configuration (Kubernetes
timeZone:, QuartzCRON_TZ=), add it explicitly rather than doing manual UTC math — this survives DST transitions automatically
Step 4: Diff the New Expression Against the Current One
If you're modifying an existing cron expression rather than adding a new one, explicitly diff both in the visualizer before deploying.
Open two browser tabs: paste the current expression in one, the new expression in the other. Compare the calendars side by side:
- Does the change affect only what you intended? A change from
0 7 * * 1-5to0 9 * * 1-5should shift run times by 2 hours and nothing else. If the calendars show different days running, the change introduced an unintended scope change. - Does the new schedule overlap with maintenance windows? Check whether the new run times fall in a known deployment or backup window. The calendar makes this visible; the raw expression doesn't.
- Is the first run after deploy at a reasonable time? A new schedule deployed at 8:55 AM that runs at 9:00 AM will trigger almost immediately. A new schedule deployed at 8:55 AM that runs at 9:00 AM in a different timezone might trigger at an unexpected time.
Step 5: Document the Change Before You Push
Before the expression goes live, spend 60 seconds on documentation that will save hours later:
- In the codebase: Add a one-line comment above the expression:
# Runs weekdays at 9 AM UTC — verify: wildandfreetools.com/developer-tools/crontab-visualizer/ - In the PR: State old schedule, new schedule, and reason for the change in plain English. Link to the visualizer for reviewers.
- In the runbook/wiki: Update the schedule entry if one exists. Include the plain-English description, not just the expression.
Cron changes are notoriously hard to reason about in post-incident reviews because the original intent is almost never recorded. A one-line comment in the file and a plain-English PR description are the minimum viable audit trail.
Checklist summary: Build from scratch → Verify calendar → Check timezone → Diff against current → Document. Total time: under 10 minutes. Probability of catching a silent production bug: high.
Step 2: Verify in the Free Crontab Visualizer
Paste your expression and see next 20 run times on a calendar. Catch errors before they go live.
Open Free Crontab VisualizerFrequently Asked Questions
How do I test a cron expression before deploying it?
Two-step process: (1) Build or rebuild the expression in the free cron generator from the stated schedule requirement — this catches expression errors before you verify anything. (2) Paste the expression into the free crontab visualizer and check the next 20 run times on the calendar — confirm the days, times, and frequency are all correct. These two free browser tools catch the majority of cron expression bugs before they reach production.
What is the most common cron expression bug in production?
Timezone mismatch is the most frequent silent bug: the expression is written in local time but the server runs in UTC, or the server timezone changes during DST and the job shifts by an hour. Second most common: comma vs dash confusion (1,5 means "the 1st and the 5th" but 1-5 means "1 through 5") — these look nearly identical as strings but produce completely different schedules. Both are immediately visible in a calendar view.
Should I always verify a cron expression before deploying?
Yes, always — even for expressions you've used before on other platforms. The same five-field expression behaves correctly on Linux crontab but may need a field added or a wildcard replaced on AWS EventBridge, Spring Boot, or Quartz. Platform-specific adaptations introduce new opportunities for errors, and a 2-minute calendar check before every deploy is cheaper than debugging a missed production job.

