Skip to main content

Message node

Transform

The Message node turns input rows into a formatted message (a string of bytes) that downstream targets can deliver as a file, an email attachment, an HTTP API body, or an indexed document.

The Message node supports Delimited (CSV, TSV, or any custom-delimiter output), JSON (pretty or compact array), NDJSON (newline-delimited JSON), YAML (block style), XML (structured with element/attribute mapping), Fixed-width (positional records), XLSX (single- or multi-sheet workbooks with per-column type overrides), Parquet (columnar format with per-column schema overrides), EDI X12 (850 Purchase Order, 810 Invoice), and EDIFACT (ORDERS, INVOIC).

Coming Soon

A reusable shape library so you can save named message shapes and pick one from a dropdown instead of re-authoring the mapping per node.

When to use

  • You have rows and need a formatted message downstream (a file to write, an email attachment to send, an API body to POST).
  • You want per-format control that File Transfer targets don't expose directly (custom delimiter, quoting policy, line ending, encoding).
  • You want to emit ONE message for the whole batch, ONE per row, or ONE per group (single / per_row / group_by).

Configuration

  • Format — Delimited, JSON, NDJSON, or YAML.
  • Delimited options — delimiter (comma / tab / pipe / semicolon / custom), quote character, quoting policy (minimal = only when the field contains a delimiter, quote, newline, or CR; all = every field), header row on/off, line ending (LF or CRLF), encoding (UTF-8 / ASCII / Latin-1).
  • JSON options — pretty (2-space indent) or compact (single line); optional column filter (drops keys not in the list).
  • NDJSON options — line ending (LF or CRLF); optional column filter. Each row becomes one JSON object on its own line, terminated by the line ending.
  • YAML options — block-style sequence of mappings with 2-space indent; optional column filter.
  • XML options — configurable root and item (row) element names, optional root namespace URI, XML declaration on/off, pretty (2-space indent) vs compact single-line output. A field mapping table lets you rename fields (fromto) or promote them to attributes on the item element (as attribute checkbox). Unlisted fields become child elements. Element and attribute names are sanitized to valid XML NCNames automatically.
  • Fixed-width layout — a table of positional columns (name, width, alignment left/right, pad character, overflow policy). The column order in the table is the emission order regardless of input row key order. Overflow policy truncate clips the value to the column width; error throws at runtime and shows [OVERFLOW] in the preview.
  • XLSX options — single sheet with a configurable sheet name, or multi-sheet grouping rows by a chosen field (one worksheet per distinct value). Header row can be bold. XLSX output is binary — the emitted message field is base64-encoded workbook bytes. The preview fetches a small tabular summary from the runtime (POST /api/runtime/preview/xlsx, hard-capped at 100 rows and 20 columns per sheet) rather than shipping the binary bytes to the browser.
  • Parquet schema — Column types are inferred from the first non-null value per column (UTF8, INT64, DOUBLE, BOOLEAN, TIMESTAMP_MILLIS). Override any column with an explicit type when the inference is wrong. Parquet output is binary — the emitted message field is base64-encoded Parquet bytes. The preview fetches a schema + sample-row summary from the runtime (POST /api/runtime/preview/parquet, capped at 100 sample rows) rather than shipping the binary bytes to the browser. Pure-JS emitter (parquetjs-lite); no native binary added to the runtime container.
  • EDI options (X12 and EDIFACT) — pick a transaction set (X12: 850 Purchase Order or 810 Invoice; EDIFACT: ORDERS or INVOIC), sender / receiver IDs and qualifiers, control numbers (interchange, group, transaction), and Test-vs-Production usage. Each input row should represent one line item; the first row supplies the header-level fields (poNumber, poDate for POs; invoiceNumber, invoiceDate, poNumber for invoices). Segment counts and totals are computed automatically. The runtime emits the full envelope (ISA/GS/ST/SE/GE/IEA for X12; UNB/UNH/UNT/UNZ for EDIFACT). The preview renders as a tokenized segment list via POST /api/runtime/preview/edi. Additional transaction sets (855, 856, 997, DESADV, IFTMIN, etc.) can be added as additive drops under runtime/src/runtime/edi-transactions/.

Shape library

The Shape library card at the top of the inspector lets you save a fully-configured Message node as a reusable MessageShape and load it back into any other Message node in the account. Shapes are DB-backed, versioned, and scoped to either the account (visible to every project) or a specific project. Changing the format or config auto-increments a new version; renames alone do not. Previous versions can be restored from GET /api/message-shapes/:id/versions + POST /api/message-shapes/:id/versions/:versionNumber/restore.

  • Emission modesingle (one message for the whole run), per_row (one message per input row), or group_by (one message per distinct value of the chosen group-by fields). Applies to every format.
  • Output — the output field name where the serialized message payload lands (message by default), and optional gzip compression (payload becomes base64).
  • Preview — a live browser-rendered preview using sample rows from the most recent run of the upstream node, or synthetic rows if no run history exists. The preview updates instantly when the format or any option changes.

Output shape

Each emitted row carries the message payload plus inline metadata (format, encoding, byteSize, recordCount, checksum, compressed, emissionMode). A companion metadata sidecar row is emitted on the metadata port with the same metadata fields, for downstream consumers that want just the summary without the payload.