Skip to main content

Transforms

A transform reshapes a mapping's value. Each mapping on a step's Input or Output tab takes its value from its Source, then passes it through its Transforms in order, each one working on what the one before it produced. Transforms put a value into the form the next step needs—a field picked out of an object, a label in place of a code, a default where nothing came through—without a script.

A transform works only on the value it is given. A setting that needs another value, such as a Conditional's Compare To, accepts a variable reference, resolved just before the transform runs.

Apart from Set Value, which is how a mapping supplies a default, the built-in transforms pass an empty value, null, on unchanged, so a field an upstream step left unset doesn't fail the step. Text, Number, Date & Time, Map Values, and Convert work on each item of a list in turn, so one step can lowercase every label in a list, while List works on the list as a whole.

TransformWhat it does
ConditionalTests the value and runs one of two lists of transforms, Then or Else, depending on the result.
ConvertConverts the value to text, a number, true or false, or between JSON text and the object it writes.
Date & TimeReads the value as a date and time and writes it out in another form.
Extract PathPicks a nested value out of an object by its slash-separated path, such as fields/summary.
ListWorks on a list as a whole: picks, counts, joins, filters, sorts, or totals its items.
Map ValuesLooks the value up in a table and replaces it with what the table maps it to.
NumberReads the value as a number and works it out: arithmetic, rounding, limits, or writing it for people to read.
Set ValueReplaces the value, always or only when it is empty.
TextReads the value as text and changes it: its case, its whitespace, what it contains, its length, or its encoding.
ScriptRuns a script on the value, for anything the other transforms don't cover.

Convert​

Converts the value to the type chosen in To, such as the text 10 from a form field to the number a step's field takes. A value that can't be read as that type fails the step rather than being guessed at.

ToConverts
TextA number to its text, written plainly, such as 3 rather than 3.0, and true or false to the words. An object fails the step; use JSON Text for that.
NumberText that is a number, such as 42 or -1.5, to the number.
True or Falsetrue or false, written in any case, to the value, and a number to false when it is zero and true otherwise. Other text, such as yes, fails the step, as a typed field reads it.
Parse JSONJSON text to the object, list, or other value it writes. A value that is already an object or a list passes on unchanged.
JSON TextAny value to JSON text, such as an object for a field that takes text.

Text, Number, and True or False convert each item of a list in turn; Parse JSON and JSON Text work on the value whole.

Date & Time​

Reads the value as a moment, adjusts it if asked, then writes it out in the form the next step needs—for example, a Jira timestamp as the epoch milliseconds a Brightspot date field holds, or a publish date 30 days on as an embargo's end. A list has each of its items read, adjusted, and written in turn.

FieldDescription
Read AsHow the value is read. Automatic reads every shape below except a pattern. Choose another to read only that shape, for a value Automatic can't tell apart, or to fail the step when an upstream system changes shape rather than reading the new one.
PatternShown when Read As is Pattern. The shape the value is written in, in java.time's pattern letters, such as MM/dd/yyyy. Month and day names are read in English.
Time ZoneThe zone the output is written in and adjustments are worked out in, and the one a timestamp with no zone of its own is read in. Leave blank for the server's zone.
AdjustChanges made to the moment before it is written, in order. See below.
OutputWhat to write. See below.
Input Time ZoneUnder Advanced. The zone a timestamp with no zone of its own was written in, when it isn't Time Zone. Set it to convert a wall-clock time from one zone to another.

Read As offers these shapes:

Read AsReads
AutomaticAny of the shapes below except a pattern, plus a plain yyyy-MM-dd HH:mm:ss and an RFC 1123 timestamp, such as an HTTP header's Fri, 16 Oct 2026 19:30:00 GMT. An epoch number below 100,000,000,000 is read as seconds and a larger one as milliseconds. A date such as 09/10/2026 is never guessed at, since nothing in it says which part is the month.
ISO-8601ISO-8601 only, such as 2026-10-16T15:30:00-04:00 or 2026-10-16.
Epoch MillisecondsA number of milliseconds since 1970, as Brightspot dates are stored.
Epoch SecondsA number of seconds since 1970, fractions included, as a Slack message's ts is written.
PatternThe shape in Pattern.

