Using the Transform Data Native Action
data transformation, such as converting data into specific formats, has traditionally required expertise in python or jsonata however, with swimlane turbine, you can achieve these tasks easily using the transform data native action within a playbook, without the need for complex coding overview the transform data native action allows you to modify and manipulate data efficiently within your playbooks whether you need to reformat, extract, or combine data, this action provides a user friendly interface to achieve these tasks, enabling seamless automation without requiring advanced coding skills key benefits of the transform data action no coding required perform complex data transformations without writing python or jsonata code visual transformation builder a user friendly interface that simplifies data manipulation explicit block inputs each block lists inputs in a dedicated inputs area (the same idea as the script action) you declare what data the block can use, then reference those inputs from the basic (no code) first / then steps or from the advanced expression mark individual inputs as sensitive using the lock icon next to each input when required test runs and discovered types you can test a block, inspect the result, and discover the output type (including complex objects) so downstream blocks and actions are not limited to a generic dynamic label at design time outputs tab an outputs tab lets you review action outputs, see what was discovered from tests, and mark outputs as sensitive error outputs for downstream mapping when a block fails, its error message is available as a playbook property you can map into later actions (similar to script action errors) block workflow configuration uses a large format dialog on an inputs tab, with expand and collapse on blocks, reorder by drag and drop when you need to, and optional block descriptions each block has inputs and transformation areas; the test panel opens from a test control in the block header when you need it duplicate , delete , switch to advanced , and test sit on the block header transformation types show descriptions in tooltips when you browse the list versatility supports various transformation types to cater to different data processing needs efficiency streamlines data handling processes, reducing the time required to implement transformations when to use transform data the transform data action is essential whenever you need to modify, extract, or reformat data within your playbook common scenarios include data format conversion parsing json strings from record triggers, record searches, or http responses into json objects converting date/time formats between different representations (unix timestamps, iso 8601, custom formats) converting data types (numbers to strings, arrays to objects, and so on) parsing structured formats like csv, xml, or yaml into javascript objects data extraction and navigation extracting nested properties from complex json objects using jsonata paths accessing deeply nested data structures that require path based navigation plucking specific fields from arrays of objects data filtering and aggregation filtering arrays based on specific criteria or conditions aggregating data (sum, average, min, max) from arrays or object properties removing duplicates or unwanted items from arrays sorting data by value or by object properties data manipulation combining or merging data from multiple sources splitting strings into arrays or arrays into smaller chunks transforming string formats (case conversion, padding, encoding/decoding) normalizing data to ensure consistent formats across different sources data preparation for downstream actions preparing data for http requests, record creation, or other actions that require specific formats transforming api responses into formats suitable for record fields normalizing data from different sources before combining or comparing how transform data integrates the transform data action seamlessly integrates with other playbook components, allowing you to access data from various sources and pass transformed data to downstream actions accessing playbook data at runtime, a playbook still surfaces data from the usual places (playbook inputs, other actions, loops, variables, and so on) using expression paths such as $inputs and $actions as documented in your playbooks in transform data configuration, you connect that data to a block by defining block inputs in the inputs panel for the block, then referencing those inputs by name from each first / then step in basic mode, or from the jsonata editor in advanced mode in advanced mode, add playbook property and add expression under the code editor add the inputs row and insert the path in one step the data is declared in the inputs list and referenced in the steps data flow in playbooks transform data fits into the playbook execution flow as follows input stage each block receives playbook data through what you declare in that block’s inputs list (mapped from playbook inputs, previous actions, published values, loops, variables, and so on) runtime paths such as $inputs and $actions are unchanged; the configuration surface makes the mapping explicit transformation stage the action processes data through transformation blocks each block executes sequentially transformations within a block chain together (first → then → then ) multiple blocks can process different aspects of the data output stage transformed data is available for downstream actions and blocks in the same playbook reference block results directly; you do not need to promote outputs for in playbook use output promotion expose selected outputs outside the current playbook (for example when playbook a calls playbook b and must read playbook b’s promoted outputs) variables transformed data can be stored in variables record operations transformed data can be used in create record, update record, or search records actions integration with other actions transform data commonly integrates with record triggers parse json strings from record field values before processing http request transform api responses into usable formats search records process and filter search results create/update records prepare data in the correct format for record fields condition actions transform data before evaluating conditions loop actions transform data within loop iterations variable actions store transformed data in variables for later use referencing transform outputs each transformation block produces a result that downstream actions and blocks in the same playbook can use without extra promotion reference a block output with $actions transformationactionname result blockname replace transformationactionname with the action’s name in the playbook and blockname with the block key (for example block 1 ) the outputs tab lists action outputs, shows which ones were discovered (for example from a test), and lets you mark outputs as sensitive reference transformation errors in downstream actions when a transform data block fails, turbine stores error details on the playbook run for that action and block you can map those values into downstream action inputs the same way you reference script action error output item detail when it applies a block fails during a playbook run (expression error, validation failure, or an intentional $error / $assert in advanced jsonata) where to look in the run open the failed block in the run view to see the error message (including custom messages from $error or $assert ) property path pattern $actions \<transformationactionname> error \<blockkey> — for example $actions transformdata error block 1 message typical fields message (required), and when available code or position for expression errors replace transformationactionname with the action name in the playbook and blockkey with the block key (for example block 1 ) example workflow add a transform data action with an advanced block that validates input and calls $error("missing required field email") when validation fails add a downstream action (for example create record or http request ) that should run only on failure, or that needs the error text in a field or body in the downstream action, map an input from $actions \<transformactionname> error \<blockkey> message for writing expressions that emit custom errors, see advanced transformations https //app archbee com/docs/wdlpsa7glls1ghfgxbo9d/0ubu 8ysqibtset8swiwp#handle errors with error and assert output promotion output promotion is for making playbook data available outside the current playbook, not for wiring the next action on the canvas for example, when playbook a invokes playbook b, playbook a can consume outputs that playbook b promoted at the playbook level when your environment supports promoted outputs for native actions, use promote on a block or output to expose it at the playbook boundary promoted outputs follow the promotion model used elsewhere in turbine (canvas and classic) entrypoint configuration each transform data action has an entrypoint that determines which transformation block executes first this allows you to control the order of transformation execution create multiple transformation paths organize complex transformations into manageable blocks how transform data works the transform data native action uses a block based transformation system where transformations are organized into blocks , and each block contains one or more transformation operations that are executed sequentially understanding transformation blocks each transformation block consists of header and metadata a title (for display), a stable key (for references and result paths), and an optional description you can use to document intent inputs a defined list of the data this block is allowed to use, shown in the inputs area for the block transformation the first / then chain in basic mode, or the jsonata code editor in advanced mode test optional test panel (toggle test in the block header) for test data, a test run, result , and discovered outputs for the block transformations are chained together, with each transformation receiving the output from the previous one this allows you to build complex data transformations by combining multiple simple operations key concepts block based structure transformations are organized into blocks that you can rename, duplicate, drag to reorder (updating the block chain), or delete sequential execution transformations within a block execute in order (first → then → then ) data flow the output of one transformation becomes the input for the next transformation multiple blocks you can create multiple transformation blocks, each processing different aspects of your data sensitive data you can mark individual inputs as sensitive (lock icon) so values are protected consistently the outputs tab supports marking outputs as sensitive as well setting up the transform data native action you have already created your playbook, and you are ready to transform data use the following steps to open transform data configuration and build blocks from the add panel, drag the transform action onto the playbook canvas open transform data and select configure the configuration opens in a large format dialog on the inputs tab, which lists your transformation blocks in order each block is laid out in three areas area purpose inputs declare properties the block can use ( + add property ) mark inputs as sensitive with the lock icon transformation build the first / then chain in basic mode, or the code editor in advanced mode test open from the test control in the block header (collapsed by default) provide test data ( custom json or a previous run ), run test , view result or discovered outputs , and use copy inputs to editor when you want the current test payload in the editor work with blocks add blocks use create your first block (when the list is empty) or add block to add another block each block is one chain of transformations reorder blocks use the drag handle in the block header to drag and drop blocks into the order you want execution still follows the linked entrypoint and next block chain as defined in your playbook; reordering updates that chain when you apply changes block header the header shows the block title (click the title or the edit control to change it, then save ) use duplicate to copy a block, or the delete control to remove a block test panel click test in the block header to show or hide the test panel for that block the panel starts hidden so inputs and transformation use the full block height until you open it switch to advanced when the block is expanded , choose switch to advanced in the block header a confirmation asks are you sure you want to switch to advanced mode? switching is irreversible for that block; existing basic steps are converted click confirm to continue or cancel to stay in basic mode see advanced transformations https //app archbee com/docs/wdlpsa7glls1ghfgxbo9d/0ubu 8ysqibtset8swiwp code editor configuration in advanced mode, open code editor configuration to toggle show line numbers , show expand/collapse arrows , and show fold gutter , and to choose a theme (for example dracula, monokai, or eclipse) block key and optional description below the title, the block’s key (snake case) identifies it for references and result paths use the lock control to edit the key renaming a key can break existing references in the transformation area, you can add an optional block description (for example, what this block is for) above the first / then steps expand and collapse blocks can be collapsed to move through long chains faster with multiple blocks, they typically start collapsed ; with a single block, the product typically keeps it expanded by default collapse also makes drag and drop reordering easier explicit inputs vs transformation steps use the inputs area to declare data the block is allowed to use you can add inputs manually for an existing action, any stored block data appears in this list so you can see and edit it reference those inputs from the transformation fields per input sensitive mark specific inputs as sensitive using the lock icon next to the input if you apply changes and return later, the block title you see may stay as saved until you edit it again use the title or edit control, then save the block key is edited separately via the lock control and governs how the block is referenced in expressions and result paths renaming a block key can break downstream actions if the block is referenced elsewhere in the playbook a warning dialog can appear to remind you of that risk configuring the transformation (basic / no code) in each block, you first wire inputs , then build the first / then chain inputs in the inputs section for the block, add or review the data this block is allowed to use for an existing action, the same data that is stored in the block’s data in the playbook definition appears in this list so you can see and edit it in one place first row open select a transformation and pick a type descriptions for each function appear in tooltips when you hover the options in the list for each parameter, you can use a literal value (for example type a number directly), or use a control (often a dropdown ) to pick which declared input to use the list filters as you type, and you can use keyboard navigation to move through choices then rows use create your first transformation (when the block has no step yet) or transform again to add another step the next row is then and uses the output of the step above objects and arrays you can add object or array typed properties to the inputs reference them in parameters using the full path with dot notation or bracket notation where the product provides it, including nested properties from discovered complex outputs in another block tip if a value comes from a json string on a record field, use parse json in the chain (with the right input wired) before other steps that expect an object configuring the transformation (advanced / jsonata) in advanced mode, wire inputs and write jsonata in the code editor see advanced transformations https //app archbee com/docs/wdlpsa7glls1ghfgxbo9d/0ubu 8ysqibtset8swiwp for expression syntax, $error / $assert , and code editor configuration shortcut use when + add property (inputs area) you want to declare inputs manually, then type paths in the editor add playbook property (under the code editor) you want to pick playbook data from the drawer; turbine adds the inputs row and inserts the path at the cursor add expression (under the code editor) you want to enter a playbook expression; turbine adds the inputs row and inserts the path at the cursor when you rename or delete an input in the inputs panel, turbine updates matching references in the jsonata expression when you edit the expression only, remove unused inputs rows yourself test a block and work with discovered outputs in product testing is available for a single block at a time click test in the block header to open the test panel if it is hidden test run test to execute the current block you can resize the test area if needed the result tab shows the output (for example a number or object) use copy inputs to editor to copy the current test inputs into the editor previous run when available, choose a previous playbook run so the inputs for that block load from that run custom json if the inputs are empty (for example a default empty object ), choosing custom json from the dropdown can load a shape based on the current inputs and set default values by type discovered outputs after a successful test, open the discovered outputs tab to see output types (not only “dynamic” in the model) add those findings to the block’s known outputs , including complex objects and nested properties, so a downstream block can reference a prior block’s output with a known type in the input picker outputs tab the outputs tab (at the action level) gives you a single place to see outputs for the action, mark them sensitive , and see which outputs were discovered from tests input sensitivity is configured in each block’s inputs area, not on this tab backward compatibility and cleanup existing playbooks opening an existing transform data action shows the same underlying data in the inputs list, including any values that are stored in each block’s data in the playbook and values you added through add playbook property , add expression , or manual + add property input rename and delete (advanced mode) when you rename or delete an input in the inputs panel, turbine rewrites matching paths in the jsonata expression (deleted inputs appear as $deleted in the code) removing a reference in code only if you delete a reference by editing the expression and do not change inputs , the product does not remove the matching row from the inputs list remove the input yourself when it is no longer needed attachments attachments are unchanged you do not upload new static files inside transform data use a playbook property that already carries the attachment and pass it through broader file based batch processing is tracked as a separate feature area available transformations the transform data action provides a wide range of transformation functions organized by category the following transformations are available from select a transformation ; hover an option in the list to read its tooltip description in the product array transformations average calculate the average value of numeric array elements returns the mean of all numeric values in the array average by calculate the average value of a plucked property of objects within an array of objects uses a jsonata path to extract the property values before calculating the average count if count all items of an array that are equal to a specific value returns the number of matching elements count if by count all items of an array of objects that contain a plucked property equal to a specific value uses a jsonata path to access the property for comparison filter filter an array to the values that match a regular expression, a specific value, or non null value supports both exact matches and regex patterns filter by filter an array of objects to those that contain a property or deeply nested property whose values match a regular expression, a specific value, or non null value uses a jsonata path to access the property flatten flatten an array containing potentially nested arrays to a single array removes one level of nesting force array wrap a value in an array if it is not already an array ensures the output is always an array type get at get the item of an array at a specific index supports negative indices (for example, 1 for the last item) maximum find the maximum value in an array of numbers returns the largest numeric value maximum by find the maximum value of a plucked property of the objects within an array of objects uses a jsonata path to extract property values mean compute the mean of the values in an array of numbers calculates the arithmetic mean mean by compute the mean of the values plucked from objects within an array of objects uses a jsonata path to extract values minimum find the minimum value in an array of numbers returns the smallest numeric value minimum by find the minimum value of a plucked property of the objects within an array of objects uses a jsonata path to extract property values prepend get an array containing the value or array of values of the second input followed by the value or array of values of the first input combines arrays or prepends values remove duplicates remove duplicate items from an array returns a new array containing unique values only remove item remove all instances of an item from an array filters out all occurrences of the specified item slice get the subarray of items that exist between the specified starting and ending indices of an array extracts a range of elements sort sort the items of an array of strings or numbers by value supports ascending and descending order with locale aware comparison sort by sort the items of an array of objects by the value of a plucked property of the objects within the array uses a jsonata path to determine sort order sum sum the values of an array of numbers returns the total of all numeric values sum by sum the values of a plucked property of the objects within an array of objects uses a jsonata path to extract property values before summing date and time transformations adjust date / time adjust an iso 8601 date/time or a unix epoch by adding or subtracting a specified amount of time supports operations (adding/subtracting), amount, and units (milliseconds, seconds, minutes, hours, days, weeks, months, years) returns the adjusted timestamp in iso 8601 format append time zone append or overwrite the time zone or offset of an iso 8601 date/time without adjusting the underlying date/time useful for adding timezone information to dates that lack it convert date / time convert an iso 8601 date/time or a unix epoch to an iso 8601 date/time, custom formatted date/time, or a unix epoch supports output formats iso 8601, unix (seconds), unix (milliseconds), sql, or custom format string get date / time parse a date/time and convert it to an iso 8601 date/time can get the current time or parse a date/time from playbook data supports various input formats (iso 8601, unix, sql, custom) and timezone handling set time zone set the time zone or offset of an iso 8601 date/time, adjusting the underlying date/time accordingly converts the date/time to the specified timezone to iso date convert an iso 8601 date/time or a unix epoch to an iso 8601 date extracts only the date portion, discarding the time component to iso time convert an iso 8601 date/time or a unix epoch to an iso 8601 time extracts only the time portion, discarding the date component numeric transformations absolute value compute the absolute value of a number returns the non negative value of the input number adjust adjust a number by adding, subtracting, multiplying by, dividing by, or computing the modulo with another number supports basic arithmetic operations ceiling adjust a number by rounding it up (ceiling) rounds up to the nearest integer or specified precision floor adjust a number by rounding it down (flooring) rounds down to the nearest integer or specified precision greater than check if the first number is greater than the second returns a boolean value greater than or equal check if the first number is greater than or equal to the second returns a boolean value in range check if a number is between two values, non inclusive of the ending value determines if a value falls within a specified range less than check if the first number is less than the second returns a boolean value less than or equal check if the first number is less than or equal to the second returns a boolean value random generate a random number between inclusive lower and upper bounds can generate either floating point or integer values round adjust a number by rounding it rounds to the nearest integer or specified precision object transformations deep flatten deeply flatten an object converts nested object structures into a flat structure with dot notation keys deep merge deep merges two given objects combines objects recursively, with values from the second object taking precedence extract property extract the value of a property or deeply nested property of an object uses a jsonata property path to navigate through nested structures (for example, user profile email or $ data items\[0] name ) get keys list the keys of a given object returns an array containing all property names of the object get values list the property values of a given object returns an array containing all property values of the object is equal perform a deep comparison between two values to determine if they are equivalent returns true if values are deeply equal, false otherwise pick properties create an object composed of the picked properties selects specific properties from an object to create a new object remove property remove a property on an object supports nested property paths using dot notation returns a new object with the specified property removed stringify convert an object into stringified form converts the object to a json string representation string transformations base64 decode convert a string from base 64 representation decodes base64 encoded text with optional character encoding specification base64 encode convert a string to base 64 representation encodes text to base64 with optional character encoding specification (default utf 8) camel case convert a string to camel case transforms text to camelcase format (for example, "hello world" → "helloworld") capitalize convert the first character of a string to upper case and the remaining to lower case capitalizes only the first letter contains determine if a string contains at least one occurrence of a search term supports case sensitive and case insensitive matching returns a boolean value defang replace and/or surround certain characters in a string to render it unactionable (for example, non clickable) used for security purposes to prevent accidental execution of urls, ips, and similar values ends with check if a string ends with another returns true if the string ends with the target value evaluate expression parse and evaluate a string containing literal json or a jsonata expression allows you to execute complex jsonata expressions for advanced transformations hash compute the hash of a value supports multiple hash algorithms including md5, sha1, sha224, sha256, sha384, sha512, and sha3 variants returns the hashed value in hexadecimal format levenshtein distance find the edit/levenshtein distance between two strings calculates the minimum number of single character edits needed to transform one string into another match find occurrences of a search term in a string and returns an array of all indices where the search term is located supports case sensitive and case insensitive matching pad pad a string on the left and right sides if it is shorter than length padding characters are truncated if they cannot be evenly divided by length pad end pad a string on the right side if it is shorter than length adds padding characters to the end of the string pad start pad a string on the left side if it is shorter than length adds padding characters to the beginning of the string parse json convert stringified json text to a json value parses a json string into a javascript object that can be used in subsequent transformations refang restore a defanged string to its original value to re render it actionable (for example, clickable) reverses the defang operation repeat repeat a string n times creates a new string by repeating the input string the specified number of times replace find occurrences of a search term in a string and replaces each occurrence with another string supports case sensitive and case insensitive replacement with global replacement by default split find occurrences of a delimiter in a string and splits the string into an array of substrings for each occurrence divides a string into an array based on the delimiter starts with check if a string starts with another returns true if the string begins with the target value strip remove all whitespace (tabs, spaces, and newlines) from both the left and right side of text spaces in between words will not be removed url decode convert url safe characters in a given string to url unsafe characters decodes url encoded strings (for example, "%20" → " ") url encode convert url unsafe characters in a given string to url safe characters encodes strings for use in urls (for example, " " → "%20") uuid v4 generate a v4 universally unique identifier (uuid) creates a random uuid following the uuid v4 specification regular expression transformations contains check if a string contains at least one occurrence of a regular expression pattern supports regex flags ('i' for ignore case, 'm' for multiline) returns a boolean value match find occurrences of a regular expression pattern in a string and returns an array of the matched strings can return either matches or capture groups, with optional limit on number of matches match one find the first occurrence of a regular expression pattern in a string and returns the matched string returns the first match or an empty string if no match is found replace find occurrences of a regular expression pattern in a string and replaces each occurrence with another string supports regex flags and optional limit on number of replacements split find occurrences of a regular expression pattern in a string and splits the string into an array of substrings for each occurrence uses regex pattern as delimiter with optional limit value transformations from csv parse a csv string converts csv text into an array of objects (if headers are included) or an array of arrays supports header detection from xml parse an xml string converts xml text into a javascript object using compact format from yaml parse a yaml string converts yaml text into a javascript object is array check if a value is an array returns true if the value is an array, false otherwise is blank determine if a value is an empty string, array, object or falsy returns true for empty values, null, undefined, empty strings, empty arrays, or empty objects is empty determine if a value is an empty string, array, or object similar to is blank but excludes boolean false from being considered empty is null or undefined check if a value is null or undefined returns true only for null or undefined values is object check if a value is an object returns true if the value is an object (but not an array), false otherwise is string check if a value is a string returns true if the value is a string type, false otherwise to csv serialize a value to csv converts an array of objects to csv format with headers to xml serialize a value to xml converts a javascript object to xml format using compact representation to yaml serialize a value to yaml converts a javascript object to yaml format examples create any block inputs you need before you bind first / then parameters the steps below focus on the transformation chain itself example 1 extracting data from a json object scenario you receive data in json format and need to extract specific fields for further processing drag and drop the transform data action onto the playbook canvas configure the transformation to extract the desired data first if your data is a json string, select parse json from the transformation type drop down to convert it to a json object then select extract property and provide a jsonata path to navigate to the specific json fields (for example, $ user name or user email ) output the extracted data is ready for subsequent actions example 2 combining array values scenario combine multiple values from an array into a single string or combine two arrays drag and drop the transform data action configure the transformation first select prepend from the transformation type drop down to combine arrays or values then provide the values or arrays you want to combine alternative for string concatenation, you can use evaluate expression with a jsonata expression like $join(\[first name, last name], " ") to combine strings with a separator output combined values or arrays ready for use example 3 converting date formats scenario convert a date from one format to another (for example, from unix timestamp to iso 8601, or from custom format to iso 8601) add the transform data action to the playbook configure the transformation first select get date / time from the transformation type drop down to parse the date from your data source then select convert date / time and specify the output format (for example, iso 8601, unix seconds, unix milliseconds, sql, or custom format) output the date converted to the desired format example 4 filtering array elements scenario filter an array to include only items that meet specific criteria (for example, users older than 18, or strings containing a specific pattern) use the transform data action configure the transformation first select filter from the transformation type drop down to filter by value or regular expression then provide the filter value or pattern for filtering objects by property values, use filter by and specify the jsonata path to the property (for example, age ) and the filter value (for example, 18 ) output an array containing only items that match the filter criteria example 5 parsing json strings scenario you have a json string from a record trigger or record search that needs to be parsed into a json object for further transformation drag and drop the transform data action configure the transformation first select parse json from the transformation type drop down to convert the json string to a json object then apply additional transformations as needed (for example, extract properties, filter, and so on) output the json string is converted to a json object that can be used in subsequent transformations example 6 adjusting date/time values scenario add or subtract time from a date (for example, add 5 days, subtract 2 hours) drag and drop the transform data action configure the transformation first select get date / time from the transformation type drop down if starting from a data source, or use an existing date value then select adjust date / time and specify operation adding or subtracting amount the number of time units unit milliseconds, seconds, minutes, hours, days, weeks, months, or years output the adjusted date/time in iso 8601 format best practices start simple begin with basic transformations and progressively add complexity as needed test blocks use the test flow for a block when you need to validate jsonata or no code steps, discover output types, and align downstream inputs keep track of changes document the purpose and expected outcome of each transformation block for easier maintenance avoid overcomplicating use clear and straightforward transformations to ensure maintainability use parse json first when working with json strings from record triggers or searches, always use parse json as the first transformation before extracting properties or performing other operations chain transformations leverage the then functionality to chain multiple transformations together, building complex transformations from simple operations quoting rules for string parameters transformation expressions use jsonata, which requires double quotes ( " ) for all string values single quotes ( ' ) are not supported and will cause the transformation to fail silently or produce unexpected results always use double quotes for string parameters in transformation expressions single quote escaping ( \\' ) is not valid in jsonata correct usage expression result or notes $stringcapitalize("hello world") produces hello world $stringcapitalize("this is a 'test'") apostrophes inside the string are fine only the outer delimiters must be double quotes $stringcapitalize("this is a \\"test\\"") type \\" inside the string to include a literal double quote in the value incorrect usage expression problem $stringcapitalize('hello world') single quotes are not valid jsonata string delimiters an argument that uses single quotes ( '…' ) as the string delimiters not valid in jsonata use double quoted strings only, and use \\" for a literal double quote inside the value if you need to include literal single quotes inside a string, wrap the entire string in double quotes single quotes do not need escaping when they appear inside a double quoted string, for example "this is a 'test'" this quoting rule applies to both basic (no code) and advanced (jsonata) transformation modes for more information on advanced transformations, see advanced transformations https //app archbee com/docs/wdlpsa7glls1ghfgxbo9d/0ubu 8ysqibtset8swiwp use cases for more practical applications, explore the transform data action use cases https //docs swimlane com/transform data action use cases