Skip to main content
This page covers the Rootly workflow actions for writing to Jira — creating issues, updating them, and creating subtasks. For the reverse direction (Jira events updating Rootly), see Jira → Rootly Sync.

Workflow Actions

Creates a new ticket in a Jira project. You must select the Project Key and Issue Type for the ticket to be created correctly.This action can be used for both incidents and action items. For action items, using Create Jira Subtask is recommended if your team uses subtasks — but if not, this action works as well.
Create Jira Issue action
Project Key
select
The Jira project where the issue will be created.
Issue Type
select
The type of Jira issue to create. Options are pulled from the selected project.
Summary / Title
string
The title of the Jira issue. Supports Liquid syntax (e.g., {{ incident.title }}).
Description
string
The description of the Jira issue. Supports Liquid syntax (e.g., {{ incident.summary }}).
Assignee (email address)
string
Assign the Jira issue to a user by email. Supports Liquid syntax.
Updates an existing ticket in Jira. You must reference the issue in the Jira Issue to Update field using {{ incident.jira_issue_id }}.
Update Jira Issue action
This action only works if a Jira issue has already been created and linked to the incident.
Jira Issue to Update
string
Reference to the existing Jira issue. Use {{ incident.jira_issue_id }} to dynamically target the issue linked to the current incident.
Summary / Title
string
Updated title of the Jira issue. Supports Liquid syntax.
Description
string
Updated description. Supports Liquid syntax.
Status
select
Transition the issue to a new status. Options are pulled from the selected project and issue type.
Assignee (email address)
string
Reassign the Jira issue to a different user. Supports Liquid syntax.
Creates a subtask under an existing Jira issue. Intended for action items or sub-incidents. The Project Key must match the one used when creating the parent issue.
Create Jira Subtask action
Parent Jira Issue
string
Reference to the parent Jira issue. Use {{ incident.jira_issue_id }} to link the subtask to the current incident’s issue.
Project Key
select
Must match the project used to create the parent issue.
Summary / Title
string
Title of the subtask. Supports Liquid syntax.
Description
string
Description of the subtask. Supports Liquid syntax.
Assignee (email address)
string
Assign the subtask to a user by email. Supports Liquid syntax.

Jira Native Field Mapping

Some Jira fields behave differently than standard custom fields.
These mappings go in the Custom Fields Mapping section of the Jira action, not the API Payload section.
Jira’s native Labels field uses a different syntax than custom label-type fields.
Labels native field mapping
// Rootly native multi-select → Jira native Labels
"customfield_12345": {{ incident.service_slugs | join: ","}}

// Rootly custom multi-select → Jira native Labels
"customfield_10033": {{ incident.custom_fields | find: 'custom_field.slug', 'your_custom_field_slug' | get: 'selected_options' | map: 'value' | join: "," }}
Jira’s native Team field is stored as a custom field and only allows a single team selection.
// Static Jira Team ID
"customfield_10001": "<jira_team_id>"

// Dynamic: Rootly team → Jira Team (using description field to store the Jira team ID)
"customfield_10001": "{{ incident.raw_groups[0] | get: 'description' }}"

Custom Fields Mapping

The Custom Fields Mapping section lets you map Rootly incident data to Jira custom fields dynamically. To access it, open the Advanced tab in any Jira workflow action.
Advanced tab for custom field mapping
To use custom field mapping, you’ll need to know:
  • The custom field ID in Jira (e.g., customfield_12345)
  • The field type in Jira
  • The incident property in Rootly to map from
Find Jira custom field IDs with this Atlassian article. Browse Rootly’s available Liquid variables in the Liquid Variable Explorer.
// Rootly native field → Jira text
"customfield_12345": "{{ incident.functionalities }}"

// Rootly custom field → Jira text
"customfield_12345": "{{ incident.custom_fields | find: 'custom_field.slug', 'your-slug' | get: 'selected_options' | map: 'value' }}"
Note the { "value": ... } wrapper required by Jira:
// Rootly team name → Jira single select
"customfield_12345": { "value": "{{ incident.raw_groups | first | get: 'name' }}" }

