Defining Field Validations
Field validation rules enforce data quality, consistency, and business rules automatically at the point of data entry. They validate field values in real-time and display custom error messages when validation fails, preventing invalid data from entering your Jira instance.
Formify provides 15 validation types across four categories:
- Presence Validations - Control whether fields must have or lack values
- Date Validations - Enforce date constraints, SLA deadlines, and date sequencing
- Number Validations - Validate numeric thresholds, ranges, and quality gates
- Text Validations - Enforce text length, content requirements, and quality standards
Each validation type provides immediate feedback with customizable error messages, helping users submit correct data the first time.
Why Field Validation Matters
Traditional Jira provides only basic "required field" functionality—a simple yes/no toggle that doesn't account for context. Workflow validators exist but only trigger on transitions, not during data entry. ScriptRunner offers validation through Groovy scripts, but requires coding expertise and ongoing maintenance.
Field validation rules provide a better approach:
- ✅ Catch invalid data immediately as users type, not after submission
- ✅ Enforce SLA deadlines and business rules automatically
- ✅ Provide clear, actionable error messages explaining what's wrong
- ✅ Apply conditional logic - different validation for different contexts
- ✅ No coding required - configure through visual interface
- ✅ Maintain data consistency with cross-field validation
Competitive Advantage
Unlike Jira's basic required fields or workflow validators, you get:
- 15+ validation types with conditional logic
- Custom error messages without Groovy scripts
- Real-time feedback as users type
- No ScriptRunner purchase needed
- Centralized management alongside other rules
Choosing the Right Validation
Use this quick reference to select the appropriate validation type:
| Goal | Validation Type | Example |
|---|---|---|
| Ensure field has a value | Must not be empty | Story Points required for all Stories |
| Ensure field is cleared | Must be empty | Resolution Date must be empty when Status ≠ Done |
| Enforce SLA deadlines | Date at least X days ahead | Due Date must be ≥2 hours from now for Critical tickets |
| Prevent past dates | Date after today | Start Date must be in the future |
| Prevent future dates | Date before today | Incident Date must be in the past |
| Ensure date sequencing | Date after another field | End Date must be after Start Date |
| Validate date dependencies | Date before another field | Review Date must be before Release Date |
| Enforce minimum thresholds | Number greater than | Story Points must be > 0 |
| Enforce maximum limits | Number less than | Story Points must be < 100 |
| Validate numeric ranges | Number between | Estimate must be between 1-40 hours |
| Prevent zero values | Number is not zero | Budget must be non-zero |
| Enforce minimum content length | Text minimum length | Incident summary must be ≥15 characters |
| Enforce maximum content length | Text maximum length | Summary must be ≤100 characters |
| Require specific keywords | Must contain text | Summary must contain ticket reference (e.g., "JIRA-") |
| Prevent forbidden content | Must not contain text | Description must not contain placeholder text (e.g., "TODO") |

Validation Categories
When configuring a validation rule, the system automatically shows only validation types compatible with your target field. For example, date fields show date validations, number fields show number validations, and so on. This ensures you only see relevant options for the field you're configuring.
1. Presence Validations
Presence validations control whether fields must have values or remain empty. These are the most commonly used validations, replacing traditional "required field" configuration with conditional, context-aware requirements.
Must not be empty
Ensures a field has a value — equivalent to "required field" but with conditional logic.
When to Use
- ✅ Conditional required fields - Require data only in specific contexts
- ✅ Data completeness gates - Ensure critical information is captured
- ✅ Quality standards - Enforce minimum data requirements before progression
- ✅ Context-aware forms - Make fields required based on issue type, priority, status, or user role
How It Works
When conditions are met, the validation applies and the field must contain a value:
- Empty values → validation fails → shows custom error message
- Text: Non-empty strings (whitespace-only = empty)
- Select: Selection required
- Multi-select: ≥1 option selected
- Date/Number: Value must be set (zero is valid for numbers)
Common Gotchas
- Zero is valid for number fields — use "Number is not zero" to prevent zero
- Whitespace-only text counts as empty (prevents bypassing validation)
- Can't validate hidden fields — ensure field is visible when validation applies
Configuration

