Skip to main content

Destination Nodes

A destination node delivers a message out of the workflow. It consumes from the node connected before it and performs the external side effect.

Fields marked needed to start must have a usable value before the node will start.


Destination LLP

Sends HL7 v2 over MLLP to a remote host and handles the ACK.

Core fields

FieldDefaultNotes
Remote HostlocalhostNeeded to start. Hostname or IP of the receiving system.
Remote Port5145Needed to start, and must be greater than 0.
Message EncodingWestern (ISO-8859-1)Character encoding for outbound messages.
Escape 8-Bit CharactersoffEscape high-bit characters in the outbound stream.
Persistent ConnectionYesYes reuses one connection; No connects per message.

:::caution Check Remote Host before you start The default is localhost, which is a valid value — so a node you forgot to configure starts cleanly and sends nowhere useful. Set it deliberately, and check it after importing a project from another environment. :::

Framing

FieldDefault
LLP DelimitersNormal LLP
Messages Begin After\x0B
Messages Continue Until\x1C\x0D

Acknowledgment

FieldDefaultNotes
Wait for AckonWhether to wait for an ACK before treating the message as delivered.
Ack Timeout10000Milliseconds to wait for the ACK.
Ack VerificationAny messageAny message, or Original ID and message type for a strict match.
Ack Error HandlingStop channelStop channel, Queue message, or Discard message.

Resend and reconnect

FieldDefaultNotes
Resend on Ack TimeoutonResend when no ACK arrives in time.
Resend on Ack Verification FailureoffResend when the ACK does not match.
Resend Attempts Unlimitedoff
Resend Attempts5
Disconnect Between Resend Attemptson
Reconnect After Resend10000Milliseconds.
Attempt to ReconnectYes, with limitNo, Yes, or Yes, with limit.
Reconnect Attempts60With Yes, with limit.
Reconnection Interval10000Milliseconds between attempts.

TLS

FieldDefaultNotes
Use SSLonThis node defaults to TLS.
Certificate File(empty)
Private Key File(empty)
Verify Peeron
Certificate Authority File(empty)

:::note This node defaults to TLS on, and Source LLP defaults to off If you are connecting two Linkiir installations, or sending to a receiver that expects plain MLLP, the defaults will not match. A TLS mismatch usually looks like a connection that opens and immediately drops. Set Use SSL on both ends deliberately rather than relying on defaults. :::

Choosing Ack Error Handling

This is the most consequential setting on the node. It decides what happens when the receiver returns a negative ACK.

SettingBehaviourUse when
Stop channelThe node stopsSafest default. A rejection needs a human decision, and stopping preserves order and prevents a flood of failures.
Queue messageThe message is held and the node continuesRejections are expected for individual messages and must be retained for review.
Discard messageThe message is dropped and the node continuesRarely appropriate for clinical or financial data. Choose it only when loss is genuinely acceptable.

Start with Stop channel. It surfaces a receiver problem immediately instead of letting hundreds of messages fail unnoticed. Stopping is safe: unprocessed messages wait in the durable queue.

Wait for Ack and Ack Verification

CombinationMeaning
Wait for Ack offDelivered once written to the socket. Fastest, weakest guarantee.
On, Any messageAny response counts as an acknowledgment.
On, Original ID and message typeThe ACK must match the message sent. Strongest guarantee.

Use Original ID and message type when the receiver may respond out of order or on a shared connection. Without it, an ACK for one message can be credited to another — which means a message that was actually rejected is recorded as delivered.

Persistent Connection

Set Yes when the receiver expects a long-lived connection and the volume justifies it. Set No when the receiver is intolerant of idle connections, or when a network device between you closes them silently — a closed-but-not-noticed connection produces confusing timeouts.


Destination File/FTP

Writes each message to a file, locally or to an FTP/FTPS/SFTP server.

Core fields

FieldDefaultNotes
Output Directory(empty)Needed to start. Where files are written.
Write Each Message ToSeparate filesSeparate files or A single file.
Single File(empty)The target filename, with A single file.
Output File EncodingWestern (ISO-8859-1)Character encoding of written files.
Escape 8-Bit CharactersoffEscape high-bit characters on output.

Naming files, with Separate files

FieldDefaultNotes
Use as File IDUnique ID (YYYYMMDDhhmmss_XXXXX)See the table below.
Custom Timestamp Formatoutput_%Y_%m_%d_%H_%M_%S_%f.hl7With Custom Timestamp.
Number of Padded Digits53 to 7, with Padded integer index.
Next File Index0Starting number, with either index mode.
Output File Mask%i.txtNeeded to start with Separate files. Filename pattern.
Temporary File ExtensiontmpExtension used while writing.

