Feature Parity and Script Alternatives

ScriptRunner for Jira Cloud does not have the same feature set as the Server/Data Center version. We have noted below the parity of each ScriptRunner for Server/Data Center feature, along with any script/function alternatives where there is currently no value parity.

ScriptRunner for Server/Data Center features, which are not supported in ScriptRunner for Jira Cloud, are also listed in the parity tables for full transparency to allow an informed decision when migrating from Server/Data Center to Cloud.

Jira REST API and UI Modifications API

The varying parities between Cloud and Server/Data Center exist due to the limitations of the Jira REST API and UI Modifications API, which ScriptRunner relies on to allow certain functionality. Unfortunately, it is likely that some features cannot be part of the Cloud feature set due to restrictions in the Cloud platform. There are also some general limitations within ScriptRunner Cloud, such as script execution timeouts and script storage, which we recommend reviewing. 

Try our migration tools!

The ScriptRunner Migration Suite (SMS) is a suite of tools that helps you plan, analyse, convert and deploy scripts with confidence, significantly reducing the manual migration effort. It supports (not replaces) your expertise. The suite is made up of three tools: 

  • ScriptRunner Migration Analyse and Assess Tool: Use this tool to review your ScriptRunner Data Center scripts and configurations for risks and cloud readiness.
  • The ScriptRunner Migration Agent: Use our specialised AI chat agent to create, convert, and optimise scripts, or you can use it to answer a variety of different questions about ScriptRunner.
  • ScriptRunner Dev and Deployment Tool: Use this tool to organise and deploy ScriptRunner Cloud scripts. It is focused on making it easier and faster for consultants and developers to migrate, test, and deploy scripts from ScriptRunner DC to Cloud.

If you have any questions, need help, or would like to request access to SMS, the quickest way to get assistance is through our dedicated support portal.

KeyDefinition

(tick)

Full value parity.

◐ 

Partial value parity. 

ALT

No value parity, but custom script alternatives are available.

(error)

No value parity or alternatives are available.

Behaviours

Parity summary

The Behaviours feature is only available as a companion app that must be installed for ScriptRunner for Jira Cloud. While this feature has certain limitations in the Cloud environment (detailed in the table below), you can still implement various common use cases, such as:

See our Example Scripts for a complete collection of pre-written scripts that address common use cases. 

Parity details

Server/DC Feature

Cloud ParityParity Notes/AlternativesCloud Links
Behaviours

Atlassian created an API called UI Modifications on the Forge platform, which made it possible for ScriptRunner to build Behaviours. As more capabilities become available in the UI Modifications API, more functionality can be built in ScriptRunner's Behaviours feature. Behaviours is a key focus within ScriptRunner's product development roadmap. We are actively enhancing this feature by integrating new capabilities as Atlassian releases them

Differences

Notable differences for Behaviours on Cloud:

(error) You can apply Behaviours to the Create, Issue, and Transition views of a Jira issue. Refer to Behaviours Supported Fields and Products for details.

(error) Jira Service Management is not currently supported. Although JSM support is currently not available from Atlassian, we will implement this functionality into Behaviours as soon as it is released. See our Behaviours Limitations section for more details.

(error) Behaviours may be applied to certain supported fields only, as not all fields are currently supported in all available views.

(error) Currently, you cannot select all projects and all issue types simultaneously. You may, however, select all projects OR all issue types.

Parity

Notable parity for Behaviours on Cloud:

(tick) Compatible with Jira Software.

(tick) Company and team-managed projects are supported.

(tick) Support for over 30 system and custom field types across all three views (Create, Issue, and Transition).

Cloud Behaviours documentation

Cloud Behaviours example scripts

Built-In Scripts

Parity summary

ScriptRunner for Jira Cloud offers a limited selection of built-in scripts compared to the Data Center version. However, alternative scripts that can be executed through the Script Console are available in Cloud. Where applicable, links to these script alternatives are provided in the table below.

See our Example Scripts for a complete collection of pre-written scripts that can be run from the Script Console.

Parity details

Server/DC Feature

Cloud ParityParity Notes/AlternativesCloud Links

Bulk Copy SLA Configuration

(error)

This is not applicable in the Jira Cloud environment.

SLA configurations are managed through Jira Service Management's native interface in Cloud. The REST API doesn't provide endpoints for bulk SLA configuration operations, and this is considered an administrative setup task rather than a scripting use case.

 

Cloud Built-In Scripts documentation

Cloud example scripts

 

 

 

 

 

 

 

 


Bulk Fix Resolution

The Bulk fix resolutions built-in script is available in ScriptRunner for Jira Cloud. This feature is marked as having partial parity because Jira Cloud does not allow clearing resolutions (selecting None option).

Bulk Import Custom Fields

ALT

The same function can be achieved by writing your own script in the Script Console but with all the caveats of time limitations, API availability, etc.

We have provided an alternative example script below that works for Select List, Multi Select List, Checkbox and Radio button fields to import in options. It creates new options if they don't exist and emits options that already exist.

groovy
/* * This script provides an example of how in the Script Console you can bulk import custom field options. * Options which already exist for a field are skipped and only new options are added. * This works for the following field types: Single Select List, Multi Select List, Radio Buttons, Checkboxes * * All right, title and interest in this code snippet shall remain the exclusive intellectual property of Adaptavist Group Ltd and its affiliates. Customers with a valid ScriptRunner * license shall be granted a non-exclusive, non-transferable, freely revocable right to use this code snippet only within their own instance of Atlassian products. This licensing notice cannot be removed * or amended and must be included in any circumstances where the code snippet is shared by You or a third party." */ // Specify the ID of your custom field below def customfieldId = 'customfield_12345' // Note supported field types are: Single Select List, Multi Select List, Radio Buttons, Checkboxes // Specify the ID of your custom field's context to add the option values to def customfieldContextId = 12345 // Define the new options to add in the array below def newFieldOptions = ['Option A', 'Option B', 'Option C',"Option D", "Option E"] // Get existing options for this context def getExistingFieldOptions = get("/rest/api/3/field/${customfieldId}/context/${customfieldContextId}/option") .queryString('maxResults', 1000) .header('Content-Type', 'application/json') .asObject(Map) if (getExistingFieldOptions.status != 200) { return "Failed to retrieve existing options. Status: ${getExistingFieldOptions.status}" } // Extract the values of existing options def existingOptionValues = (getExistingFieldOptions.body as Map).values?.collect { (it as Map).value } ?: [] // Filter out options that already exist def optionsToCreate = newFieldOptions.findAll { !existingOptionValues.contains(it) } def alreadyExisting = newFieldOptions.findAll { existingOptionValues.contains(it) } // If there are no new options to create, return early if (optionsToCreate.isEmpty()) { return "All options already exist: ${alreadyExisting.join(', ')}" } // Construct the payload for the new options to be added def fieldOptionsRequestBody = [ options: optionsToCreate.collect { optionValue -> [ value: optionValue, disabled: false ] } ] // Add the new custom field options def addCustomFieldOptions = post("/rest/api/3/field/${customfieldId}/context/${customfieldContextId}/option") .header('Content-Type', 'application/json') .body(fieldOptionsRequestBody) .asObject(Map) // Check the response to confirm the options were created successfully if (addCustomFieldOptions.status == 200) { def createdOptions = addCustomFieldOptions.body as Map def optionsList = createdOptions.options as List<Map> def createdOptionsSummary = "Successfully created ${optionsList?.size() ?: 0} option(s): ${optionsToCreate.join(', ')}." if (alreadyExisting) { createdOptionsSummary += "These options already existed: ${alreadyExisting.join(', ')} so were not created" } return createdOptionsSummary } else { return "Failed to create options. Status: ${addCustomFieldOptions.status}" }

The example script below works for bulk import cascading select list field options. It creates new options if they don't exist and emits options that already exist.