A timestamp that carries an offset, or is an epoch number, already names a moment, so neither time zone setting changes how it is read.

Adjustments​

Each adjustment works on the calendar of Time Zone, so a day is the day as that zone sees it.

AdjustmentWhat it does
ShiftMoves the moment later (Add) or earlier (Subtract) by a whole Amount of a Unit, from seconds to years. Amount accepts a variable reference. A month after January 31 is the last day of February, and a day after 9:00 AM is 9:00 AM again, even across a daylight-saving change.
Snap ToMoves the moment to the start or end of the hour, day, week, month, quarter, or year it falls in. A week starts on Monday, and an end is the period's last millisecond, such as 23:59:59.999.
Set TimeMoves the moment to a Time of day on the 24-hour clock, such as 09:00, on the day it falls on.

For example, Shift by 1 week, Snap To the start of the week, then Set Time to 09:00 gives 9:00 AM on the coming Monday.

Outputs​

Timestamp writes the moment in a machine-readable Format:

FormatExample
ISO-8601 With Offset2026-10-16T15:30:00-04:00
ISO-8601 UTC2026-10-16T19:30:00Z
Date2026-10-16, the day as Time Zone sees it
Epoch Milliseconds1792179000000
Epoch Seconds1792179000
RFC 1123Fri, 16 Oct 2026 19:30:00 GMT

Pattern writes the moment in a Pattern of your own, in java.time's pattern letters: MMM d, yyyy writes Oct 16, 2026, and EEEE writes the day's name, such as Friday. Month and day names are written in Locale's language, or the server's when it is blank.

Style writes the moment the way Locale writes dates and times, with a Date Style and a Time Style from Short to Full, or None to leave one out. A Medium date and a Short time in English (United States) write Oct 16, 2026, 3:30 PM.

Part writes one part of the moment as a number, for a condition or a calculation: the year, the quarter (1 to 4), the month (1 to 12), the day of the month, week, or year, the hour (0 to 23), the minute, or the ISO week. The day of the week is 1 for Monday through 7 for Sunday. For a name, such as Friday, use Pattern instead.

Time Between writes the time between the moment and As Of as a whole number of a Unit, rounded toward zero. Since is how long ago the moment was, such as the days since content was last modified, and Until is how long until it comes, such as the days until an issue is due; a moment the other way is negative. Leave As Of blank to measure from now, the moment the mapping is resolved, or give it a variable reference to another timestamp, in any shape Automatic reads; one with no zone of its own is read in Time Zone. Days, months, and years follow the calendar of Time Zone.

WantRead AsAdjustOutput
A Jira timestamp in a Brightspot date fieldAutomaticTimestamp, Epoch Milliseconds
A publish date in a Slack messageAutomaticPattern MMM d, yyyy
An embargo that ends 30 days after publishingAutomaticShift by 30 daysTimestamp, ISO-8601 With Offset
Due at 9:00 AM next Monday, from the run context's NowAutomaticShift by 1 week, Snap To the start of the week, Set Time 09:00Timestamp, ISO-8601 With Offset
Days since content was last modifiedAutomaticTime Between, Since, days
A Slack message's ts for people to readEpoch SecondsStyle, Medium date, Short time
A spreadsheet's 09/18/2026Pattern MM/dd/yyyyTimestamp, Date

List​

Applies an Operation to a list as a whole. That is the difference between it and the transforms for single values: given a list of labels, Text lowercases each label, and List joins them into one piece of text. An operation that looks at items can look at a field of each instead, by a slash-separated Path, so a list of issues can be totaled by their story points or sorted by their due dates. An item without a value means an empty one: null, empty text, or an empty list or object. A value that isn't a list fails the step.