// Rootly custom field → Jira single select
"customfield_12345": { "value": "{{ incident.custom_fields | find: 'custom_field.slug', 'your_custom_field_slug' | get: 'selected_options' | map: 'value' }}" }
Simple approach (Rootly custom multi-select):
"customfield_12345": {{ incident.custom_fields | find: 'custom_field.slug', 'your_custom_field_slug' | get: 'selected_options' | to_values }}
Manual array building (Rootly native fields):
{% assign functions = incident.functionalities %}
{% assign array = "" %}
{% for function in functions %}
  {% assign item = '{"value":"' | append: function | append: '"}' %}
  {% assign array = array | append: item | append: "," %}
{% endfor %}
{% capture final_array %}[{{ array | remove_last: ',' }}]{% endcapture %}
"customfield_12345": {{ final_array }}
For Jira custom fields of type “Labels” (different from the native Labels field):
// Rootly native multi-select → Jira labels
"customfield_12345": {{ incident.service_slugs | to_json }}

// Rootly custom multi-select → Jira labels
"customfield_10033": {{ incident.custom_fields | find: 'custom_field.slug', 'your_custom_field_slug' | get: 'selected_options' | map: 'value' | to_json }}
"customfield_26117": {{ incident.custom_fields | find: 'custom_field.slug', 'your_custom_field_slug' | get: 'selected_options.value' }}
Must use ISO 8601 format:
// Rootly incident start time → Jira datetime
"customfield_10030": "{{ incident.started_at | date: '%FT%T%:z' }}"

// Rootly custom datetime → Jira datetime
"customfield_26218": "{{ incident.custom_fields | find: 'custom_field.slug', 'your_custom_field_slug' | get: 'selected_options.value' | date: '%Y-%m-%dT%H:%M:%S.%d%z' }}"
Single user:
{% assign jira_email = incident.roles | find: 'incident_role.slug', 'incident-commander' | get: 'user.email' %}
"customfield_20825": { "id": "{{ team.jira_users | where: 'email', jira_email | first | get: 'account_id' }}" }
Multiple users:
{% assign jira_email = incident.roles | find: 'incident_role.slug', 'incident-commander' | get: 'user.email' %}
"customfield_20825": [{ "id": "{{ team.jira_users | where: 'email', jira_email | first | get: 'account_id' }}" }]

API Payload

The API Payload section provides direct access to Jira’s REST API for advanced field updates not available through Custom Fields Mapping.
{% if incident.severity_slug == 'sev0' %}
  { "priority": [ { "set": { "name" : "High" } } ] }
{% elsif incident.severity_slug == 'sev1' %}
  { "priority": [ { "set": { "name" : "Medium" } } ] }
{% elsif incident.severity_slug == 'sev2' %}
  { "priority": [ { "set": { "name" : "Low" } } ] }
{% endif %}
Add a comment to an existing Jira issue. Only works with the Update Jira Issue action.
{
  "comment": [
    {
      "add": {
        "body": "Enter your message here. Liquid syntax is supported."
      }
    }
  ]
}
{
  "labels": [{ "set": ["label1", "label2"] }]
}
Maps Rootly services to Jira Components. Service names in Rootly must match component names in Jira exactly.
{% assign components = incident.services %}
{
  "components": [
    {
      "set": [
      {% for component in components %}
        { "name": "{{ component }}" }{% unless forloop.last %},{% endunless %}
      {% endfor %}
      ]
    }
  ]
}
If a component name doesn’t exist in Jira, the update will fail.

Debugging

To view error details, locate the workflow in Rootly, then select … → View Runs → View.
ErrorCauseFix
issue_id cannot be null.The Jira issue you’re trying to update doesn’t exist yetEnsure the Create action runs before the Update action
"customfield_12345": "Custom Field is required."A required Jira custom field isn’t being populatedAdd a mapping for the field, or make it optional in Jira
unexpected token at '{ "customfield_10032": }'Custom mapping syntax is invalidFix your JSON syntax
Specify a valid project ID or keyThe selected Project Key isn’t available in the Jira instanceReselect the Jira instance, then reselect the Project Key
The issue type selected is invalid.The selected issue type doesn’t exist in the projectReselect the Project Key, then reselect the Issue Type