groovy
/* * This script provides an example of how in the Script Console you can bulk import cascading select list field options. * Options which already exist are skipped and only new options are added. * * All right, title and interest in this code snippet shall remain the exclusive intellectual property of Adaptavist Group Ltd and its affiliates. Customers with a valid ScriptRunner * license shall be granted a non-exclusive, non-transferable, freely revocable right to use this code snippet only within their own instance of Atlassian products. This licensing notice cannot be removed * or amended and must be included in any circumstances where the code snippet is shared by You or a third party." */ // Specify the ID of your cascading select custom field below def customfieldId = 'customfield_12345' // Specify the ID of your custom field's context to add the option values to def customfieldContextId = 12345 // Define cascading options as a map using the sture: [ParentValue: [Child1, Child2]] // Use an empty list [] for parents with no children def cascadingSelectListFieldOptions = [ 'Parent1': ['child1', 'child2', 'child3'], 'Parent2': ['child4', 'child5', 'child6'], 'Parent3': ['child7', 'child8', 'child9'], 'emptyParent': [] // Parent with no children ] // Get existing options for this context def getExistingOptions = get("/rest/api/3/field/${customfieldId}/context/${customfieldContextId}/option") .queryString('maxResults', 1000) .header('Content-Type', 'application/json') .asObject(Map) if (getExistingOptions.status != 200) { return "Failed to retrieve existing options. Status: ${getExistingOptions.status}" } def existingOptions = (getExistingOptions.body as Map).values as List<Map> // Build maps of existing parent and child options def existingParents = existingOptions .findAll { !it.optionId } .collectEntries { [(it.value): it.id] } def existingChildren = existingOptions .findAll { it.optionId } .collect { [value: it.value, parentId: it.optionId] } def parentsToCreate = cascadingSelectListFieldOptions.keySet().findAll { !existingParents.containsKey(it) } def createdParents = [:] def skippedParents = [] // Create the parent options if (parentsToCreate) { def parentRequestBody = [ options: parentsToCreate.collect { parentValue -> [ value: parentValue, disabled: false ] } ] def createParentOptionValues = post("/rest/api/3/field/${customfieldId}/context/${customfieldContextId}/option") .header('Content-Type', 'application/json') .body(parentRequestBody) .asObject(Map) if (createParentOptionValues.status == 200) { def createdParentOptions = (createParentOptionValues.body as Map).options as List<Map> createdParents = createdParentOptions.collectEntries { [(it.value): it.id] } } else { return "Failed to create parent options. Status: ${createParentOptionValues.status}" } } else { logger.info("All parent options already exist") } // Combine existing and newly created parents def allParents = existingParents + createdParents skippedParents = cascadingSelectListFieldOptions.keySet().findAll { existingParents.containsKey(it) } // Create the child options def childrenToCreate = [] cascadingSelectListFieldOptions.each { parentValue, children -> def parentId = allParents[parentValue] if (!parentId) { logger.warn("Parent '${parentValue}' not found, skipping its children") return } children.each { childValue -> // Check if the option already exists under the parent def alreadyExists = existingChildren.any { it.value == childValue && it.parentId == parentId } if (!alreadyExists) { childrenToCreate << [ value: childValue, disabled: false, optionId: parentId ] } } } def createdChildren = [] def skippedChildren = [] if (childrenToCreate) { def childRequestBody = [ options: childrenToCreate ] def createChildOptionValues = post("/rest/api/3/field/${customfieldId}/context/${customfieldContextId}/option") .header('Content-Type', 'application/json') .body(childRequestBody) .asObject(Map) if (createChildOptionValues.status == 200) { createdChildren = (createChildOptionValues.body as Map).options as List<Map> } else { return "Failed to create child options. Status: ${createChildOptionValues.status}" } } else { logger.info("All child options already exist") } // Collect all API responses and update on what options were created def createdOptionsSummary= [] if (createdParents) { createdOptionsSummary << "Created ${createdParents.size()} parent option(s): ${createdParents.keySet().join(', ')}" } if (skippedParents) { createdOptionsSummary << "Skipped ${skippedParents.size()} existing parent(s): ${skippedParents.join(', ')}" } if (createdChildren) { def childValues = (createdChildren as List<Map>).collect { (it as Map).value } createdOptionsSummary << "Created ${createdChildren.size()} child option(s): ${childValues.join(', ')}" } def totalExistingChildren = cascadingSelectListFieldOptions.values().flatten().size() - childrenToCreate.size() if (totalExistingChildren > 0) { createdOptionsSummary << "Skipped ${totalExistingChildren} existing child option(s)" } // Return an update on what cascading select list options were created return createdOptionsSummary ? createdOptionsSummary.join('\n') : 'No changes made - all options already exist'

Change Dashboard, Filter or Board Ownership

ALT

Similar functionality can be achieved by writing a script in the Script Console to call the Change Filter Owner and the Bulk edit dashboards APIs to update and filter dashboard owners.

We have created a Change owner of Filter or Dashboard example script for this.

Clean Workflows

ALT

The same function can be achieved by writing a script to call the workflows search API to search for workflows adding a queryString of isActive:false to return inactive worklows, and then for each workflow returned, call the delete inactive workflow API.

 

Clear Groovy Class Loader

(error)

This is not applicable in the Jira Cloud environment.

This is a server-level operation that clears cached Groovy classes from memory. In Cloud, ScriptRunner runs in a separate process managed by Atlassian's infrastructure, and class loading is handled automatically. Users don't have access to server-level memory management.

Configuration Exporter

(error)

This is not possible in Jira Cloud. A third-party tool such as salto.io can provide this.

This Data Center tool exports Jira configuration data directly from the server. Cloud instances are managed by Atlassian, and configuration exports are handled through Atlassian's native Cloud migration tools and backup services, not through third-party apps.

Copy Custom Field Values

The Copy custom field values to another field built-in script is available in ScriptRunner for Jira Cloud. This feature is marked as having partial parity because it does not support the same number of fields as ScriptRunner for Jira Data Center. Jira Cloud currently supports: 

  • Single to multi, for example, single select to multi-select, single user picker to multi-user picker.
  • Multi to single, however, only the first value will be retained.
  • Multi to text, the values are concatenated with a comma.
  • Short text to unlimited text.

Copy Project

ALT

You can achieve the same functionality in Jira Cloud by using the Script Console and a custom script. There is a limit of 240 seconds for script executions. After running for 240 seconds, the logs will be collected, and the code will be terminated.

Generate Events

(error)

This is not possible in Jira Cloud.

Cloud's asynchronous execution model doesn't support manually triggering Jira events. Events are fired automatically by Jira when actions occur, and the Connect framework doesn't provide a mechanism to artificially generate events.

Guardrails - Maximum number of comments per issue.

 

ALT

You can use the numberOfComments JQL Keyword to search for issues that exceed a maximum number of comments using a JQL query similar to the one below.

numberOfComments > 5

You can then manually review these issues and delete the comments if needed.

To automate this, you could run this query in the Script Console calling the Archive Issues by JQL API with this JQL to archive all issues returned that exceed this threshold.

Guardrails - Maximum number of unarchived projects

ALT

Similar functionality can be achieved by writing a script in the Script Console to call the Get Projects Paginated API and filter out results where the insights.lastIssueUpdateTime Property is older than a specified timeframe, such as two years.

You can then call the Archive project API for every project returned by this API.

We have created a Archive unused projects example script for this, which can be run on the script console.

Guardrails - Maximum Number of Issue Links Per Issue

 

ALT

You can use the numberOfLinks JQL Keyword to search for issues that exceed a maximum number of links using a JQL query similar to the one below.

numberOfLinks > 5

You can then manually review these issues and delete the links if needed.

If you wanted to automate this, you could run this query in the Script Console calling the Archive Issues by JQL API with this JQL to archive all issues returned that exceed this threshold.

Guardrails - Maximum Attachment Size


 

(error)

This is not possible in Jira Cloud.

Attachment size limits in Cloud are controlled at the Atlassian infrastructure level, not through individual instance configuration. The REST API doesn't expose endpoints to query or enforce custom attachment size limits.

Guardrails - Maximum Change History Records Per Issue

(error)

This is not possible in Jira Cloud.

Change history is managed by Atlassian's Cloud infrastructure. There's no REST API endpoint to query the number of history records per issue or to enforce limits on history retention.

List Scheduled Jobs

ALT

Cloud's Atlassian Connect framework doesn't provide REST API access to query Jira's internal job scheduling system.

 Cloud does not have the same internal scheduler as Jira Data Center, and in Cloud scheduled tasks are completed using automation rules configured on a scheduled trigger.

As an alternative, you could write a script to call the Automation API to search and return all scheduled rules and return them.

Re-index Issues

(error)

This is not applicable in the Jira Cloud environment.

Reindexing in Cloud is managed entirely by Atlassian's infrastructure. Unlike Data Center where admins have direct control over indexing, Cloud automatically handles index maintenance. Users cannot and should not manually trigger reindexing operations.

Script Registry

(error)

Update coming soon...

Service Desk Template Comments

(error)

This is not possible in Jira Cloud.