OperationWhat it doesProduces
Pick ItemPicks the first item, the last, or the one at a Position: 1 for the first, and a negative number counts from the end, -1 for the last. A position the list doesn't reach produces null.An item
CountCounts the items.A number
JoinJoins the items into one piece of text with Separator, , unless you change it, between them, and Final Separator, when given, before the last, so and makes bug, frontend and ux. Numbers and true or false are joined as their text, and items without a value are left out.Text
Extract From EachMakes a list of the value at Path in each item, such as each label's name. An item without one gives null in its place.A list
FilterKeeps or removes the items for which a Condition holds, testing each item, or the value at Path in it, against Compare To as a Conditional does, such as keeping the issues whose status equals Done.A list
SortOrders the items, by themselves or by the value at Path, Ascending or Descending. Numbers sort as numbers, timestamps as moments, and text alphabetically regardless of case. A list that mixes them puts numbers first, then timestamps, then text, and Descending reverses that. Items without a value go last, and items that tie keep their order.A list
Remove DuplicatesLeaves out each item that repeats an earlier one, by itself or by the value at Path, compared as a condition's Equals compares values. The first of each keeps its place.A list
SliceKeeps the first or last Count items, or skips the first Count and keeps the rest.A list
AggregateWorks out the sum, average, minimum, or maximum of the items, or of the value at Path in each. An item without a value is left out, and one that isn't a number fails the step. With no numbers at all, the sum is 0 and the others are null.A number

Map Values​

Looks the value up in a table of entries and replaces it with the Result of the first entry whose Match it equals. Use it where two systems name the same thing differently, such as a Jira priority of Highest and the Slack emoji :rotating_light: that should stand for it. A list has each of its items looked up in turn.

FieldDescription
EntriesThe table. Each entry has a Match, the value it stands for, and a Result, which takes that value's place. Result accepts a variable reference.
Ignore CaseWhether text matches an entry regardless of case.
When Nothing MatchesKeep the Value passes an unmatched value on unchanged, so the table need list only the values it changes. Use the Fallback replaces it with Fallback, and Leave It Empty replaces it with null.
FallbackShown when When Nothing Matches is Use the Fallback. Accepts a variable reference.

Text, and true or false, match a Match that reads the same. A number matches as a condition's Equals compares one, so 404 matches whether it arrives as a number or as text.

Number​

Reads the value as a number and applies an Operation to it. Text that is a number, such as 42 or -1.5, is read as one, but text with grouping, such as 1,234, isn't, since nothing in it says which character groups digits. Arithmetic is done in decimal, so 0.1 + 0.2 is 0.3, and a whole result comes out as a whole number. A list has each of its items worked on in turn, and a value that isn't a number fails the step.

