Get started with workflow functions

The way tasks and processes are managed in Jira is through workflows. A workflow maps out the statuses an issue can go through and the available transitions between the statuses that together define your entire process. 

You can edit the overall workflow used in a project, or modify the way particular issue types are handled in the workflow. But: At some point, you might end up stuck in the middle of nowhere because of feature limitations.

At this point, Jira Workflow Toolbox for Jira comes in handy!

JWT for Jira enhances the way you configure workflows. It extends the native functionality by offering custom conditions, validators, and post functions.

JWTCLOUD Get Started.png

Conditions

Conditions 🔒 are used to control the transitions available to a user. If a condition fails, the user will not see the transition button on the Jira issue view, and so will not be able to execute the transition.

JWT offers the following conditions:

To get more familiar with conditions, we recommend to take a look at our use case library:

📚 Condition use cases and examples

Validators

Validators 🔎 are used to guarantee accuracy of existing issue data or data entered on a transition screen before a transition is performed.

JWT offers the following validators:

To get more familiar with validators, we recommend to take a look at our use case library:

📚 Validator use cases and examples

Use case Parser functions
Prevent a transition depending of the number of components

numberOfSelectedItems()

Prevent a closed issue from being reopened after resting 1 week closed

isInRole()

Prevent issue from being "Closed" if blocking issues are not closed yet.


Prevent the creation of sub-tasks unless the parent issue is in a certain status
Block an Epic's transition until all the issues under that Epic are resolved

count()

issuesUnderEpic()

filterByResolution()

Block an Epic's transition depending on linked issues status and due date

count()

filterByPredicate()

linkedIssues()

Prevent transitioning when there is a blocking issue


Evaluate Assets objects

findPattern() findReplaceAll() replaceAll() toStringList()

Prevent issue creation with the same field value


Proceed with a task only when all sub-tasks are completed


Prevent setting due dates outside business hours

withinCalendar()

Prevent creation of issues with a duplicate summary
Ensure that all issues linked with a certain issue link type have "Due Date" field set

count()

linkedIssues()

fieldValue()

Validation based on the value of a date type project property

stringToDate()

projectProperty()

Prevent issue creation if description contains less than 100 characters

replaceAll() length()

Restrict issue creation per issue type and project role

isInRole()

Validate a Select List (cascading) custom field


Ensure that an issue has at least one attachment
Prevent issue creation with the same field value (Boolean)

count()

issuesFromJQL()

Validate only issue links created in transition screen

count()

transitionLinkedIssues()

filterByProject()

filterByIssueType()

Reject duplicated file names in attachments

count()

toStringList()

distinct()

Prevent external users from creating issues

matches() toString() textOnStringList() toStringList() userDisplayName()

Halt a transition if an element is not contained in a list

toStringList()

Block a transition until all sub-tasks have certain fields populated

count()

filterByPredicate()

subtasks()

Restrict the issue creation with specific issue types to certain project roles


Close parent issue only when all sub-tasks are closed


Make "Time spent" field required


Post functions

Post functions ⚙️ are used to perform additional processing and help to automate tasks after a transition is performed.

JWT offers the following post functions:

To get more familiar with post functions, we recommend to take a look at our use case library:

📚 Post function use cases and examples

Use case Parser functions
Add comment with the request participants' display name

toString()  textOnStringList() toStringList() userDisplayName()

Create issue under epic

toString() epic()

Get attributes of Assets objects
Log absence time on another issue

stringToDate()

Prioritize the issues globally

indexOf() previousValue() issuesFromJQL()

Automatically fill an insight custom field after a transition
Move an issue to another issue type
Create an internal Service Management comment on linked issues
Alert the reporter


Create issues randomly

modulus()

round()

random()

Create a sub-task for every sub-task closed

findReplaceFirst() first() findPattern() toString() sum() toNumber()

Obtain a value from an Elements Connect custom field

findPattern()

toString()

Clone epic, tasks and sub-tasks

toString() toStringList() issueKeysToIssueList() replaceFirst() first() fieldValue() textOnStringList() findModify() subtasks() issuesUnderEpic()