This functionality relates to Jira Service Management's internal comment templating system. The Cloud REST API doesn't expose endpoints for managing comment templates in the same way Data Center's Java API does.

Split Custom Field Contexts

ALT

Similar functionality can be achieved by writing a script in the Script Console as shown in this example script.

Switch to a Different User

ALT

Cloud scripts cannot impersonate users for security reasons. Scripts execute as either:

  • The user who triggered the action, OR
  • The ScriptRunner add-on user (for system-level operations)

User impersonation would violate Cloud's security model and Atlassian's multi-tenant architecture.

Atlassian does not provide impersonation APIs so this cannot be built in Jira Cloud. However, Jira Cloud organization admins can switch to different users by using the built in feature as documented by Atlassian.

Test Runner

(error)

This is not applicable in the Jira Cloud environment.

This Data Center tool runs automated tests against ScriptRunner scripts using server-side testing frameworks. Cloud's execution environment doesn't support the same testing infrastructure. Testing must be done through the Script Console or by running scripts in development environments.

View Server Log Files

(error)

This is not applicable in the Jira Cloud environment.

Cloud users don't have access to server log files - Atlassian manages the infrastructure. You can, however, Review logs in ScriptRunner for Jira Cloud. 

HAPI

Parity summary

In ScriptRunner for Jira Cloud, HAPI is available but has a limited scope due to the constraints of the Jira Cloud platform and REST-based architecture. This means that not all the methods available in DC are available in Cloud, as outlined in the table below:

Scripts that are built using HAPI will be easier to migrate if you decide to move to Jira Cloud. These scripts will likely need far fewer modifications to be compatible with ScriptRunner for Jira Cloud, streamlining the transition process.

Parity details

Server/DC Feature

Cloud ParityParity Notes/AlternativesCloud Links

Application links

(error)

This is not applicable in the Jira Cloud environment.


Application Links is a Server/Data Center feature for connecting different Atlassian applications (Jira to Confluence, Bitbucket, etc.). In Jira Cloud, this concept doesn't exist in the same way—Cloud products automatically link when they're in the same Atlassian organization. There's no configurable "Application Links" feature to script against, so HAPI support isn't relevant.

Cloud HAPI documentation













Assets

ALT

While Assets/Insight exists in Cloud, ScriptRunner cannot integrate with Asset automation triggers and actions. The feature parity documentation shows all Asset-related automation features (Asset Object Created Trigger, Asset Object Updated Trigger, Create Asset Action, Lookup Asset Object Action) have no parity.

As an alternative, you could use the Asset REST API to write scripts.

Attachments


Cloud includes:

  • Retrieve attachments.

Comments

(tick)

Cloud includes:

  • Retrieve comments.
  • Add comments.

See the Cloud Work with Comments page for more details. 

Entity properties

(tick)

Cloud includes:

  • ProjectEntityProperties
  • IssueEntityProperties
  • UserEntityProperties
  • CommentEntityProperties

For each of the above you can:

  • set the value of an entity property (as strings, JSON, integer, long, LocalDate, LocalDateTime, boolean)
  • retrieve the value of an entity property
  • check for the existence of an entity property
  • retrieve the keyset of all entity properties stored against an entity

See the Cloud Work with Entity Properties page for more details. 

Fields

(tick)

Cloud includes:

  • Create, read, update, and delete system fields.
  • Create, read, update, and delete custom fields. 

See the Cloud Update Fields page for more details.

Filters

ALT

The Jira Cloud REST API does not provide adequate endpoints for programmatically managing filters. While you can execute JQL searches, you cannot script filter management operations like you can in Data Center.

As an alternative, you can use the Jira Cloud REST API to create, update, and delete filters.

Groups


Cloud includes:

  • Retrieve groups and group members.
  • Add users to a group.

See the Cloud Work with Groups page for more details. 

Issues

(tick)

Cloud includes:

  • Create, read, update, and delete issues. 
  • Transition issues.
  • Search for issues.

See the Cloud Work with Issues page for more details. 

Permission schemes

ALT

The Jira Cloud REST API does not expose endpoints for managing permission schemes. You cannot programmatically create, modify, or assign permission schemes to projects. This is a significant platform limitation—permission scheme management must be done manually through the Jira UI.

Alternatively, you can write scripts to assign permission schemes using the REST API.

Projects

(tick)

Cloud includes:

  • Create, read, update, and delete projects.

See the Cloud Work with Projects page for more details. 

Send emails

ALT

While a notification API exists in Cloud, it has critical restrictions:

  • Can notify Jira users, groups, or user fields (assignee, reporter)
  • Cannot send emails to external email addresses
  • Users cannot send notifications to themselves (API validation prevents this)

This makes it unsuitable for many common email automation scenarios that worked in Server/Data Center.

Alternatively, as ScriptRunner provides the send notification post function, you can call the Notify API in a script to send a notification. 

Users


Cloud includes:

  • Retrieve users.
  • Retrieve user group membership.

See the Cloud Work with Users page for more details. 

Watchers

(error)

There is no HAPI support for managing watchers. However, the Jira Cloud REST API does provide endpoints for watcher operations:

- GET /rest/api/3/issue/{issueIdOrKey}/watchers (retrieve watchers)
- POST /rest/api/3/issue/{issueIdOrKey}/watchers (add watchers)
- DELETE /rest/api/3/issue/{issueIdOrKey}/watchers (remove watchers)

You can implement watcher management using direct REST API calls with Unirest, but there's no simplified HAPI wrapper for these operations.

Integrations

If you need to call external systems to import data into Jira, consider using ScriptRunner Connect, our powerful integration platform that offers this capability and much more.

Server/DC Feature

Cloud ParityParity Notes/Alternatives
Automation for Jira: Asset Object Created Trigger

(error)


Automation for Jira offers a range of built-in Asset and Jira actions that are readily available in Jira Cloud.

Note that ScriptRunner Automation for Jira triggers and actions are currently unsupported on Cloud.

Automation for Jira: Asset Object Updated Trigger

(error)

Automation for Jira: Create Asset Action

(error)

Automation for Jira: Execute a ScriptRunner Script Action

(error)

Automation for Jira: Lookup Asset (Insight) Object Action

(error)

Automation for Jira: Lookup Asset (Insight) Objects from AQL (IQL) Action

(error)

Automation for Jira: Update Asset Action

(error)

Vendors API

(error)


Jobs

Parity summary

This feature is known as Scheduled Jobs and Escalation Service in ScriptRunner for Jira Cloud. While this feature has certain limitations in the Cloud environment (detailed in the table below), you can still implement various common use cases.

See our Example Scripts for a complete collection of pre-written scripts that can be used with Scheduled Jobs.

Parity details

Server/DC Feature

Cloud Parity

Parity Notes/Alternatives


Cloud links

Custom Scheduled Job


The Scheduled Jobs feature is available in ScriptRunner for Jira Cloud. 

Jira Cloud supports: 

  • A minimum interval of 1 hour. 
  • There is a limit of 240 seconds for script executions. After running for 240 seconds, the logs will be collected, and the code will be terminated.

Cloud Jobs example scripts

Escalation Service


The Escalation Service feature is available in ScriptRunner for Jira Cloud.

Jira Cloud supports:

  • The maximum number of issues you can modify in any execution of an Escalation Service job is 50. In other words, we limit the number of issues returned by each JQL query to 50 issues.
  • A minimum interval of 1 hour.

Cloud Escalation Service example scripts

Issue Archiving Job

ALT

This can be achieved by writing a custom escalation service that calls the Archive issue API to archive any issues returned by the JQL query specified on the schedule specified. You can also run the Archive issues returned by a JQL Search example script to archive issues. 

JQL Functions

Parity summary

Both versions of ScriptRunner use JQL Functions. However, this feature has been implemented as Enhanced Search within ScriptRunner for Jira Cloud.

Enhanced Search and ScriptRunner Enhanced Search

If you purchase ScriptRunner for Jira Cloud, you will automatically receive ScriptRunner Enhanced Search for free - this is included as part of your license. However, if you find that you're not using any of the other features offered by ScriptRunner for Jira Cloud, and you're only using Enhanced Search functionality, you can purchase Enhanced Search as a standalone product instead.

Please note that both apps are not designed to be used simultaneously as the data is stored separately. Although both products work independently, you will only see filters in the app it was created from and could duplicate work. If you currently have both products installed, or if you would like to switch from one to the other please contact our Support team who can manually transfer your data on your behalf. 

JQL Query Comparison

