Use the app user to update non-editable fields

Use case

In many workflows, issues in the Done status are locked for editing using the workflow property jira.issue.editable = false, ensuring that completed issues remain unchanged. However, there are scenarios where updates are still needed after completion - for example, marking a billable task as billed once it has been invoiced.

This is where the Jira Workflow Toolbox app user becomes useful. Even if the issue is otherwise locked, updates can still be performed using the App user. In this case, a dedicated transition (e.g. "Billed") is created, and a post function updates a custom field to reflect the billing status -  without altering the issue’s resolved state.

🗒️ Prerequisite

To prevent changes after completion, the Done status must include the workflow property jira.issue.editable = false, which blocks both manual and automated edits.

To allow a controlled update for billing purposes:

  • A custom field (e.g. Billed) must be available in the field context beforehand.

  • A workflow transition (e.g. Billed) must exist.

  • A post function must be configured on this transition to update the Billed field accordingly.

🛠️ Configuration

In the workflow editor, select the transition (e.g. Billed) and add a Update fields  post function to set the desired field value.

Target issue*

Choose Current issue

Fields*

Select the field that you are using as the billed flag. In our use case it's is a basic text field called Billed

Expression*

Set the expression editor to General mode and enter the following expression:

Yes

Run as*

Choose Jira Workflow Toolbox app user .

Pro tip

It’s important to run this post function as the App user, since the issue is not editable under normal permissions. The App user has the necessary rights to perform the update even when the issue is locked.

Use case Workflow function Parser functions
Set the due date based on the priority

Update fields

getMatchingValue()

Obtain the difference between two dates

Update fields


Assign an issue to the user who last commented on it

Update fields


Add three days skipping weekends automatically to a Date Picker

Update fields


Keep parent's priority in sync

Update fields


Set the assignee based on the issue type

Update fields

getMatchingValue()

Set the fix version to affects version when resolving an issue

Update fields


Use the app user to update non-editable fields

Update fields


Automatically add incident reporters to problem tickets

Update fields

append()

fieldValue()

linkedIssues()

toStringList()

Copy labels of a sub-task to the parent issue upon closing

Update fields


Assign an issue to the project lead, if the issue is unassigned on creation

Update fields


Add watchers from another field

Update fields

Transition issue

union()

toStringList()

Add a sub-task's summary and key to the description of its parent

Update fields


Set a date field to a future date

Update fields

dateTimeToString()

Record an auditable timestamp of a Compliance Approval

Update fields

dateTimeToString()

Copy field values from epic to issues under it after creation

Update fields Transition issue

epic()

issuesUnderEpic()

filterByStatus()

Set a date field to the current date

Update fields

dateTimeToString()

Assign important issues to the project lead

Update fields


Set the priority to Highest if the 'Infrastructure' component is selected

Update fields


Background priority calculation

Update fields

avg()