# Change Fields

> Rename, add and drop fields on a record so the next step gets exactly the shape it expects.

**Change fields** reshapes a record on its way between two steps. Rename a field the receiving system calls something else, add one it needs, drop the ones it should never see.

> Dock: Data · Change · Takes: a record · Returns: the changed record

It is the step that saves you from writing code purely to move data from one shape into another.

> **Transforming single fields inline?** If you only need to clean, uppercase, format, or extract a specific field value before passing it to a downstream step, use [Data Transformation](/build/core-concepts/data-transformation) (e.g. `{{ 3.company | trim | upper }}` or `{{ 3.users | pluck:email }}`). Use the **Change fields** canvas step when reshaping entire records (renaming, adding, and dropping multiple keys simultaneously).

## Three passes, in a fixed order

The step runs three passes, always in this order.

| Pass              | When it runs | What it does                                          |
| ----------------- | ------------ | ----------------------------------------------------- |
| **Rename fields** | First        | Each row gives a field's current name and its new one |
| **Set fields**    | Second       | Each row sets a field to a value                      |
| **Remove fields** | Last         | Each row names a field to leave out of the result     |

Because renaming happens first, **a Set row can write to a name that only exists because a Rename above created it**. And because removal happens last, a field you set can still be removed in the same step. That suits a value you need briefly and do not want to pass on.

## Setting it up

### Add the step

Open **Tools** in the dock and choose **Change fields** under Data.

### Point it at a record

**Start from** takes the record you want to change, normally a reference to an earlier step such as `{{ 3 }}`.

### Rename what needs renaming

Under **Rename fields**, add a row per field: its current name, then the name it should have. **Add Row** for each one.

### Set what needs setting

Under **Set fields**, add a row per field with its value. The value can be a reference, so `{{ 1.email }}` or `{{ $today }}` both work.

### Remove what should not travel on

Under **Remove fields**, name any field to leave out: usually an internal identifier, or a large blob you do not want carried into the next step.

## What it passes on

The changed record itself, with your renames, sets and removes applied. Fields sit at the top level, so a downstream step reads them directly:

```
{{ 4.firstName }}
{{ 4.greeting }}
```

Everything you did not mention travels through unchanged, keeping its type.

## Examples to copy

### Match a CRM's field names

An enrichment API returns `company_name` and `employee_count`, but your CRM expects `Company` and `Headcount`.

**Start from:** `{{ 3.ret }}`. Two **Rename** rows: `company_name` → `Company`, `employee_count` → `Headcount`. Nothing else needed.

### Stamp a record before storing it

**Set fields:** `processedAt` = `{{ $now }}`, `source` = `Website form`, `workflowUrl` = `{{ $workflow_url }}`.

The last one gives whoever finds the record later a link straight back to the workflow that wrote it.

### Cut a record down before sending it on

An app returns fifty fields and the next system wants six.

Use **Remove fields** for the big ones: the raw HTML of an email, an attached
file, an internal id nobody downstream reads. A smaller record moves between
steps faster and stays under the size a run may carry.

### Rename, then build on the new name

**Rename:** `first_name` → `firstName`. **Set:** `greeting` = `Hi {{ 3.first_name }}`.

The rename gives downstream steps the tidy `firstName`; the greeting is built from the source step's value. A `{{ }}` reference always reads an earlier step's stored output: a step cannot reference its own result while it is still being made.

## What's Next?

- 👉 **[Workflow Data & Mapping →](/build/core-concepts/workflow-data)**: understand how values move from one Step to the next.
- **[Parse JSON](/build/action-steps/parse-json)**: turn a JSON string into a record you can reshape.
- **[AI Data Transform](/build/ai-features/ai-transform)**: reshape unstructured content when there are no fixed fields to select.