See our Enhanced Search documentation for JQL Query Comparisons between ScriptRunner for Jira Server/DC and Cloud.

When ScriptRunner Enhanced Search for Jira Cloud is installed, an administrator must perform an initial synchronisation before the ScriptRunner Enhanced Search JQL keywords work in Jira's native JQL search. Note that initial synchronization is also required after migrating from ScriptRunner for Jira Data Center to Cloud.

Parity details

Server/DC Feature

Cloud Parity

Parity Notes/Alternatives


addedAfterSprintStart

(tick)

addedAfterSprintStart is available in ScriptRunner Enhanced Search. 

This JQL function will identify issues that were added to an open sprint after the feature was released (21st December 2020). Historical searches for issues added to open sprints prior to that date are not supported.

aggregateExpression

(error)

The DC implementation calculates aggregates (sum, count, etc.) across issue data and displays results in a separate panel. Native Jira doesn't support displaying aggregate summaries in a UI panel in search results.

Also, there are performance considerations because aggregate expressions require complex calculations across large datasets.

archivedVersions

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you could implement a new function in Cloud.

Cloud's version API (/rest/api/3/project/{projectIdOrKey}/version) should return version data, including archived status, and would need to fetch all versions and filter by archived: true.

commented

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you could use some ScriptRunner JQL Keywords to achieve the same:

completeInSprint

ALT

There is no like-for-like match here, but the inSprint JQL function can be used to search for issues in the sprint that have a completed status to get a similar query.

componentMatch

(tick)

componentMatch is available in ScriptRunner Enhanced Search. 

dateCompare

(tick)

 dateCompare is available in ScriptRunner Enhanced Search. 

earliestUnreleasedVersionByReleaseDate

ALT

The Server/DC implementation finds the earliest unreleased version by release date for a project.

For Cloud, it is possible to access the version releaseDate and released status, these fields are available from the Cloud API.

epicsOf

epicsOf is available in ScriptRunner Enhanced Search. 

This function is available for Jira company-managed projects but not for team-managed projects. 

expression

The Server/DC implementation allows arbitrary Groovy expressions to be evaluated against issue data and can compare duration, date, number, picker, and user fields, and perform mathematical operations on them.

In Cloud, Jira expressions are used and cannot be embedded in JQL functions the same way. The expression function can compare duration, date, number, pickers, and user fields (and perform mathematical operations on them), making it too complex to parse automatically and determine the type of field without querying Jira.

For date field types only, there is a
potential partial conversion to the dateCompare function:

  • issue in dateCompare(<JQL>, <expression>) for expressions where date field types are encountered. However, the syntax is different, and the migration would require extra manual changes.

fileAttached

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you could use some ScriptRunner JQL Keywords to achieve the same result:

hasAttachments

ALT

There is no like-for-like function in Cloud, but depending on what you want to achieve, you could use the numberOfAttachments ScriptRunner JQL keyword to achieve the same result.

hasComments

ALT

There is no like-for-like function in Cloud, but depending on what you want to achieve, you could use the numberOfComments ScriptRunner JQL keyword to achieve the same result.

hasLinks

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you can use native Jira keywords workItemLink and workItemLinkType

hasLinkType

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you can use the native Jira keyword workItemLinkType

hasRemoteLinks

ALT

The Server/DC implementation searches for issues with remote links (links to external systems like Confluence and Bitbucket).

Cloud has a remote link: /rest/api/3/issue/{issueIdOrKey}/remotelink

Implementing for Cloud would require fetching issues and checking each issue for remote links, although it could be slow/expensive.

hasSubtasks

ALT

There is no like-for-like function in Cloud, but depending on what you want to achieve, you could use the numberOfSubtasks ScriptRunner JQL keyword to achieve the same result.

inactiveUsers

ALT

The Server/DC implementation returns all users who have been marked inactive in the system.

For Cloud:

  • Cloud has /rest/api/3/user/search/query endpoint (Jira Cloud API docs) that we could use to return users with active: false status in response objects.

  • There is a constraint mentioned in the documentation: "Note that the operations in this resource only return users found within the first 1000 users". The function would work correctly for small instances (<1000 inactive users), but could potentially create inconsistent behaviour for larger instances.

  • Atlassian recommends using the paginated endpoint /rest/api/3/users/search, which includes the status of each user ("active": true/false) that we could filter on the client side.

incompleteInSprint

ALT

There is no like-for-like match here, but the inSprint JQL function can be used to search for issues in the sprint which have an incomplete status to get a similar query. 

issueFieldExactMatch

(tick)

issueFieldExactMatch is available in ScriptRunner Enhanced Search. 

issueFieldMatch

(tick)

issueFieldMatch is available in ScriptRunner Enhanced Search. 

issuePickerField

(error)

Cloud Status: not possible to migrate

  • Unlike Server/DC's Lucene indexing, Cloud's API doesn't expose indexed custom field relationships in a way that supports efficient reverse queries.

  • Cloud's /rest/api/3/search API can query custom fields directly (e.g., cf[12345] = "PROJ-123"), but fetching all issues that reference a specific issue in a custom field would require expensive operations and perform reverse relationship queries, which wouldn't perform well and would likely result in timeouts.

  • In terms of performance, this would require fetching all issues with the custom field populated and checking if each issue matches the query, which could be quite expensive, especially for large instances.

issuesInEpics

(tick)

issuesInEpics is available in ScriptRunner Enhanced Search. 

This function is available for Jira company-managed projects but not for team-managed projects.

jiraUserPropertyEquals

The Server/DC implementation returns users with matching Jira user property values (custom key-value pairs stored on user accounts).

Cloud Status: not possible to migrate without limitations

  • Cloud has /rest/api/3/user/search/query endpoint which supports querying by entity properties using syntax: [propertyKey].entity.property.path is "<property value>"

  • The API documentation states: "Note that the operations in this resource only return users found within the first 1000 users." (Same limitation as inactiveUsers,and would return incomplete results for larger instances)

  • Cloud's entity properties would also match Server/DC's user properties format. In Server/DC, user properties use the jira.meta. prefix (e.g., "jira.meta.region"). We would need to verify that all Cloud's entity properties follow this format.

lastComment

ALT

There is no like-for-like function in Cloud, but depending on what you want to achieve, you could use the lastCommentBy or lastCommentedDate ScriptRunner JQL keyword to achieve the same result.


lastUpdated

ALT

There is no like-for-like function in Cloud, but depending on what you want to achieve, you could use the updated native Jira keyword to search for issues last updated within a certain time frame. 

linkedIssuesOf

(tick)

linkedIssuesOf is available in ScriptRunner Enhanced Search. 

This function can be used in Jira Server/Data Center to search for issues linked with the parent-child hierarchy provided by Advanced Roadmaps/Portfolio but not in Jira Cloud Enhanced Search.

linkedIssuesOfAll

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you could combine regular issue links, epic links, and subtask links via parent field.

linkedIssuesOfAllRecursive

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you could combine regular issue links, epic links, and subtask links via parent field.

linkedIssuesOfAllRecursiveLimited

ALT

There is no like-for-like function in Jira Cloud, but depending on what you want to achieve, you could combine regular issue links, epic links, and subtask links via parent field.

linkedIssuesOfRecursive

(tick)

linkedIssuesOfRecursive is available in ScriptRunner Enhanced Search. 

linkedIssuesOfRecursiveLimited

(tick)

linkedIssuesOfRecursiveLimited is available in ScriptRunner Enhanced Search. 

linkedIssuesOfRemote

(error)

The Cloud API doesn't provide indexed access to remote link properties for efficient searching, and the /rest/api/3/issue/{issueIdOrKey}/remotelink endpoint:

  • doesn’t support searching or filtering remote links by properties
  • requires fetching all issues, then checking each issue's remote links individually, which would impact performance.

memberofRole


Cloud status: possible with significant limitations

  • Server/DC behaviour:

    • Takes field name and one or more role names as arguments, e.g. issueFunction in memberOfRole("Reporter", "Administrators"), and can be used with all User fields (reporter, creator, assignee, user custom fields, script fields).

  • Cloud has project role endpoints, which can retrieve users/groups directly assigned to roles, or role membership per project:

    • /rest/api/3/project/{projectIdOrKey}/role - Get all roles for a project.

    • /rest/api/3/project/{projectIdOrKey}/role/{roleId} - Get role details, including users and groups assigned to that role.

  • It might not be practical in the Cloud due to the following reasons:

    • Project scope complexity: the function would need to determine which projects to query (from the query context or all projects). For queries without project restrictions, we would need to query all projects, and each project requires an API call to get each role membership.

      • Refer to the documentation where we mention this limitation 'If you have a large number of projects each having a large number of role memberships, the function will fail', which could likely occur in the Cloud.

    • There might be a need to resolve group members in some cases, which could require additional API calls to /rest/api/3/group/member for each group.

  • Cloud has the native membersOf() JQL function for group-based searches, but this doesn't work for project-specific project roles.

