Guides
Transformations
Reshape a request body before delivery with a reusable, declarative mapping.
A transformation reshapes the JSON body of an event before it is delivered. Use it to send a service only the fields it needs, rename them, mask sensitive values, or reduce a large vendor payload to a stable shape you control.
Transformations are declarative: they are data, not code. There is nothing to deploy or sandbox, and the same mapping runs in the dashboard preview and in the delivery path.
Anatomy of a transformation
{
"name": "invoice-paid-summary",
"keep": false,
"fields": [
{ "key": "customer", "value": "data.object.customer" },
{ "key": "amount", "value": "data.object.amount_paid | divide: 100" },
{ "key": "currency", "value": "data.object.currency | upper" },
{ "key": "email", "value": "data.object.customer_email | lower | mask: 6" },
{ "key": "summary", "value": "\"Invoice {{data.object.number}} paid\"" },
{ "key": "event.id", "value": "$event.id" }
],
"remove": []
}
keep: whentrue, the output starts as a copy of the original body; otherwise it starts empty.remove: paths to delete from the output.fields: values to set, in order. Akeyis a dotted path, soevent.idproduces{ "event": { "id": … } }.
Values
A value is one of:
| Form | Example | Meaning |
|---|---|---|
| Path | data.items[0].sku |
A path into the body. [-1] is the last element; [*] collects from every element. |
| Special | $headers.x-request-id, $event.id, $event.created_at, $source.name, $body |
Request headers, event metadata, the source name, or the whole body. |
| Literal | "paid", 42, true, null |
Used as written. |
| Template | "Order {{data.id}} for {{data.email}}" |
Expressions inside {{ }} in a string. |
A path that isn’t present produces null.
Filters inside values
Pipe a value through filters, left to right: data.email | lower | default: "n/a".
| Filter | What it does |
|---|---|
lower, upper, trim |
Change case or trim whitespace. |
string, number, boolean, json |
Convert the type. |
default: x |
Use x when the value is empty or missing. |
join: ",", split: "," |
Convert between arrays and strings. |
replace: "a", "b" |
Replace text. |
first, last, length, compact |
Work on arrays and strings. |
sum, round: n, times: n, divide: n |
Arithmetic. |
mask: n |
Replace all but the last n characters with *. |
date |
Convert seconds, milliseconds or a date string to ISO 8601. |
Create and use one
- In the dashboard open Transforms → New transform, paste a sample body (or use the source’s last request), and build the mapping with a live preview.
- Attach it to a flow with
transform_id.
curl -X POST https://api.getensue.com/v1/transforms \
-H "authorization: Bearer ens_<key>" -H "content-type: application/json" \
-d '{ "name": "invoice-paid-summary", "keep": false,
"fields": [{ "key": "customer", "value": "data.object.customer" }] }'
Transformations are reusable. Editing one changes every flow that uses it, from the next attempt. A transformation that a flow still uses cannot be deleted (409 in_use).
Limits and failure
| Limit | Value |
|---|---|
| Fields | 100 |
| Removed paths | 50 |
| Output size | 1 MB |
A body that isn’t JSON cannot be transformed. The event fails with a transform error and is not delivered, and the timeline says why. A transform failure says nothing about your service, so it does not count towards the circuit breaker.