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.
| Transform | What it does |
|---|---|
| Conditional | Tests the value and runs one of two lists of transforms, Then or Else, depending on the result. |
| Convert | Converts the value to text, a number, true or false, or between JSON text and the object it writes. |
| Date & Time | Reads the value as a date and time and writes it out in another form. |
| Extract Path | Picks a nested value out of an object by its slash-separated path, such as fields/summary. |
| List | Works on a list as a whole: picks, counts, joins, filters, sorts, or totals its items. |
| Map Values | Looks the value up in a table and replaces it with what the table maps it to. |
| Number | Reads the value as a number and works it out: arithmetic, rounding, limits, or writing it for people to read. |
| Set Value | Replaces the value, always or only when it is empty. |
| Text | Reads the value as text and changes it: its case, its whitespace, what it contains, its length, or its encoding. |
| Script | Runs 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.
| To | Converts |
|---|---|
| Text | A 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. |
| Number | Text that is a number, such as 42 or -1.5, to the number. |
| True or False | true 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 JSON | JSON text to the object, list, or other value it writes. A value that is already an object or a list passes on unchanged. |
| JSON Text | Any 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.
| Field | Description |
|---|---|
| Read As | How 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. |
| Pattern | Shown 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 Zone | The 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. |
| Adjust | Changes made to the moment before it is written, in order. See below. |
| Output | What to write. See below. |
| Input Time Zone | Under 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 As | Reads |
|---|---|
| Automatic | Any 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-8601 | ISO-8601 only, such as 2026-10-16T15:30:00-04:00 or 2026-10-16. |
| Epoch Milliseconds | A number of milliseconds since 1970, as Brightspot dates are stored. |
| Epoch Seconds | A number of seconds since 1970, fractions included, as a Slack message's ts is written. |
| Pattern | The 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.
| Adjustment | What it does |
|---|---|
| Shift | Moves 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 To | Moves 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 Time | Moves 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:
| Format | Example |
|---|---|
| ISO-8601 With Offset | 2026-10-16T15:30:00-04:00 |
| ISO-8601 UTC | 2026-10-16T19:30:00Z |
| Date | 2026-10-16, the day as Time Zone sees it |
| Epoch Milliseconds | 1792179000000 |
| Epoch Seconds | 1792179000 |
| RFC 1123 | Fri, 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.
| Want | Read As | Adjust | Output |
|---|---|---|---|
| A Jira timestamp in a Brightspot date field | Automatic | Timestamp, Epoch Milliseconds | |
| A publish date in a Slack message | Automatic | Pattern MMM d, yyyy | |
| An embargo that ends 30 days after publishing | Automatic | Shift by 30 days | Timestamp, ISO-8601 With Offset |
| Due at 9:00 AM next Monday, from the run context's Now | Automatic | Shift by 1 week, Snap To the start of the week, Set Time 09:00 | Timestamp, ISO-8601 With Offset |
| Days since content was last modified | Automatic | Time Between, Since, days | |
A Slack message's ts for people to read | Epoch Seconds | Style, Medium date, Short time | |
A spreadsheet's 09/18/2026 | Pattern MM/dd/yyyy | Timestamp, 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.
| Operation | What it does | Produces |
|---|---|---|
| Pick Item | Picks 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 |
| Count | Counts the items. | A number |
| Join | Joins 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 Each | Makes 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 |
| Filter | Keeps 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 |
| Sort | Orders 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 Duplicates | Leaves 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 |
| Slice | Keeps the first or last Count items, or skips the first Count and keeps the rest. | A list |
| Aggregate | Works 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.
| Field | Description |
|---|---|
| Entries | The 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 Case | Whether text matches an entry regardless of case. |
| When Nothing Matches | Keep 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. |
| Fallback | Shown 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.
| Operation | What it does | Produces |
|---|---|---|
| Arithmetic | Adds, 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 |
| Round | Rounds 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 |
| Limit | Keeps 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 |
| Format | Writes 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.
| Field | Description |
|---|---|
| Value | The value to use. Accepts a variable reference. Leave it blank to set the value to null. |
| When | Always 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.
| Operation | What it does | Produces |
|---|---|---|
| Change Case | Writes 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 Whitespace | Trim 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 |
| Replace | Replaces 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 Match | Picks 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 |
| Truncate | Cuts 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 Text | Adds a Prefix before the text and a Suffix after it, such as # before a channel name. Both accept variable references. | Text |
| Split | Splits 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 Markup | HTML 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 Decode | Percent-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 |
| Measure | Counts 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:
| Want | Transforms |
|---|---|
Jira labels as bug, frontend and ux | List, Extract From Each name; Text, Change Case to lowercase; List, Join with a Final Separator of and |
Unassigned when an issue has no assignee | Extract Path assignee/displayName; Set Value Unassigned, Only When Empty |
| A priority as an emoji | Map Values with Highest to :rotating_light: and High to :warning:, keeping any other value |
| A search-result title from a headline | Text, Clean Whitespace; Text, Truncate to 60 characters |
| A sprint's total story points | List, Aggregate, the sum of fields/storyPoints |
| A label for a status | Conditional, 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.