Transformations
Transformations reshape a captured payload before it is replayed or forwarded. Write a JSONata expression, attach it to an endpoint, and route which transformation fires to which target. One webhook can become several differently-shaped requests, each going where it belongs.

Authoring a transformation
Open an endpoint and find the Transformations section. Choose Add transformation, then Create transformation. Give it a name and write a JSONata expression that maps the incoming payload to the shape you want. Transformations are scoped to the endpoint they are created on.
Example
Inside a transformation the captured request is available as $body, $headers, and $query (and project secrets as $secrets). Reshape an incoming payment webhook into a lean internal record:
{
"orderId": $body.data.order_id,
"email": $lowercase($body.data.customer_email),
"amount": $body.data.amount / 100,
"currency": $body.data.currency,
"paidAt": $body.data.created
}Versions
Every change snapshots a new version (copy on write). A replay or forward always runs against the version the binding was built on, so editing a transformation never silently changes how past or in-flight routes behave.
Routing (bindings)
Transformation routing connects a transformation to a target with a predicate. When a capture matches the predicate, that transformation fires and the result is sent to the bound target. Bindings run automatically on matching captures.
Fan-out
A single capture can match multiple bindings. When it does, each binding produces its own transformed execution, so one webhook can forward to several targets in several shapes at the same time. This pairs with auto-forward fan-out and Secrets for target headers.
See Auto-forward & targets and Secrets.
Limits
Transformations, bindings, and steps per transformation all start at one on the free Deckhand tier and scale with your plan. Your current limits are shown in the app and on the pricing page.