Your freeze date isn't a field in Jira.
Here's a Jira Automation flow that enforces it anyway.
I've just published an edition of my newsletter Holy Ship - Release with Jira, covering three Jira automations that protect a release.
As five release managers commented already requested I published the flows, here's the freeze date rule: a Jira Automation built on the Fix versions field, which flags tickets sneaking into a Fix version after scope was supposed to be locked.
Here's the full configuration with the smart values that make it work:
Every release has a moment where scope should stop growing. A cutoff. A freeze.
In practice, tickets keep getting added after that moment. Quietly. Without review. Without anyone flagging the risk.
Nobody is being malicious. There is just nothing in Jira watching for it.
You find out on release day. The scope list is longer than the one you signed off on, and you have no idea when it changed, or who changed it.
A Fix version has a Start date and a Release date. It does not have a freeze date.
So the freeze lives in a Confluence page, a calendar invite, or someone's head. Automation can't read any of those.
Before you can automate the freeze, you have to give Jira a freeze date it can actually read.
| Approach | How it works | Trade-off |
|---|---|---|
| Release date minus N days |
"minusBusinessDays" smart value (see below) |
Zero setup, but assumes every release uses the same freeze window |
| Encode it in the version description | Put a marker like FREEZE:2026-07-20 in the version description, parse it with a smart value |
Flexible per release, more fragile to maintain |
| Store release dates as real data | Freeze, code cut, and deployment dates as first-class fields on a release timeline | Needs a tool that models a release as more than a version name |
Start with the first one. Ship the simple rule, then upgrade it if your freeze window genuinely varies release to release.
Note: restrict to values added, not removed or edited, so the rule doesn't fire on cleanup.
First value
{{issue.fixVersions.releaseDate}}
First value
{{now}}
Second value
{{issue.fixVersions.releaseDate.minusBusinessDays(5)}}
Comment
This ticket was added to {{issue.fixVersions.name}} after the freeze date ({{issue.fixVersions.releaseDate.minusBusinessDays(5)}}). Please confirm this addition is intentional.
Email name
Freeze violation notification
Recipient(s)
{{issue.project.lead.emailAddress}}
Subject
Freeze violation: {{issue.key}} added to {{issue.fixVersions.name}}
Content
{{issue.key}} was added to {{issue.fixVersions.name}} after the freeze date ({{issue.fixVersions.releaseDate.minusBusinessDays(5)}}).
Reporter: {{issue.reporter.displayName}}
Summary: {{issue.summary}}
{{issue.project.lead.emailAddress}} resolves empty if that person's email is hidden in their profile visibility settings. Not a permissions issue, a recipient-resolution one.minusBusinessDaysvs minusDays: one skips weekends, one doesn't.Using the label: save this as a filter on your release dashboard for go/no-go review:
fixVersion = "X" AND labels = added-after-freeze
The rule works as built. These are extras worth considering once it's running:
Sub-task or a Hotfix issue type so the rule only flags the additions that are actually a risk.added-after-freeze label. Otherwise your go/no-go filter keeps showing tickets that aren't even in scope anymore.minusBusinessDays value per branch instead of one hardcoded number.labels = added-after-freeze weekly and sends one summary instead.Pick what's relevant. None of these are required to make the rule useful.
This is article 1 of 3 from that newsletter edition.
Two more are coming:
If you run releases in Jira, join the 2'000+ subscribers of Holy Ship to receive regular content like this one.
David Berclaz _Apwide_
1 comment