Configuration
Transient delivery failures are retried automatically by the platform. Use the node’s retry field to set the maximum number of attempts, between 1 and 5 (default 3).
Retries and lost responses
EveryPOST and PATCH carries an Idempotency-Key header that stays the same across retries of one step. What happens when a response is lost (a gateway timeout after the request left) depends on the two switches above.
Turn Destination de-duplicates by Idempotency-Key on only when the endpoint documents idempotency keys. With it on, a lost response is resolved by sending the request again with the same key; an endpoint that ignores the header would receive the record twice.
Insert vs Update
Insert (default) posts the current document as a new record. The body defaults to the full workflow output, and you can edit it freely. Click Generate body to replace it with a starting template built from the columns carried into this step, then edit from there. Update writes changes back to an existing record through the callback’s own request. See Write-back below.Write-back
Set Write mode toUpdate to write changes back to a record at the callback’s URL, instead of posting a new one. Update mode requires a Connector.
Record source
Choose where the target record’s id, and its line rows, come from. Reconcile (default, recommended). Ingestly builds the write plan from an upstream Reconcile step’s verified match, and keeps its safety gate.Two safety behaviors apply: if the reconcile result has a blocking mismatch and no approved review, the step fails instead of writing; if nothing changed (an empty write set), the step succeeds without sending a request.
For line pairing too complex for a template to express (for example, matching document lines to fetched connector lines by more than one key), add a Transform step upstream that joins the two sides and emits rows carrying both, then point Direct’s Lines field at that array.
Direct never fetches the target record, so
{{$writeback.record.*}} has nothing to read: a body that references it under Direct is a design-time error. Bind any field you need (an ETag, a concurrency token) from whichever upstream node already supplied the record id instead.The write plan
At run time, Ingestly resolves the write plan and exposes it to the body template under the{{$writeback}} head:
{{$writeback.recordId}}: the target record’s id.{{$writeback.record.*}}: any field of the fetched connector record (Reconcile source only; empty under Direct), for example{{$writeback.record.updatedAt}}.{{$writeback.updates}},{{$writeback.adds}},{{$writeback.removes}}: arrays of matched, added, and removed line rows. Iterate them in a JSON body with$each, for example"$each": "{{$writeback.updates}}".
Use
{{$writeback.*}}, not {{writeback.*}}. There is no reserved bare writeback head: an unprefixed reference is an ordinary node reference and fails if no node named writeback exists upstream. The $ prefix is what lets a workflow also have a node named writeback with no ambiguity.$each block over {{$writeback.removes}} if your endpoint accepts deletions: the generated body does not wire that one in by default.
Binary body
Set Body format toBinary (base64) to send the request body as raw bytes instead of JSON. The body template must resolve to a Base64 string, typically exactly {{$document.file.base64}} (the source document).
- Ingestly decodes the Base64 string and sends the resulting bytes as the request body.
- The content type defaults to
application/octet-stream. Set aContent-Typeheader to override it. GETandDELETErequests never send a body.- If the resolved body is not valid Base64, the step fails with a clear error instead of sending malformed bytes.
[binary N bytes, type].
Dry run behavior
On a Dry run, the callback node does not send the HTTP request. Instead, the run output shows a preview with:- The resolved request URL
- The resolved request headers
- The rendered request body
Inputs and outputs
Allowed inputs: Any action node that produces a result payload (extract, review, validation, transform, merge, parse, wait, if, switch, loop, variable, store, reconcile, prompt, HTTP, call workflow, Business Central, QuickBooks), the sub-workflow trigger, and another callback node (see Chaining callbacks). Filter, split and classify are not among them: they select pages rather than produce a result to send, so put the node that produces the data between them and the callback. Output: Sends an HTTP request to the configured URL with the workflow results.Using the result downstream
Your endpoint’s response body becomes the node’s payload directly. If it replies{"ticketId":"T-1001"}, then {{NodeName.payload.ticketId}} resolves to T-1001. Ingestly does not wrap or rename those keys, because they belong to the receiving system rather than to Ingestly. Autocomplete can advertise part of that shape ahead of any run. With Body format set to OData Batch, it offers the full payload.responses[] shape (id, status, headers, body per operation), because the batch response envelope is fixed. With a JSON body and a Connector attached, it offers payload.id, the created record’s id: that is a hint, and your endpoint has to actually return the field. For any other key your endpoint returns, the shape is not known until a run has produced a sample.
Chaining callbacks
A callback node accepts another callback as its input. The second callback reads the first one’s response by node name, the same way it reads any upstream node: if the first callback is namedticket and its endpoint replied {"ticketId":"T-1001"}, the second callback’s body can use {{ticket.payload.ticketId}}. A callback body has to name its source node: a bare {{payload}} shorthand is not resolved in a callback body.
metadata.callback - request-level information:
An Update with nothing to send (the reconcile found no changes) makes no request at all. The step succeeds with a
null payload, statusCode 204 and method NONE.
A following step is optional. The node is still an output: it stays in the Outputs group in the node picker, and it cannot be disabled.
Error output
Turn on Error output in the node’s settings to add a second port. When the write fails after its retries, the run follows that port instead of failing, so you can route the failure to a Review, a notification, or a compensating step. With no error edge drawn, a failed write fails the run exactly as before.Related
Webhooks and callbacks guide
Payload format, verification, and integration patterns
Webhook signing keys
Verify webhook signatures for security
Business Central
Dedicated node for Business Central destinations
QuickBooks
Dedicated node for QuickBooks Online destinations