Choosing a file ID

OptionSuits
Unique ID (YYYYMMDDhhmmss_XXXXX)Default choice. Safe under any volume and after a restart.
Timestamp (to the millisecond)Human-scannable output, if two messages cannot share a millisecond.
Custom TimestampA receiver that parses filenames.
Integer indexA receiver that expects a sequence.
Padded integer indexA receiver that sorts filenames as text.

Timestamp naming collides under load when two messages land in the same interval, and index naming restarts from Next File Index if that value is ever reset. Use Unique ID unless a receiver requires otherwise.

The temporary extension matters

Linkiir writes to a temporary name and renames on completion, so a downstream watcher configured to pick up *.txt never sees a partial file.

Keep Temporary File Extension different from the extension in Output File Mask. If they match, a reader can grab a file mid-write — which is exactly the failure the temporary name exists to prevent.

FTP upload

Turn on Upload to FTP to write to a remote server.

FieldDefaultNotes
FTP ProtocolFTPFTP, FTPS (FTP over SSL), or SFTP (Secure Shell FTP).
AuthenticationUsername/PasswordUsername/Password or Private/Public Key.
FTP Server(empty)Needed to start when Upload to FTP is on.
FTP Port21
FTP Username(empty)Needed to start when Upload to FTP is on.
FTP Password(empty)For password authentication.
FTP Path(empty)Remote directory.
Certificate File, Private Key File(empty)For FTPS.
SFTP Private Key File, Public Key File(empty)For key-based SFTP.
Verify PeeroffLeave on outside a trusted network.
Verify Host FingerprintoffLeave on outside a trusted network.
Use Remote Temporary FileonUpload under a temporary name and rename on completion.
FTP Overwrite Handlingbe overwrittenAn existing file may be overwritten, be renamed, or not be uploaded.
Keep Local FilesonRetain a local copy after upload.
Attempt to ReconnectNoNo, Yes (unlimited), or Yes, with limit.
Reconnect Limit Times60With Yes, with limit.
Reconnection Interval10000Milliseconds between attempts.

Leave Use Remote Temporary File on whenever the receiver polls the upload directory, for the same reason as the local temporary extension.

Keep Local Files is on by default, which is useful while validating a new interface — the local copies are your evidence of what was sent. Plan for the disk they consume, or turn it off once the interface is established.

:::caution FTP Overwrite Handling defaults to overwriting The default silently replaces an existing remote file of the same name. Combined with timestamp or index naming, a redelivery can overwrite a file the receiver has not read yet. Set it to not be uploaded when silent replacement would lose data. :::

Put the password in the project's Credentials tab flagged Secret, and reference it. See Project Settings.


Outbound HTTP, email, and database writes

There is no working dedicated node type for these. Make the call from a Transform Custom node:

local linkiir = require("linkiir")

function main(Data)
local resp, err = linkiir.link.web.post{
url = "https://api.example.com/messages",
body = Data,
headers = { ["Content-Type"] = "application/json" },
auth = { type = "bearer", token = Token },
timeout = 30,
}
if not resp then
error("delivery failed: " .. err.message)
end
if resp.code >= 400 then
error("receiver returned " .. resp.code)
end
end

A transform node that calls out and never pushes is a destination in every practical sense.

Raising an error on a failed delivery matters: it stops the message being treated as delivered, so it is not silently lost. Check both the transport result and the status code — resp being present means the request completed, not that the receiver accepted it. See Error Handling and Retry.

:::note Destination Custom is not usable The palette offers Custom under Destination, but it has no runtime implementation in this release. Use Transform Custom as above. :::


Make delivery idempotent

Delivery is at-least-once, so a message can be delivered twice after an interruption or a retry.

DestinationHow to protect the receiver
Destination LLPUse Original ID and message type verification and let the receiver deduplicate on message control ID.
Destination File/FTPUse Unique ID naming and FTP Overwrite Handling set to not be uploaded, so a redelivery cannot silently replace a file.
Outbound HTTPSend a stable idempotency key derived from the message, if the API supports one.
Database writeUse an upsert or guarded insert keyed on a message identifier.

Decide how the receiver detects duplicates before you go live, not after. A replay or retry must not create a duplicate clinical or financial transaction.


Next