myProjects

Cloud Status: possible to implement, with significant limitations.

  • Server/DC behaviour:

    • project in myProjects() returns projects where the user is in any role, except projects where the user only has access via global permission groups (e.g., jira-users, jira-admins).

      • Refer to the documentation where we mention: 'being a member means being in any role, except where that is by virtue of being in a group with a global permission'.

  • Cloud has project-related endpoints to retrieve projects and check role membership per project:

    • /rest/api/3/project/search - Returns projects visible to the authenticated user (i.e. has Browse Projects permission).

    • /rest/api/3/project/{projectIdOrKey}/role - Get all roles for a project.

    • /rest/api/3/project/{projectIdOrKey}/role/{roleId} - Get role details including users and groups assigned to that role.

  • This wouldn’t be as practical in Cloud, since /rest/api/3/project/search returns projects where user has specific permissions, which is not the same as "projects where user is in a role". To replicate the exact behavior, we’d need to check role membership (not just browse permission), adding overhead to the query:

    • Get all projects (or use /rest/api/3/project/search to get visible projects)

    • For each project, get all roles: /rest/api/3/project/{projectIdOrKey}/role

    • For each role, check if current user is in that role

nextSprint

(tick)

nextSprint is available in ScriptRunner Enhanced Search. 

overdue

ALT

Cloud Status: could be implemented as a new function

  • Server/DC behaviour:

    • Returns versions that are: a) unreleased, and b) have a release date in the past.

      • Example: fixVersion in overdue() - finds issues with fix versions that are overdue

    • Can optionally filter by release date: fixVersion in overdue("before -14d") (at least 14 days overdue).

      • Example: fixVersion in overdue("before -14d") - finds issues with fix versions at least 2 weeks overdue.

  • Similar to archivedVersions, overdue could be implemented in the Cloud as a separate function:

    1. Use Cloud's version API (/rest/api/3/project/{projectIdOrKey}/version) to get all versions.

    2. Filter versions where:

      • released: false (unreleased)

      • releaseDate exists and is in the past (before the current date)

    3. (Optional) Apply date filtering if an argument is provided.

    4. Return version IDs.

parentsOf

ALT

parentsOf is available in ScriptRunner Enhanced Search. 

portfolioChildrenof


childrenOf can be used to find all descendant issues of a given subquery, including children, grandchildren, and beyond.

Second parameter (optional): You can use a second JQL query for childrenOf(Subquery) that acts as a filter on descendant issues. We strongly recommend using this option to avoid filters that require significantly longer processing times because of their recursive nature.

For example, you could use:

groovy
issueFunction in childrenOf("issue = EXAMPLE-1")

 And then narrow the search results:

groovy
issueFunction in childrenOf("project = DEMO", "issueType != Subtask")

 

portfolioParentOf


parentsOf can be used to find all ancestor issues of a given subquery, including parents, grandparents, and beyond.

previousSprint

(tick)

previousSprint is available in ScriptRunner Enhanced Search. 

projectMatch

(tick)

projectMatch is available in ScriptRunner Enhanced Search. 

In Jira Cloud this function uses the projectKey, whereas in server/data centre it uses project name.

projectsOfType

ALT

There is no like-for-like match here, but you can use the native Jira keyword of projectType to return all issues from projects of a certain type such as Software.

recentProjects

ALT

There is no like-for-like match here, but you can use the native Jira keyword of lastViewed to return issues you last viewed in the past x days to see what projects you interacted with in that timeframe. 

releaseDate

ALT

Cloud Status: possible to implement (could be implemented as a separate function, similar to archivedVersions and overdue)

  • Server/DC behaviour:

    • Takes a date query argument with predicates: after, before, on

    • Example: fixVersion in releaseDate("after now() before 10d") - finds issues with fix versions due in the next 10 days.

    • Example: fixVersion in releaseDate("on 2016/09/07") - finds issues with fix versions released on a specific day.

    • Can be used with fix versions, affects versions, and version custom fields.

    • Supports date expressions like -5d, -8w, or date functions like startOfMonth().

  • Cloud's API (/rest/api/3/project/{projectIdOrKey}/version) returns version objects, including releaseDate, so it would be feasible in the Cloud by following a similar approach to archivedVersions:

    • Use Cloud's version API (/rest/api/3/project/{projectIdOrKey}/version) to get all versions.

    • Parse the date query argument and its expressions (relative dates like -5d, 10d, absolute dates, date functions, etc).

    • Filter versions where releaseDate matches the date predicates:

      • after date: releaseDate > date

      • before date: releaseDate < date

      • on date: releaseDate == date (at day level)

    • Handle multiple predicates (e.g., "after now() before 10d" means releaseDate > now() AND releaseDate < now() + 10 days).

    • Return version IDs.

  • For large instances with many projects, project restrictions may be required, although the same limitation would apply to other functions, such as archivedVersions and overdue.

removedAfterSprintStart

ALT

Cloud Status: possible to implement, but with additional complexity, similar to Cloud’s addedAfterSprintStart.

  • Server/DC behaviour:

    • Example: removedAfterSprintStart("Development Scrum", "Sprint 25") - finds issues removed after Sprint 25 started.

    • Example: removedAfterSprintStart("Product Overview") - finds issues removed after all active sprints started.

    • Used to track sprint scope changes (issues removed after sprint planning).

  • Cloud's addedAfterSprintStart uses the issue changelog to detect when issues were added to sprints. For removedAfterSprintStart:

    • Find issues that were removed from the sprint (not currently in it).

    • Use a similar changelog-based approach but in reverse:

      1. Get all issues that were in the sprint.

      2. Check the changelog for Sprint field changes for each issue.

      3. Look for changelog entries where:

        • field === "Sprint"

        • Sprint ID is in from field but not in to field (removed from sprint)

        • Change date is after the sprint start date

      4. Return matching issue IDs.

  • Similar performance profile to addedAfterSprintStart (but with potentially more issues to check, since we need to find issues that might have been removed).

  • Could be optimised by using project/board scope and date ranges to limit candidate issues, or caching changelog data where possible.

startDate

ALT

Cloud Status: possible to implement as a separate function, identical to releaseDate but using startDate field.

  • Server/DC behavior:

    • Takes a date query argument with predicates: after, before, on.

    • Example: fixVersion in startDate("after 14d") - finds issues with fix versions starting in more than 14 days.

  • Feasible in Cloud, since this is the exact same approach that works for archivedVersions, releaseDate, and overdue. The only difference would be using startDate instead. Aside from that the implementation would be identical.

    • Cloud's API (/rest/api/3/project/{projectIdOrKey}/version) returns version objects which include startDate.

    • Parse the date query argument (e.g., "after 14d").

    • Filter versions where startDate matches the date predicates:

      • after date: startDate > date

      • before date: startDate < date

      • on date: startDate == date

subtasksOf

(tick)

subtasksOf is available in ScriptRunner Enhanced Search. 

versionMatch

(tick)

versionMatch is available in ScriptRunner Enhanced Search. 

workLogged


Cloud Status: partial native support for date queries only; author/role/group queries not supported natively.

  • Server/DC behavior:

    • Supports date queries: on, after, before dates; e.g. issueFunction in workLogged("on 2025/03/28 by admin")

    • Supports user queries: by username or user function (e.g., by admin, by currentUser())

    • Supports role queries: inRole role (e.g., inRole Administrators)

    • Supports group queries: inGroup group (e.g., inGroup jira-administrators)

  • In Cloud:

    • Date queries are already supported natively via worklogDate

    • Author/role/group queries aren’t natively supported in Cloud. It is possible to implement but potentially expensive (similar to inactiveUsers and jiraUserPropertyEquals).

      • To carry this out, you need to:

        1. Get candidate issues (from JQL query scope).

        2. Fetch worklogs via /rest/api/3/issue/{issueIdOrKey}/workload for each issue.

        3. Filter worklogs by: Author (for by queries), role (for inRole queries) or group (for inGroup queries).

        4. Return issue IDs that have matching worklogs.

Listeners

Parity summary

