Pixel Welding

What is aggregation?

Aggregation computes summary values on parent issues based on their children. When a parent issue has child issues in the hierarchy, the app collects data from all descendants and stores the result on the parent. The tree view then displays these values in aggregated columns.

Aggregation is event-driven — it recalculates automatically whenever a child issue is created, updated, or deleted, and whenever the parent-child relationship changes.

The app supports two kinds of aggregation:

  • General aggregators — Automatically available for any field whose schema type matches a supported category. Select the field and the app handles the computation.
  • Custom aggregators — Write your own computation logic using Jira Expressions. The app ships with two built-in custom aggregators: Progress and Pending Team.

General aggregators

General aggregators work by field type. Any Jira field whose schema matches a supported type can be aggregated — just add it to a hierarchy and the app computes the value automatically.

Supported field types

Field schema typeAggregation behaviorExample fields
string / optionCollects unique values from all childrenText fields, select lists
array of string / optionCollects unique values across children’s arraysLabels, Components, multi-select
statusCategoryReduces children’s status categories to a single summaryJira Status
projectCollects unique project references from childrenProject picker fields
Team (atlassian-team)Collects unique team members from childrenAtlassian Team custom field

Note

The field dropdown only shows fields whose schema type matches one of the supported types above. General aggregators require no configuration beyond selecting the field.

Adding a general aggregated field

Aggregated Fields editor

  1. Go to the admin page and click Edit Levels on a hierarchy
  2. Scroll to the Aggregated Fields section below the levels table
  3. Click + Add Field
  4. Select a field from the dropdown
  5. Click Save

A field can only be aggregated in one hierarchy at a time. If a field is already used in another hierarchy, it won’t appear in the dropdown.

Custom aggregators

Custom aggregators let you define your own computation logic using Jira Expressions. Unlike general aggregators which apply automatically to fields of a matching type, custom aggregators run a Jira Expression you write against the parent issue and all its descendants.

Built-in custom aggregators

The app ships with two read-only custom aggregators:

Custom Aggregators manager

Progress

Shows a color-coded progress bar based on the status categories of child issues:

  • Blue — To Do
  • Yellow — In Progress
  • Green — Done

The bar width represents the proportion of issues in each category. Hover over the bar to see exact counts.

How it works: Progress depends on the statusCategory general aggregator. After the status category is aggregated for all children, the Progress expression counts how many children fall into each category.

Pending Team

Displays avatars of team members assigned to child issues that are not yet done. When all child issues are completed, the field shows empty.

How it works: Pending Team depends on both a Team field and the statusCategory general aggregator. It filters out team members whose child issues are in the “Done” category.

Assigning built-in aggregators

To use Progress or Pending Team:

  1. In the levels editor for a hierarchy, add the required general aggregated fields first (e.g. statusCategory for Progress)
  2. Scroll to the Custom Aggregators section
  3. Click + Add and select Progress or Pending Team from the list
  4. Click Save

Creating your own custom aggregator

Custom Aggregator detail view

  1. Go to the admin page, scroll to the Custom Aggregators section
  2. Click + Add Custom Aggregator
  3. Fill in the definition:
PropertyDescription
NameHuman-readable label shown in the tree view
Display TypeHow the result renders in the tree (progress, team, user, number, etc.)
ExpressionA Jira Expression using issues.reduce(...) to compute a value from children
Field DependenciesJira field IDs that trigger recalculation when changed on any child
Aggregated DependenciesGeneral aggregated field IDs whose output is chained into this expression
Index Path(Optional) A JSON path within the result to expose for JQL searching
Index Type(Optional) The Jira property value type for the indexed path

Expression syntax

Custom aggregator expressions use the Jira Expression language. The expression receives:

  • issue — the parent issue being computed
  • issues — an array of all descendant issues

Use issues.reduce(...) to iterate over children and accumulate a result:

// Example: count children by priority
issues.reduce((r, child) => {
  let p = child.priority?.name ?? 'None';
  return r.set(p, (r[p] || 0) + 1);
}, new Map())

Aggregated dependencies

If your expression needs the output of a general aggregated field, list it in Aggregated Dependencies. The custom aggregator runs after the general aggregator completes, and its result is available via {{aggregatedProperty[N]}} in your expression, where N is the zero-based index in the dependencies list.

For example, the built-in Progress aggregator lists statusCategory as an aggregated dependency, then references it as {{aggregatedProperty[0]}} in its expression.

Assigning to hierarchies

After creating a custom aggregator, assign it to one or more hierarchies:

  1. In the levels editor for a hierarchy, scroll to Custom Aggregators
  2. Click + Add and select from your defined aggregators
  3. Click Save

A custom aggregator can be assigned to multiple hierarchies.

Display types

The displayType property controls how an aggregated value renders in the tree view:

Display TypeRendering
progressColor-coded progress bar
teamAvatar group of team members
userSingle user avatar
numberNumeric value
dateFormatted date
projectProject name/key
statusCategoryStatus category lozenge

If no display type is specified, the value renders as generic text.

Next steps