Transform node
What it does
The Transform node builds each output row from the incoming row: it maps fields to output columns, renames them, and fills columns with expressions such as CONCAT(first_name, ' ', last_name). It is the most used node in the flow builder.
The output row holds the mapped columns only. A Transform with no mappings passes rows through unchanged.
Transform (Legacy)
Some flows contain a Transform (Legacy) node. It is configured and runs exactly as a Transform does, with the same ports. It is not in the component browser. To replace one:
- Add a Transform node beside it.
- Recreate the same field mappings and custom fields.
- Move the incoming and outgoing edges to the new node.
- Run the flow, compare the output, then delete the legacy node.
When to use
- The target expects different columns from the source: renamed, fewer or extra.
- A value is derived from other fields, such as
fullNameorLOWER(country_code). - Rows need light clean-up before a Load: a dedupe on an external id, a simple filter, or a count per group.
Configure
The node panel
- Status: says the node is ready to run, or lists what needs fixing.
- Node name: the name shown on the card.
- Field mapping: how many mappings and custom fields the node has, and Configure Field Mapping, which opens the mapping editor.
- Advanced: notifications. It starts closed.
The mapping editor
Select the node and press Configure Field Mapping.
Input and output
- Input Node and Action: the node and action the input fields come from. When the upstream node has its own action, the Transform follows it and the picker is read-only. Set the action on that node.
- Output Actions: the action the output columns come from, usually the downstream Load's action, with the same rule.
- Output: the fields the target's write can fill. A read-only field a mapping writes stays listed, marked Read-only. Show read-only fields lists the rest.
After you clone a pipeline, point the cloned Source and Load at their actions. The Transform reads their current actions.
Schema source
Each side has a Schema Source: Connected Schema reads the fields from the node's action, and Imported Schema reads them from a sample you provide.
With Imported Schema, choose the Format: CSV, Tab Delimited, Other Delimited with a Delimiter, JSON, XML or XML Schema. Then either:
- Import schema: choose a file.
- Paste sample: paste the content, then select Use sample. A pasted sample can be up to 1 MB.
Both read the content the same way. The line below the buttons names the source and the field count, such as orders.json, Imported Schema, 12 fields or Pasted sample, Imported Schema, 12 fields. Replace imported schema imports again, and Clear imported schema returns the side to its connected schema.
Field mappings
Each mapping row has an input field, an output field, and an optional expression. Without an expression, the input value is copied as it is.
- Drag a field from the input list, or click Add.
- Auto Map by Name pairs fields with matching names. Clear Mappings removes every row.
- Three views:
Editorto edit rows,Rowsto review them read-only, andLinesto see the wiring between the two field lists. - Click a row's expression to open the expression editor: fields, variables and caches on the left, the expression with a live preview in the middle, and the function library on the right. A row with a problem shows a warning mark.
Custom fields add output columns with a fixed value, such as created_by = system.
Suggest mappings in the toolbar asks Milo for mappings once the input and output fields are both known. It uses AI credits. For a very wide schema, Milo leaves out fields that are neither mapped nor required first, and the assistant shows "Some fields were left out of Milo's suggestions." The Milo mapping assistant lists each suggestion with Apply suggestion, and Apply all adds every one. A suggestion marked Review matched by words or meaning rather than by name. Only fields the target's write can fill are suggested, and a source field that is already mapped is not suggested for a second field unless the build's goal sets it. While a Milo build is open, and on the Transform a saved Milo build made, a field the goal sets from a source field is suggested first, marked From the goal. Existing mappings to look at again lists mapped rows to check: a field the target sets itself, a field the goal sets from another source field, or a field another source field matches by name. Use maps the suggested source field instead. The assistant also lists required target fields that are not mapped yet, and reviews types. Suggestions are not saved until you save the Transform.
Output actions
Applied to the mapped rows, in this order:
- Filter output: keep rows where every rule holds. Rules compare a field with equals, not equals, contains, empty or not empty.
- Dedupe by key: one row per value of the Key field. When duplicates:
Keep firstorKeep last. - Group by: one row per combination of the group keys, with Aggregation
Count rowsin a__countcolumn.
Functions
Expressions can use:
| Kind | Functions |
|---|---|
| Text | UPPER, LOWER, TRIM, CONCAT, SUBSTRING, INDEX_OF, SPLIT, REPLACE, LENGTH, COALESCE |
| Logic | EQ, GT, LT, AND, OR, NOT, IF |
| Numbers | ADD, SUB, MUL, DIV, ROUND |
| Dates | NOW, TODAY, ADD_DAYS, ADD_MONTHS, PARSE_DATE, FORMAT_DATE |
| Other | UUID, VAR, SYS, CACHE_KEY, CACHE_GET, CACHE_VALUE, CACHE_HAS |
Calls can be nested, as in IF(EQ(status, 'active'), 1, 0). VAR reads a Variable; the CACHE_ functions read a Cache.
Ports
| Port | Direction | Kind | Notes |
|---|---|---|---|
in | in | data | Rows to shape. |
out | out | data | The shaped rows, in input order. |
error | out | control | Receives the input rows when the node fails. |
Salesforce targets
When the output action writes to Salesforce, each mapping is checked against the object's field metadata as you map. A row with findings shows a shield badge with a count; hover it for the detail. Saving is never blocked.
The checks read the object from the target node's saved action. Until that node has an action with an object, the sheet says so.
| Checked | Reported as |
|---|---|
| A target that cannot be written: a formula, an auto-number or a read-only field | Error |
| A field that cannot be set on insert, changed on update, or either on upsert | Error |
| An address or location field, which is mapped through its component fields | Error |
| A constant that is not in a restricted picklist | Error |
| A constant that is not in an unrestricted picklist, which Salesforce accepts as a new value | Warning |
| A picklist value that exists but is inactive | Warning |
| A dependent picklist value that cannot occur with the controlling field's value | Error |
| An encrypted field, whose value travels in clear and is encrypted on arrival | Warning |
| An upsert key field that Salesforce does not match on | Error |
| A required field with no mapping | Warning, above the rows |
Only constants you type, such as "Hot" or 42, are checked as values. A field reference or an expression is not known until the run.
If the field metadata cannot be read, the sheet says so once, and mapping and saving work as for any other connector.
Validate the whole mapping
When the target brings its own rules, a band above the mapping rows names the rule set and its rule count, with Rules, Validate mapping and a chevron to fold it.
Press Validate mapping for a full check:
- One line per rule:
Passed, or the number of findings and their rows. Click a line to read the findings. - Filters:
All,Errors,WarningsandPassed, each with a count. - Required fields with no mapping, each with a picker to map a source field in place.
- Fixes where one applies:
Change the target,Remove this mapping,Open the target node, or relate a lookup by a key field.
Each finding links to its row number. Rows are tinted red for an error and amber for a warning.
After you edit a mapping, the band says the results are out of date. Validate again to refresh them. Row badges stay live. Fixes that act on a row are disabled until you validate again, because inserting or deleting rows moves row positions.
The chevron folds the band until you open it again. The summary line still shows the last result.
Other rule states
Not reached: an earlier rule already decided the row. A read-only target is not also checked for insert access.Not run: nothing reported on the rule. When field metadata cannot be read, every rule that depends on it showsNot run.
Turn a rule off: Rules lists the target's rules with a switch each. A rule that is off does not run and shows no badges. The count beside Rules says how many are off. The choice is saved per Transform node. A row with no target, or a target mapped twice, is always reported.
Relate a Salesforce record by a key
Map a column to a Salesforce lookup field and the row gains a Lookup line in the Editor and Rows views:
- Related object: fixed when the lookup points at one object. Required when it points at several, such as
Task.WhoId. - Match on:
Record IDby default, or an external ID or indexed field of the related object.
For example, your source has an account external ID and no Salesforce account ID. Map that column to AccountId on a Contact target and set Match on to the account's external ID field. The target becomes Account.<your field>, and the account is found by your value during the run.
- With
Record ID, the column must hold a Salesforce ID. - With the Bulk API, Salesforce matches the records and reports per-row results.
- With the REST API, each key is looked up first. A key that matches no record, or several, is reported on that row and the row is not written. Other rows still load.
- An empty cell clears the relationship.
Examples
Rename and derive. Map first_name to FirstName, last_name to LastName, and add an output field FullName with the expression CONCAT(first_name, ' ', last_name).
Flag active accounts. Output field is_active with IF(EQ(status, 'active'), 1, 0).
Upsert to Salesforce without duplicates. Map ext_id to External_Id__c, then turn on Dedupe by key on External_Id__c with Keep last before the Load upserts on that field.
Troubleshooting
| Symptom | Cause | What to do |
|---|---|---|
| A column from the source is missing in the output | Only mapped columns are output. | Add a mapping for it. |
| An expression shows a warning mark | The expression has a syntax or field problem. | Open the expression editor and check the preview. |
| The input fields are read-only | The upstream node has its own action. | Change the action on that node. |
| Transform settings are not saved | The message names the reason, usually a connection the canvas does not allow. | Remove that edge on the canvas, then save. |
A Salesforce row shows Not run | The object's field metadata could not be read. | Set an action with an object on the target node. |