This feature is known as Script Listeners in ScriptRunner for Jira Cloud. While built-in script listeners are available in the Data Center version and not currently in Cloud, there are many script alternatives that can be executed using a custom script listener. Where applicable, links to these script alternatives are provided in the table below.

See our Example Scripts for a complete collection of pre-written scripts that can be used with Script Listeners.

Parity details

Server/DC Feature

Cloud Parity

Parity Notes/Alternatives


Cloud Links

Adds the current user as a watcher

ALT

You can achieve the same result by creating custom script listener and using the Add the current user as a watcher example script. 

Cloud Listener Example Scripts

Cloud Script Listeners Documentation

Clone an issue and links

ALT

You can achieve the same result by creating custom script listener and using the Clone an issue and link to it example script. 

Please note that this alternative is subject to the constraints of the Cloud environment, such as time limitations and API availability. Check out our page on Scripting in ScriptRunner for Jira Cloud for tips. 

Create a sub-task

ALT

You can achieve the same result by creating custom script listener and using and/or adapting the Create sub-tasks when an issue is created example script. 

Custom Listener

 

The Custom script listener feature is available in ScriptRunner for Jira Cloud.

Please note that this feature is subject to the constraints of the Cloud environment. There is a limit of 240 seconds for script executions. After running for 240 seconds, the logs will be collected, and the code will be terminated.

Currently, a custom event may not be created and used to trigger listener actions.

Events supported in Cloud

The list below shows the list of events that Jira Cloud supports to trigger listener actions from:

  • Attachment Created
  • Attachment Deleted
  • Board Configuration Changed
  • Board Created
  • Board Deleted
  • Board Updated
  • Comment Created
  • Commented Deleted
  • Comment Updated
  • Filter Created
  • Filter Updated
  • Filter Deleted
  • Issue Created
  • Issue Updated
  • Issue Deleted
  • IssueLink Created
  • IssueLink Deleted
  • IssueType Created
  • IssueType Updated
  • IssueType Deleted
  • Option Attachments Changed
  • Option Issulinks Changed
  • Option TimeTracking Changed
  • Option SubTasks Changed
  • Option UnAssignedIssues Changed
  • Option Voting Changed
  • Option Watching Changed
  • Project Created
  • Project Deleted
  • Project Soft Deleted (Archived)
  • Project Updated
  • Sprint Closed
  • Sprint Started
  • Sprint Deleted
  • Sprint Created
  • Sprint Updated
  • User Created
  • User Updated
  • User Deleted
  • Version Created
  • Version Updated
  • Version Deleted
  • Version Released
  • Version Moved
  • Version Unreleased
  • Worklog Created
  • Worklog Updated
  • Worklog Deleted

Execution failure notifier

ALT

In Jira cloud, the Notifications group setting allows you to specify a group of users who will get an email each time a script fails, but this can't be configured to send to other messaging services such as Slack because the notify API doesn’t allow you to email external emails.

Fast-track transition an issue

ALT

You can achieve a similar result by creating custom script listener and using HAPI

Fires an event when a condition is true

ALT

In Data Center this listener enables you to trigger a specific Jira event based on a custom condition. Once fired, the event can be picked up by a notification scheme, determining who gets alerted.

It is not possible to fire a custom event in Cloud therefore this built-in script cannot be directly replicated in ScriptRunner for Jira Cloud. However, you could use the Send Notification built-in post function that is available.

Post a message to slack

ALT

You can achieve the same result by creating custom script listener and using and/or adapting the Post a message to Slack example script. 

Send a custom email (non-issue events)

ALT

You can achieve a similar result by creating custom script listener and using and/or adapting the Notify on priority change example script. 

The notify API doesn’t allow you to email external emails and only allows you to notify users, groups, or user fields (such as assignee or reporter) on an issue.

Send a custom email

ALT

You can achieve a similar result by creating custom script listener and using and/or adapting the Notify on priority change example script. 

The notify API doesn’t allow you to email external emails and only allows you to notify users, groups, or user fields (such as assignee or reporter) on an issue.

Version Synchronizer

ALT

You can achieve a similar result by creating custom script listener and using and/or adapting the Copy versions from one project to another example script. 

Please note that this alternative is subject to the constraints of the Cloud environment, such as time limitations and API availability. Check out our page on Scripting in ScriptRunner for Jira Cloud for tips. 

Mail Handler

The Mail Handler Data Center feature is not currently available in ScriptRunner for Jira Cloud. 

Server/DC Feature

Cloud ParityParity Notes/Alternatives

Mail Handler

(error)


Resources

Parity summary

The Resources feature is not currently available in ScriptRunner for Jira Cloud, however some Resources have script alternatives that can be executed in the Script Console in ScriptRunner for Jira Cloud. Where applicable, links to these script alternatives are provided in the table below.

Parity details

Server/DC Feature

Cloud ParityParity Notes/Alternatives

Database Connection

ALT

You can connect to databases in scripts and link to the examples we have in the Script Console examples.

LDAP Connection

ALT

If the LDAP service exposes a REST API, you could connect to this in Scripts by making a REST API call.

Local Database Connection

(error)

This is not possible in Jira Cloud.

"Local" databases are on-premises behind your firewall. Cloud runs in Atlassian's AWS infrastructure and cannot access your internal network due to security isolation. ScriptRunner Cloud runs as a separate service with no direct network access to customer infrastructure.

Slack Connection

ALT

You can connect to Slack in scripts via the REST API and link to the examples we have in the Script Console examples.

REST Endpoints

The Rest Endpoints feature is not currently available in ScriptRunner for Jira Cloud.

If you need to call external systems to import data into Jira, consider using ScriptRunner Connect, our powerful integration platform that offers this capability and much more.

Server/DC Feature

Cloud ParityParity Notes/Alternatives

Rest Endpoints

(error)

Unlike Data Center, Jira Cloud does not offer custom endpoints. Instead it uses the Atlassian REST API. However, with ScriptRunner, you can still connect and interact with other systems by calling their external APIs.

Script Console

The Script Console feature is available in both Data Center and Cloud versions of ScriptRunner. However, there are some limitations applied to scripts on Cloud you should be familiar with

See our Example Scripts for a complete collection of pre-written scripts that can be ran from the the Script Console in ScriptRunner for Jira Cloud.

Server/DC Feature

Cloud ParityParity Notes/AlternativesCloud Links

Script Console

(tick)

Execution limitation:

  • There is a limit of 240 seconds for Cloud script executions. After running for 240 seconds, the logs will be collected, and the code will be terminated.

Script Console Cloud Documentation

Cloud Script Console Example Scripts

Script Editor

The Script Editor feature is available in ScriptRunner for Jira Cloud as the Script Manager.

Server/DC Feature

Cloud ParityParity Notes/Alternatives

Script Editor

(tick)

ScriptRunner for Jira Cloud's Script Manager feature allows you to create and manage saved .groovy scripts and folders directly from the ScriptRunner front-end, without relying on FTP services or server administrators. 

Coming soon...
We are working on creating further Script Manager enhancements, including:

  • Moving scripts
  • Renaming and moving folders 
  • Data residency support:
    • Support for realm-to-realm migrations - we recommend not using Script Manager if you are planning a realm-to-realm migration before our next iteration of this feature. Keep up to date with our Release Notes.

UI Fragments

Parity summary

This feature is known as Script Fragments in ScriptRunner for Jira Cloud; however, only Web Panels are available. 

Parity details

Server/DC Feature

Cloud ParityParity Notes/AlternativesCloud Links

Custom web item

(error)

This is not possible in Jira Cloud.

Web Items (buttons, menu items, links) are not supported by the UI Modifications API. You cannot add custom buttons or menu items to Jira's UI through ScriptRunner Cloud.

Show a web panel

You can create web panels in ScriptRunner for Jira Cloud, however there are limitations, such as:

  • The script source must be specified (and accessible to Jira). Inline script is not available. 

Create a custom web section

(error)

This is not possible in Jira Cloud.

As Cloud doesn't support web items, it also doesn't support the sections that would contain them.

Hide system or plugin UI element

(error)

This is not possible in Jira Cloud.

Constrained create issue dialog

(error)

This is not possible in Jira Cloud.

Planning board context menu item

(error)

This is not possible in Jira Cloud.

We cannot add custom menu items to boards, backlogs, or other agile views.

Install web resource

(error)

This is not possible in Jira Cloud.