- Validation type: Must not be empty
- Error message (optional): Default is "This field must not be empty" 💡 Best practice: Explain why the field is required and when it's needed
- Parameters: None
Example 1: Story Points quality gate — Require estimation for all Stories
Business need: All Stories must have Story Points estimated before sprint planning. This ensures accurate capacity planning and prevents unestimated work from entering sprints.
Configuration:
- Target field: Story Points
- Screen: Global Issue Create
- Conditions: Issue Type = Story
- Validation: Must not be empty
- Error message: "Story Points are required for all Stories to support sprint planning and capacity estimation. Please estimate this Story before saving."
✅ Result: When creating Stories, users must provide Story Points. The error message guides them on why it's required.
Why it works: The validation enforces your team's estimation standard automatically. Combined with conditional logic, you can require Story Points only for Stories, not for Bugs or Tasks.
Supported Field Types
All field types support presence validation:
- Text fields (Summary, Description, custom text)
- Select fields (Priority, Issue Type, custom select)
- Multi-select fields (Components, Labels, custom multi-select)
- Date fields (Due Date, custom date fields)
- Number fields (Story Points, custom number fields)
- User fields (Assignee, Reporter, custom user pickers)
- All other Jira field types
Must be empty
Ensures a field is cleared or has no value. Less common than "must not be empty" but critical for workflow state management and data consistency.
When to Use
- ✅ State management - Ensure fields are cleared when transitioning between states
- ✅ Data consistency - Prevent invalid field combinations
- ✅ Workflow enforcement - Require users to clear fields before certain transitions
- ✅ Audit compliance - Ensure sensitive data is removed in certain contexts
How It Works
When conditions are met, the validation applies and the field must be empty:
- Any non-empty value → validation fails → shows custom error
- Text: Empty string or null
- Select: No selection made
- Multi-select: No options selected
- Date: No date set
- Number: No number entered (zero counts as non-empty)
Common Gotchas
- Required fields can't be empty — creates conflict, remove native required status first
- Zero counts as non-empty for number fields
- Use with transitions to enforce state cleanup
Configuration
- Validation type: Must be empty
- Error message (optional): Default is "This field must be empty" 💡 Best practice: Explain why the field must be cleared
- Parameters: None
Example 1: Clear Resolution Date when reopening — Maintain data consistency
Business need: When reopening a resolved issue, the Resolution Date must be cleared because the issue is no longer resolved.
Configuration:
- Target field: Resolution Date
- Screen: Issue Transition (to In Progress, from Done)
- Conditions: Target Status = In Progress, Previous Status = Done
- Validation: Must be empty
- Error message: "Resolution Date must be cleared when reopening an issue. Please remove the Resolution Date before transitioning to In Progress."
✅ Result: Users can't reopen issues without clearing Resolution Date, maintaining data consistency.
Why it works: Prevents stale Resolution Dates from remaining on active issues, ensuring accurate reporting on resolved vs. open issues.
Supported Field Types
All field types support presence validation. Most commonly used with:
- Date fields (Resolution Date, Due Date)
- User fields (Assignee, Reviewer)
- Number fields (Story Points, Estimate)
- Select fields (Resolution, Status-dependent fields)
2. Date Validations
Date validations enforce date constraints, SLA deadlines, and date sequencing. They're essential for project planning, SLA compliance, and maintaining date consistency across related fields.
💡 Technical Note: All date validations use timezone-safe "YYYY-MM-DD" string comparison, ensuring consistent behavior regardless of user timezone.
Date after today
Ensures a date field contains a future date—any date after the current day (12:00 AM tomorrow or later).
When to Use
- ✅ Future planning - Ensure dates represent future events
- ✅ SLA compliance - Prevent setting deadlines in the past
- ✅ Workflow gates - Require future dates for planning activities
- ✅ Data quality - Catch accidental past date selections
How It Works
When conditions are met, the field value must be a date after today:
- Comparison: Dates at day-level precision (ignores time)
- "Today" = current date in user's timezone
- "After today" = tomorrow or any future date
- Today's date fails validation
Configuration
- Validation type: Date after today
- Error message (optional): Default is "Date must be after today" 💡 Best practice: Explain why future dates are required
- Parameters: None
Example 1: Future release dates — Prevent data entry errors
Business need: Release Date must be in the future because we can't release software in the past. This prevents data entry errors when planning releases.
Configuration:
- Target field: Release Date
- Screen: Global Issue Create
- Conditions: Issue Type = Release
- Validation: Date after today
- Error message: "Release Date must be in the future. Please select a date after today for this upcoming release."
✅ Result: Release dates must be tomorrow or later, preventing accidental past date selection.
💡 Pro Tip: To allow today's date, use "Date at least X days in future" with X=0 instead. "After today" strictly means tomorrow or later.
Supported Field Types
- Due Date (system field)
- Start Date, End Date (system fields if enabled)
- Custom date picker fields
- Custom datetime fields
Date before today
Ensures a date field contains a past date—any date before the current day (yesterday or earlier).
When to Use
- ✅ Historical dates - Ensure dates represent past events
- ✅ Incident reporting - Require incident dates in the past
- ✅ Audit compliance - Validate historical data entry
- ✅ Data quality - Prevent future dates for past events
How It Works
When conditions are met, the field value must be a date before today:
- Comparison: Dates at day-level precision (ignores time)
- "Today" = current date in user's timezone
- "Before today" = yesterday or any past date
- Today's date fails validation
Configuration
- Validation type: Date before today
- Error message (optional): Default is "Date must be before today" 💡 Best practice: Explain why past dates are required
- Parameters: None
Example 1: Incident date must be in the past — Ensure accurate incident timelines
Business need: When reporting incidents, the Incident Date must be in the past because we can't report incidents that haven't happened yet. This ensures accurate incident timelines.
Configuration:
- Target field: Incident Date
- Screen: Global Issue Create
- Conditions: Issue Type = Incident
- Validation: Date before today
- Error message: "Incident Date must be in the past. If the incident occurred today, please wait until tomorrow to report it, or contact your administrator."
✅ Result: Incident Date must be yesterday or earlier, ensuring incidents represent past events.
Supported Field Types
- Due Date (system field)
- Custom date picker fields
- Custom datetime fields
Date at least X days in future
Ensures a date field is at least X days in the future from today. This is the most powerful date validation for SLA enforcement, planning horizons, and lead time requirements.
When to Use
- ✅ SLA enforcement - Require minimum lead time for critical work
- ✅ Planning horizons - Ensure adequate planning time before deadlines
- ✅ Capacity management - Prevent last-minute work from bypassing triage
- ✅ Business rules - Enforce organizational policies for advance notice
How It Works
When conditions are met, the field value must be at least X days from now:
- Calculation: minimum_date = today + X days
- Comparison: field_date must be ≥ minimum_date
- X=0 allows today's date
- X=1 requires tomorrow or later
- X=2 requires day-after-tomorrow or later