OperationWhat it doesProduces
ArithmeticAdds, subtracts, multiplies by, or divides by an Operand, or gives the remainder of dividing by it. Operand accepts a variable reference. Dividing by zero fails the step.A number
RoundRounds to a number of Decimal Places, blank for a whole number, Nearest, Up, or Down. Nearest rounds a half away from zero, so 2.5 is 3. A negative number of places rounds to tens, hundreds, and so on.A number
LimitKeeps the number at least Minimum and at most Maximum, such as a page size an API caps at 100. Either can be blank, and either accepts a variable reference.A number
FormatWrites the number for people to read, as Locale writes numbers: Plain (1234.5, the same in every locale), Grouped (1,234.5), Percent (0.25 as 25%), Currency ($1,234.50, in Currency, such as EUR, or the locale's own), or Compact (1.2K). Decimal Places fixes the digits after the point.Text

Set Value​

Replaces the value with one you choose. A value typed as text is used as text, and a variable reference is used as the value it resolves to, whatever its type.

FieldDescription
ValueThe value to use. Accepts a variable reference. Leave it blank to set the value to null.
WhenAlways replaces every value. Only When Empty replaces only an empty value—null, empty text, or an empty list or object—and passes any other value on unchanged, which is how a mapping gets a default.

Set Value is what gives a Conditional's branches something to produce. For example, a Conditional that tests whether a status equals done can hold a Set Value of Published under Then and one of Draft under Else.

Text​

Reads the value as text and applies an Operation to it. A number is read as it is written, such as 3 rather than 3.0, and true and false as themselves. A list has each of its items worked on in turn, and an object fails the step, since it has no single way to read as text.

OperationWhat it doesProduces
Change CaseWrites the text in another Case: UPPERCASE, lowercase, Title Case, Sentence case, camelCase, snake_case, kebab-case, or Slug, as Brightspot writes a URL's slug. Title Case and Sentence case lowercase the letters they don't capitalize, so BREAKING NEWS becomes Breaking News.Text
Clean WhitespaceTrim Ends removes whitespace from both ends, Collapse Spaces also turns each run of whitespace inside into one space, and Remove All Spaces removes every whitespace character. Non-breaking spaces count as whitespace.Text
ReplaceReplaces Find with Replace With, every match or, with First Match Only, the first. Match As Text finds the text exactly; Regular Expression reads Find as a regular expression, and Replace With can name its groups, such as $1. Both accept variable references.Text
Extract MatchPicks out what a regular expression Pattern matches, such as the number in Fixes #482 with a Pattern of #(\d+) and a Group of 1. With All Matches, every match, as a list. Text with no match produces null, or an empty list.Text, or a list of text
TruncateCuts the text to a Max Length of characters or words, adding Suffix, … unless you change it, where it was cut. Counting characters, the cut falls between words where there is room for one, and the suffix counts toward the length. Text already short enough is unchanged.Text
Add TextAdds a Prefix before the text and a Suffix after it, such as # before a channel name. Both accept variable references.Text
SplitSplits the text into a list at a Separator: a comma, a semicolon, a line break, whitespace, or a Custom Separator of your own, as written. Each item is trimmed and empty ones are dropped, unless you turn on Keep Whitespace or Keep Empty Items.A list of text
Convert MarkupHTML to Plain Text flattens HTML, such as a rich-text field's, keeping a line break after each paragraph, heading, and list item. Markdown to HTML renders Markdown, leaving out anything that could run a script. Plain Text to HTML escapes the text and makes each block separated by a blank line a paragraph.Text
Encode or DecodePercent-encodes text for a URL, encodes it as Base64, or escapes it for HTML, or reads any of these back. Text that can't be read back fails the step.Text
MeasureCounts the text's characters, words, or lines. An emoji counts as one character.A number

Regular expressions run on RE2/J, as a condition's Matches Regex does, so no pattern can take longer than the text it reads warrants.

Combining transforms​

Each transform does one thing, and a mapping's transforms run in order, so most reshaping is a short chain:

WantTransforms
Jira labels as bug, frontend and uxList, Extract From Each name; Text, Change Case to lowercase; List, Join with a Final Separator of and
Unassigned when an issue has no assigneeExtract Path assignee/displayName; Set Value Unassigned, Only When Empty
A priority as an emojiMap Values with Highest to :rotating_light: and High to :warning:, keeping any other value
A search-result title from a headlineText, Clean Whitespace; Text, Truncate to 60 characters
A sprint's total story pointsList, Aggregate, the sum of fields/storyPoints
A label for a statusConditional, status Equals done, with Set Value Published under Then and Draft under Else

What a mapping's value is​

The variable picker shows an output mapping as the type its transforms produce, so a mapping that ends in an Extract Path shows the type of the field it extracts. A mapping whose transforms can't say what they produce, such as one ending in a Script, is offered without a type.

When a transform fails​

A transform that can't produce a value, such as a Date & Time given text that isn't a date, fails the step, and the mapping's trace on the step's Input or Output tab shows which transform failed and why. See Failure, retry, and the error path.

Was this page helpful?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.