Web Resources (CSS, JavaScript files bundled with plugins) are a P2 framework concept that doesn't exist in Cloud. Cloud apps cannot install global resources into Jira's UI. Script Fragments must reference external URLs for resources instead.

Custom web item provider

(error)

This is not possible in Jira Cloud.

Web Item Providers (dynamic generation of multiple web items) are not supported since basic web items aren't supported.

Raw XML module

(error)

This is not possible in Jira Cloud.

Raw XML modules were used in Server/DC's P2 plugin framework to define plugin modules via atlassian-plugin.xml. Cloud uses the Atlassian Connect framework, which uses JSON descriptors instead. There is no XML-based plugin configuration in Cloud.

Script Fields

Parity summary

This feature is known as Scripted Fields in ScriptRunner for Jira Cloud. While built-in scripted fields are available in the Data Center version and not currently in Cloud, there are many script alternatives that can be executed using a custom scripted field

See our Example Scripts for a complete collection of pre-written scripts that can be used with Scripted Fields.

Parity details

Server/DC Feature

Cloud ParityParity Notes/AlternativesCloud Links

Custom Script Fields

(tick)

The Custom Scripted Field feature is available in ScriptRunner for Jira Cloud.

Additional details:

  • The value of Scripted Fields refreshes on issue view and when an issue containing a Scripted Field is updated.
  • Although fully parity is available, it is not possible to perform a full re-index in Jira Cloud.

Custom Picker

(error)

This is not possible in Jira Cloud.

Jira Cloud's REST API doesn't support creating picker field types through apps.

Database Picker

(error)

You can connect to databases in scripts and link to the examples we have in the Script Console examples.

Date of the first transition

ALT

You can achieve the same result by creating a Custom Scripted Field and using the Date of the first transition example script. 

Issue(s) Picker

ALT

This is not possible in Jira Cloud.

Jira Cloud's REST API doesn't support creating picker field types through apps.

Alternative: Use native Jira Issue Links or display issue references as read-only text/links in Scripted Fields. You could write a script to search for the issue to return and render a link to an issue in a rich text field using Atlassian Document Format.

LDAP Picker Field


(error)

This is not possible in Jira Cloud.

Jira Cloud's REST API doesn't support creating picker field types through apps.

Alternative: If LDAP exposes a REST API, you could display LDAP data in read-only Scripted Fields, but not create an interactive picker.

No. of times in a status

ALT

You can achieve the same result by writing your own script in the Custom Scripted Field but with all the caveats of time limitations, API availability, etc. 

You can use the example script outlined below as an alternative:

groovy
/* * This script provides an example of how in Scripted Fields you can configure a field to display a table showing the number of times an issue has been in a set of specified statuses. * * All right, title and interest in this code snippet shall remain the exclusive intellectual property of Adaptavist Group Ltd and its affiliates. Customers with a valid ScriptRunner * license shall be granted a non-exclusive, non-transferable, freely revocable right to use this code snippet only within their own instance of Atlassian products. This licensing notice cannot be removed * or amended and must be included in any circumstances where the code snippet is shared by You or a third party." */ // Define the statuses you want to track def targetStatuses = ['To Do', 'In Progress'] // Get the issue key from the current issue def issueKey = issue.key // Initialize a map to store counts for each status def statusCounts = [:] as Map<String, Integer> targetStatuses.each { status -> statusCounts[status] = 0 } // Fetch changelog with pagination support def startAt = 0 def maxResults = 100 def isLast = false while (!isLast) { def changelogResponse = get("/rest/api/3/issue/${issueKey}/changelog") .queryString('startAt', startAt) .queryString('maxResults', maxResults) .header('Content-Type', 'application/json') .asObject(Map) .body // Get the list of changelog entries def changelogs = changelogResponse.values // Iterate through each changelog entry changelogs.each { Map changelog -> def items = changelog.items // Check each item in the changelog items.each { Map item -> // Check if this is a status change if (item.field == 'status') { def newStatus = item.toString() // Check if the new status is in our target list if (statusCounts.containsKey(newStatus)) { statusCounts[newStatus] = statusCounts[newStatus] + 1 } } } } // Check if there are more pages isLast = changelogResponse.isLast if (!isLast) { startAt += maxResults } } // Build ADF table structure def tableRows = [] // Add header row tableRows.add([ type: 'tableRow', content: [ [ type: 'tableHeader', attrs: [:], content: [ [ type: 'paragraph', content: [ [ type: 'text', text: 'Status' ] ] ] ] ], [ type: 'tableHeader', attrs: [:], content: [ [ type: 'paragraph', content: [ [ type: 'text', text: 'Count' ] ] ] ] ] ] ]) // Add data rows for each status statusCounts.each { String status, Integer count -> tableRows.add([ type: 'tableRow', content: [ [ type: 'tableCell', attrs: [:], content: [ [ type: 'paragraph', content: [ [ type: 'text', text: status ] ] ] ] ], [ type: 'tableCell', attrs: [:], content: [ [ type: 'paragraph', content: [ [ type: 'text', text: count.toString() ] ] ] ] ] ] ]) } // Build the complete ADF document def numberOfTimesInStatusTable = [ version: 1, type: 'doc', content: [ [ type: 'table', attrs: [ isNumberColumnEnabled: false, layout: 'default' ], content: tableRows ] ] ] return numberOfTimesInStatusTable


Remote issue(s) picker

ALT

You can link to issues in a remote Jira instance using the Create remote issue link API inside a script. We have an example of using this API here.

Show parent issue in a hierarchy

ALT

You can achieve the same result by writing your own script in the Custom Scripted Field but with all the caveats of time limitations, API availability, etc. 

You can use the example script outlined below as an alternative:

groovy
// Set your target parent issue type (e.g., "Theme", "Initiative", "Epic") final String TARGET_ISSUE_TYPE = "Task" final int MAX_DEPTH = 10 Map findParentOfType(String currentIssueKey, String targetType, int maxDepth, int depth = 0) { if (depth >= maxDepth) { return null } def issueResp = get("/rest/api/3/issue/${currentIssueKey}") .queryString('fields', 'parent,issuetype,summary,key') .asObject(Map) if (issueResp.status != 200) { return null } def currentIssue = issueResp.body as Map def fields = currentIssue.fields as Map // Only check the current issue's type if we're not on the first call (depth > 0) // This ensures we never return the starting issue, only its parents/ancestors if (depth > 0) { def issueType = fields.issuetype as Map if (issueType.name == targetType) { return [ key: currentIssue.key, summary: fields.summary ] } } // Check for parent def parent = fields.parent as Map if (!parent) { return null } // Recurse with the parent's key return findParentOfType(parent.key as String, targetType, maxDepth, depth + 1) } // Use the current issue from the scripted field binding def parentIssue = findParentOfType(issue.key as String, TARGET_ISSUE_TYPE, MAX_DEPTH) if (parentIssue) { def parentKey = parentIssue.key def parentSummary = parentIssue.summary as String return [ version: 1, type: "doc", content: [ [ type: "paragraph", content: [ [ type: "text", text: "${parentKey} - ${parentSummary}", marks: [ [ type: "link", attrs: [ href: "${baseUrl}/browse/${parentKey}" ] ] ] ] ] ] ] ] } else { return [ version: 1, type: "doc", content: [ [ type: "paragraph", content: [ [ type: "text", text: "No Parent Found" ] ] ] ] ] }



Time of Last status Change

ALT

You can achieve the same result by creating a Custom Scripted Field and using the Time of last status change example script. 

Settings

Server/DC Feature

Cloud ParityParity Notes/Alternatives

Script Edit Permissions

(error)


Hapi Code Helper

(error)


In-App Communications

There is no opt-in for this, but we use in-app banners and popups to communicate information relating to Scriptrunner for Jira Cloud.

Switch User Function

(error)

This is not possible in Jira Cloud.