Configuration
- Validation type: Date at least X days in future
- Number of days: Enter a positive integer (0, 1, 2, 3, ...)
- 0 = allows today (useful for "today or later" validation)
- 1 = allows tomorrow (not today)
- 2 = allows day-after-tomorrow (not today or tomorrow)
- Error message (optional): Default is
"Date must be at least {X} days from now"💡 Best practice: Explain why the lead time is required and reference your SLA
Example 1: Critical ticket SLA - 2 hours minimum — Automated SLA enforcement
Business need: Critical priority tickets require a Due Date at least 2 hours from creation time to allow for proper triage, assignment, and initial investigation. This prevents hasty responses and ensures quality work.
Configuration:
- Target field: Due Date
- Screen: Global Issue Create
- Conditions: Priority = Critical
- Validation: Date at least X days in future
- Days: 0 (to enforce minimum hours, we'll use custom message to clarify 2-hour policy)
- Error message: "Critical tickets require Due Date at least 2 hours from now to allow time for triage and assignment. Please select a date/time at least 2 hours in the future."
✅ Result: Critical tickets can't have Due Dates sooner than 2 hours away, enforcing your SLA policy automatically.
Why it works: Automated SLA enforcement—no manual oversight needed. Users get immediate feedback if they select dates too soon.
💡 Pro Tip: The validation works at day-level precision, not hour/minute precision. For "2 hours" requirements, use 0 days and explain the hour requirement in your error message. Most teams find day-level precision sufficient for planning purposes.
Supported Field Types
- Due Date (system field)
- Start Date, End Date (system fields if enabled)
- Custom date picker fields
- Custom datetime fields
Date after another field
Ensures a date field is chronologically after another date field. Critical for maintaining date sequencing and dependencies (e.g., End Date must be after Start Date).
When to Use
- ✅ Date sequencing - Ensure logical date order (end after start, finish after begin)
- ✅ Dependencies - Validate dependent dates (Review after Development, Release after Testing)
- ✅ Project planning - Maintain milestone order
- ✅ Data consistency - Prevent impossible date combinations
How It Works
When conditions are met, the target field must contain a date after the comparison field:
- Comparison: target field > comparison field
- Both fields must have values for validation to apply
- If comparison field is empty, validation passes (fail-safe behavior)
- Same date fails validation ("after" means strictly later, not equal)
Configuration
- Validation type: Date after another field
- Select comparison field: Choose the field that must come before the target field Example: If target is End Date, choose Start Date as comparison field
- Error message (optional): Default is
"Date must be after {field name}"💡 Best practice: Explain the relationship and why it matters
Example 1: End Date after Start Date — Maintain valid timelines
Business need: Project End Date must be after Start Date to represent valid project timelines. This prevents data entry errors and ensures accurate Gantt charts and roadmaps.
Configuration:
- Target field: End Date
- Screen: Global Issue Create
- Conditions: Issue Type = Epic OR Project
- Validation: Date after another field
- Comparison field: Start Date
- Error message: "End Date must be after Start Date. Please ensure your project timeline has End Date later than Start Date."
✅ Result: Users can't save issues with End Date before/equal to Start Date, maintaining valid timelines.
Why it works: Catches data entry errors immediately. Prevents impossible date ranges from entering your system.
💡 Pro Tip: Be careful not to create circular dependencies (A after B, B after A). Such configurations make it impossible to satisfy all validations.
Supported Field Types
Date fields compared to other date fields:
- Due Date, Start Date, End Date (system fields)
- Custom date picker fields
- Custom datetime fields
Date before another field
Ensures a date field is chronologically before another date field. Mirror of "date after field" for reverse dependencies.
When to Use
- ✅ Reverse dependencies - Validate dates that must precede others
- ✅ Deadline enforcement - Ensure milestones come before deadlines
- ✅ Sequential validation - Maintain order from earlier perspective
- ✅ Data consistency - Prevent impossible date combinations (from earlier date's viewpoint)
How It Works
When conditions are met, the target field must contain a date before the comparison field:
- Comparison: target field < comparison field
- Both fields must have values for validation to apply
- If comparison field is empty, validation passes (fail-safe)
- Same date fails validation ("before" means strictly earlier, not equal)
Configuration
- Validation type: Date before another field
- Select comparison field: Choose the field that must come after the target field Example: If target is Start Date, choose End Date as comparison field
- Error message (optional): Default is
"Date must be before {field name}"💡 Best practice: Explain the relationship and why it matters
Example 1: Start Date before End Date — Same constraint, different perspective
Business need: Project Start Date must be before End Date. Same constraint as "End Date after Start Date" but validated from Start Date's perspective.
Configuration:
- Target field: Start Date
- Screen: Global Issue Create
- Conditions: Issue Type = Epic OR Project
- Validation: Date before another field
- Comparison field: End Date
- Error message: "Start Date must be before End Date. Please ensure your project timeline has Start Date earlier than End Date."
✅ Result: Same effect as "End Date after Start Date" but applied to Start Date field instead.
Choosing After vs. Before: Both validations achieve the same goal (maintaining date order). Choose based on which field users fill first. If users fill Start Date before End Date, validate "Start Date before End Date". If users fill End Date first, validate "End Date after Start Date".
Supported Field Types
Date fields compared to other date fields:
- Due Date, Start Date, End Date (system fields)
- Custom date picker fields
- Custom datetime fields
3. Number Validations
Number validations enforce numeric thresholds, ranges, and quality gates. Essential for story point estimation, budget controls, capacity management, and any numeric business rules.
💡 Technical Note: All number validations handle both integers and decimals, and validate against numeric values or numeric strings.
Number greater than threshold
Ensures a number field exceeds a minimum threshold. Most common number validation for quality gates and minimum requirements.
When to Use
- ✅ Quality gates - Require minimum values (Story Points > 0)
- ✅ Budget thresholds - Enforce minimum budgets for certain work types
- ✅ Capacity management - Ensure adequate resource allocation
- ✅ Business rules - Implement organizational minimums
How It Works
When conditions are met, the field value must be strictly greater than your threshold:
- Comparison: field_value > threshold_value
- Works with integers and decimals (5.5 > 5, 5.1 > 5)
- Supports negative numbers (-5 > -10)
- Zero is a valid comparison threshold
Configuration
- Validation type: Number greater than threshold
- Threshold value: Enter a number (integer or decimal)
- Most common: 0 (require positive values)
- Can use negative numbers if needed
- Error message (optional): Default is
"Value must be greater than {threshold}"💡 Best practice: Explain why the minimum exists and what it represents
Example 1: Story Points must be positive — Enforce estimation discipline
Business need: All Stories must have Story Points greater than 0. Zero-point Stories indicate missing estimation. This ensures all Stories are estimated before sprint planning.
Configuration:
- Target field: Story Points
- Screen: Global Issue Create
- Conditions: Issue Type = Story
- Validation: Number greater than threshold
- Threshold: 0
- Error message: "Story Points must be greater than 0. Please estimate this Story before saving. If this Story requires no effort, consider whether it should be a Story at all."
✅ Result: Story Points must be at least 1 (or 0.5 if using half-points), preventing zero or negative estimates.
Why it works: Enforces estimation discipline. Zero-point Stories often indicate incomplete grooming or misunderstanding of the work involved.
💡 Pro Tip: Strictly greater than, not equal. If threshold is 0, zero fails validation. If you need to allow zero, remove this validation or use "Number is not zero" instead.
Supported Field Types
- Story Points (system field if enabled)
- Time Tracking fields (Original Estimate, Remaining Estimate)
- Custom number fields
- Custom decimal fields
Number less than threshold
Ensures a number field is below a maximum threshold. Used for caps, limits, and maximum requirements.
When to Use
- ✅ Maximum limits - Enforce caps on values (Story Points < 100)
- ✅ Budget controls - Prevent excessive budgets without approval
- ✅ Capacity constraints - Ensure values stay within limits
- ✅ Reasonableness checks - Catch data entry errors (estimates that are too large)
How It Works
When conditions are met, the field value must be strictly less than your threshold:
- Comparison: field_value < threshold_value
- Works with integers and decimals
- Supports negative numbers
- "Less than 100" means 99.99... or lower, not 100
Configuration
- Validation type: Number less than threshold
- Threshold value: Enter a number (maximum allowed value)
- Common: 100 (Story Points sanity check), 1000000 (budget cap)
- Error message (optional): Default is
"Value must be less than {threshold}"💡 Best practice: Explain why the maximum exists
Example 1: Story Points sanity check — Encourage Story splitting
Business need: Story Points exceeding 40 indicate Stories that are too large and should be split. This validation catches oversized Stories early.
Configuration:
- Target field: Story Points
- Screen: Global Issue Create
- Conditions: Issue Type = Story
- Validation: Number less than threshold
- Threshold: 41
- Error message: "Story Points must be less than 41. Stories larger than 40 points should be split into smaller Stories. Please break this down into multiple Stories."
✅ Result: Story Points capped at 40, encouraging Story splitting.
Why it works: Large Stories create estimation uncertainty and delivery risk. This validation enforces a "split large Stories" policy automatically.
Supported Field Types
- Story Points (system field if enabled)
- Time Tracking fields
- Custom number fields
- Custom decimal fields
Number within range
Ensures a number field falls within a specified range (inclusive). Useful for bounded estimates, acceptable ranges, and multi-threshold validation.
When to Use
- ✅ Bounded estimates - Ensure values within acceptable range (Story Points 1-40)
- ✅ Percentage validation - Ensure percentages between 0-100
- ✅ Rating scales - Validate ratings within scale (1-5 stars)
- ✅ Acceptable ranges - Enforce business rule ranges
How It Works
When conditions are met, the field value must fall between your minimum and maximum thresholds:
- Range validation: min_value ≤ field_value ≤ max_value
- Both bounds are inclusive (1-10 includes both 1 and 10)
- Minimum must be less than maximum
- Works with integers and decimals
Configuration
- Validation type: Number within range
- Minimum value: Enter the lower bound of acceptable range
- Maximum value: Enter the upper bound of acceptable range (must be greater than minimum)
- Error message (optional): Default is
"Value must be between {min} and {max}"💡 Best practice: Explain the range and why it exists
Example 1: Story Points range — Single validation for both bounds
Business need: Story Points must be between 1-40. Points below 1 indicate missing estimation, and points above 40 indicate Stories that should be split.
Configuration:
- Target field: Story Points
- Screen: Global Issue Create
- Conditions: Issue Type = Story
- Validation: Number within range
- Minimum: 1
- Maximum: 40
- Error message: "Story Points must be between 1-40. Values below 1 indicate missing estimation. Values above 40 indicate Stories that should be split into smaller pieces."
✅ Result: Story Points must be 1-40 inclusive, enforcing estimation quality standards.
Why it works: Single validation enforces both minimum (must estimate) and maximum (must split large Stories).
Supported Field Types
- Story Points (system field if enabled)
- Time Tracking fields
- Custom number fields
- Custom decimal fields
Number is not zero
Ensures a number field is not exactly zero. Simpler than "greater than 0" because it allows negative numbers.
When to Use