Set a date on the same week day on alternate weeks

addDays() nextDayOfTheWeek() modulus() weekOfTheYear() datePart()

Set a Date Picker field to the nth day of the month

dayOfTheMonth() lastDayOfTheMonth() addDays()

Alert the assignee of important issues


Set the next fix version

floor() toNumber() substring() length()

Create Confluence page with links to issues
Set reporter as assignee if a User Picker field is empty
Set fix version based on its start and release date

toString() textOnStringList() unreleasedVersions() startDates() releaseDates() first()

Add user to field depending on selected options
Set Due Date with latest value among sub-tasks

fieldValue()

max()

siblingSubtasks()

Create sub-tasks depending on selected values in custom field

toStringList()

Assign important issues to the project lead
Automatically log work on a Jira issue

dateTimeToString()

Add percentaged profit margin when closing issue
Reopen parent issue, if a sub-task is reopened
Extract an email address from the last comment
Shorten the summary to a maximum number of characters

substring() length()

Create an overview page for a software release
Create an issue with a custom summary

previousValue()

Set issue security level depending on reporter

issueSecurityLevel()

Keep the status of parents and sub-tasks in sync (post function use case)


Clone issue in external instance
Match several values of a list

toString() distinct() filterByPredicate()

Create a sub-task for each component

toStringList()

Format the issue's summary according to specified rules
Create three issues with individual summaries

getMatchingValue()

Create a component to group issues related to UI design
Link issue to issue keys in its description

findPattern() toString()

Assign issue to current user
Keep parent issue's priority in sync
Notify the reporter of an issue about its status by a Telegram message
Set the assignee of an external issue same as the transitioned issue


Add assignee as watcher to every blocking issue


Add internal Jira Service Management comment


Start Progress on parent, if sub-tasks are started


Create several issues combining fields

nthElement() toStringList() modulus() count() ceil()

Transition an external Jira ticket based on the linked internal one


Create a comment on an external Jira ticket
Set assignee based on a former assignee

previousValue()

Automatically log work spent in a specific status

timeDifference()

Set assignee based on priority

priority()

Automatically link an issue to an external one
Create a personal space for a new employee
Triage issues created by email

toUpperCase() 

toString() 

findPattern() 

isInGroup()

Get Hubspot contact information
Link a Jira issue with the corresponding release ticket
Get Checklist
Add watchers ignoring inactive users

usersInGroup() isActive() toString() filterByPredicate()

Add watchers based on issue type


Add a table with the elements of a text to an email

toString() textOnStringList() toStringList()

Copy latest due date from sub-tasks
Copy formatted description of issue into email

wikiToHTML()

Automatically assign a tester during your development process
Create a new employee account during an onboarding process
Remove blocking links when blocking issue is closed
Create several sub-tasks depending on the component
Read the information from a Trello card
Extract the issue priority from the summary
Add days skipping weekends and holidays to a Date Picker field

addTime()

Fast-track transition issues assigned to the project lead


Set Checklist
Create an external project for a new employee during an onboarding process
Automatically create a version when starting the release
Create an issue in the current project
Create a sub-task for every user in a field and assign them

getMatchingValue()

toStringList()

Translate the description

replaceAll() wikiToHTML() htmlToTxt()

Move an issue to another project
Copy highest priority from linked issues
Keep track of important status updates

dateTimeToString()

Create a sub-task for every recurring deadline within a task

addMonths() getMatchingValue() dateToString()

Change the assignee to the next evaluator

first()

toStringList()

Retrieve the assets of an issue in Jira cloud
Set a watcher based on custom field value


Add comment when creating issues outside of business hours

withinCalendar()

Set assignee depending on issue type

issueType()

Inline images in a generated email

replaceAll()

Set specific default assignee if not set
Create child issue within Advanced Roadmaps hierarchy
Keep the status of an issue and its linked issues in sync
Add or remove request participants
Add attachments from current issue to cloning issues


Send email after transitioning to specific status


Send email with the URL of the attachments included in the description

replaceAll() toString() attachmentUrls() findPattern()

Add a hyperlink to an issue in an email