Apps cannot bypass authentication or run as arbitrary users. Scripts can only execute as:
- The add-on user (ScriptRunner's service account)
- The initiating user (whoever triggered the script)

This security restriction is fundamental to Cloud's multi-tenant architecture.

Atlassian does not provide the API so this cannot be built in Jira Cloud. However, Jira Cloud organization admins can switch to different users by using the built in feature as documented by Atlassian.

Anonymous Analytics

(error)


User Editor Settings

(error)


Workflow Conditions

Parity summary

ScriptRunner Workflow functions are available in ScriptRunner for Jira Cloud as Workflow Extensions. ScriptRunner Script Conditions are present in Jira Cloud but rely on Jira expressions rather than Groovy, and it is not possible to use the REST API.

While built-in script conditions aren't directly accessible in ScriptRunner for Jira Cloud, you can replicate their functionality using ScriptRunner Script Conditions with Jira expressions. 

Parity details

Server/DC Feature

Cloud Parity

Parity Notes/Alternatives


Cloud Links

All sub-tasks must be resolved

ALT

You can achieve the same result by creating a custom script condition and using the Sub-tasks must be done Jira expression example. 

Cloud Workflow Extensions Documentation

Cloud Script Condition Documentation

Jira expressions examples

 

 

 

 

 

 

 

 

 

 

 


Checks the issue has been in a status previously

ALT

You can achieve the same result by creating a custom script condition and using the Checks the issue has been in a status previously Jira expression example.

Custom script condition

ALT

The ScriptRunner Script Condition feature is available in ScriptRunner for Jira Cloud, however this feature relies on Jira Expressions in Cloud. It does not use Groovy and it is not possible to use the REST API.

Incompatible fields that should be discarded:

  • Test Against - Used for testing scripts when creating or editing validators only, so can be safely discarded.

Field(s) required condition

ALT

You can achieve the same result by creating a custom script condition and using the Field(s) required Jira expression example.

Group(s) condition

ALT

You can achieve the same result by creating a custom script condition and using the Specify the current user must be in a defined list of users Jira expression example.

JQL query matches condition

(error)

This is not possible in Jira Cloud.

Cloud workflow conditions are restricted to the Jira Expression Framework only, which cannot execute arbitrary JQL queries like Data Center's Groovy-based conditions could.

You can achieve similar functionality using custom script conditions with Jira Expressions, but you must work within the expression language's constraints rather than executing full JQL queries.

Linked issues condition

ALT

You can achieve the same result by creating a custom script condition and using the Linked issues Jira expression example.

Project role(s) condition

ALT

You can achieve the same result by creating a custom script condition and using the Restrict to project role Jira expression example.

Regular expression condition

ALT

You can achieve the same result by creating a custom script condition and using and/or adapting the Regular expression Jira expression example.

Simple scripted condition

The ScriptRunner Script Condition feature is available in ScriptRunner for Jira Cloud, however this feature relies on Jira Expressions in Cloud. It does not use Groovy and it is not possible to use the REST API.

User in field(s) condition

ALT

You can achieve the same result by creating a custom script condition and using and/or adapting the User in field(s) Jira expression example.

User(s) condition

ALT

You can achieve the same result by creating a custom script condition and using and/or adapting the User(s) and user group(s) Jira expression example.

Workflow Post Functions

Parity summary

ScriptRunner Workflow functions are available in ScriptRunner for Jira Cloud as Workflow Extensions. ScriptRunner Post Functions are available in Jira Cloud.

While some built-in script post functions are not currently available in the ScriptRunner for Jira Cloud environment, many of them have script alternatives that can be executed using a ScriptRunner Script Post Function.

See our Example Scripts for a complete collection of pre-written scripts that used with Workflow post functions.

Parity details

Server/DC Feature

Cloud ParityParity Notes/Alternatives

Cloud Links

Add a comment to this issue

ALT

You can achieve the same result by creating a custom post function and using and/or adapting the Add comment to this issue script.

Cloud Workflow Extensions Documentation

Cloud Post Function Documentation

Cloud Post Function Example Scripts

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

Add/remove from sprint

(tick)

The Add/remove from sprint built-in post function is available in ScriptRunner for Jira Cloud.

Incompatible fields that should be discarded:

  • Return user to Execute As. In Cloud, users can run as the Add-on or initiating user only and cannot choose a specific user to run the post function.

Adds a comment to linked issues when this issue is transitioned

ALT

You can achieve the same result by using the Run Script post function and the Add a comment to linked issues when this issue is transitioned script.

Adds the current user as a watcher

ALT

You can achieve the same result by using the Run Script post function and the Add the current user as a watcher script.

Archive this issue

ALT

You can achieve the same result by using the Run Script post function and writing a script to call the Archive issue API to achieve this.

To use this API, you need to be on the Premium or Enterprise tiers of Jira Cloud.

Assign to first member of role

ALT

The Assign Issue built-in post function is available in ScriptRunner for Jira Cloud.

Incompatible fields that should be discarded:

  • Include Reporter
  • Include Assignee
  • Force Assignee

Assign to last role member

ALT

The Assign Issue built-in post function is available in ScriptRunner for Jira Cloud.

Incompatible fields that should be discarded:

  • Include Reporter
  • Include Assignee
  • Force Assignee

Clear field(s)

ALT

You can achieve the same result by using the Run Script post function and the Clear field(s) script.

Clones an issue, and links

(tick)

The Clone Issue built-in post function is available in ScriptRunner for Jira Cloud.

Incompatible fields that should be discarded:

  • Fields to copy

  • Copy Comments

  • Copy Subtasks

  • As User - In Cloud, users can run as the Add-on or initiating user only and cannot choose a specific user to run the post function.

Copy field values

ALT

You can achieve the same result by using the Run Script post function but with all the caveats of time limitations, API availability, etc. Check out our page on Scripting in ScriptRunner for Jira Cloud for tips.

In Cloud there is already a Copy Value From Other Field post function built in.

Create a sub-task

(tick)

The Create Sub-task built-in post function is available in ScriptRunner for Jira Cloud.

Incompatible fields that should be discarded:

  • Fields to copy

  • As User - In Cloud, users can run as the Add-on or initiating user only and cannot choose a specific user to run the post function.

Custom script post-function

(tick)

The Run Script post function is available in ScriptRunner for Jira Cloud.

Fast-track transition an issue

(tick)

The Fast-Track Transition Issue built-in post function is available in ScriptRunner for Jira Cloud.

Incompatible fields that should be discarded:

  • Transition Options

Fires an event when condition is true

ALT

In Data Center this post function enables you to trigger a specific Jira event based on a custom condition. Once fired, the event can be picked up by a notification scheme, determining who gets alerted.

It is not possible to fire a custom event in Cloud therefore this built-in script cannot be directly replicated in ScriptRunner for Jira Cloud. However, you could use the Send Notification built-in post function that is available.

Post a message to Slack

ALT

You can achieve the same result by using the Run Script post function and the post to Slack script.

Send a custom email

(tick)

The Send Notification built-in post function is available in ScriptRunner for Jira Cloud.

Set issue security level depending on the provided condition

ALT

You can achieve the same result by using the Run Script post function and writing a script that, if the condition matches, calls the Edit Issue API and updates the issue to set the security field on an issue. You could use and adapt the Set Issue Security Level script example.

Transition parent when all subtasks are resolved

The Transition Parent Issue built-in post function is available in ScriptRunner for Jira Cloud.

Workflow Validators

Parity summary

ScriptRunner Workflow functions are available in ScriptRunner for Jira Cloud as Workflow ExtensionsScriptRunner Validators are present in Jira Cloud but rely on Jira expressions rather than Groovy, and it is not possible to use the REST API.

While built-in validators aren't directly accessible in ScriptRunner for Jira Cloud, you can replicate their functionality using ScriptRunner Validators with Jira expressions. 

Parity details

Server/DC Feature

Cloud Parity

Parity Notes/Alternatives


Cloud Links

Custom script validator

ALT

The ScriptRunner Validators feature is available in ScriptRunner for Jira Cloud, however this feature relies on Jira Expressions in Cloud. It does not use Groovy and it is not possible to use the REST API.

Incompatible fields that should be discarded:

  • Test Against - Used for testing scripts when creating or editing validators only, so can be safely discarded.

Cloud Workflow Extensions Documentation

Cloud Validators Documentation

Jira expressions examples

 

 

 

 

 

 

 

 

 

 

 


Field(s) changed validator

ALT

You can achieve the same result by creating a custom validator and using the Field(s) changed Jira expression example. 

Field(s) required validator

ALT

You can achieve the same result by creating a custom validator and using the Field(s) required Jira expression example. 

Regular expression validator

ALT

You can achieve the same result by creating a custom validator and Regular expressions.

Require a comment on transition

ALT

You can achieve the same result by creating a custom validator and using the Require a comment on transition Jira expression example. 

Simple scripted validator

The ScriptRunner Validators feature is available in ScriptRunner for Jira Cloud, however this feature relies on Jira Expressions in Cloud. It does not use Groovy and it is not possible to use the REST API.

User in field(s) validator

ALT

You can achieve the same result by creating a custom validator and using the User in field(s) Jira expression example. 


On this page