Skip to main content

EDI Tasks

Overview

This document describes the tasks available for parsing, creating, and managing EDI (Electronic Data Interchange) files within the CXTMS System. These tasks support X12 transaction sets (204, 214, 216, 856, 861, 990) and EDIFACT message types (IFTMIN, CONTRL, APERAK) with INTTRA D99B specification support.

YAML Structure

EDI tasks follow a consistent structure that allows for flexible configuration of EDI processing operations.

Attribute Description

EDI/Parse

The EDI/Parse task converts raw EDI data into structured JSON format for further processing.

task: "EDI/Parse@1"
name: parseEDI
inputs:
ediData: "ISA*00* *00* *ZZ*ABCDEFGH *ZZ*123456789 *210101*1030*U*00401*000000001*0*P*>\nGS*SH*ABCDEFGH*123456789*20210101*1030*1*X*004010\nST*856*0001\n..."
transactionSet: "856" # Optional - Specific transaction set to parse
validateSchema: true # Optional - Validate against EDI schema
preserveWhitespace: false # Optional - Preserve whitespace in element data
outputs:
- name: "parsedData"
mapping: "result"
- name: "transactionType"
mapping: "transactionType"

Attribute Details:

Input ParameterDescription
ediDataRaw EDI data string to be parsed
transactionSetSpecific EDI transaction set to parse (e.g., 856, 214)
validateSchemaWhether to validate the EDI data against its schema
preserveWhitespaceWhether to preserve whitespace in element data

Output:

{
"parsedData": {
"interchangeHeader": {...},
"functionalGroups": [...],
"segments": [...],
"transactionSets": [...]
},
"transactionType": "856"
}

EDI/Generate

The EDI/Generate task creates EDI files from structured data.

task: "EDI/Generate@1"
name: generateEDI
inputs:
data:
{
"header":
{
"senderId": "ABCDEFGH",
"receiverId": "123456789",
"controlNumber": "000000001",
},
"shipment": { "billOfLadingNumber": "BOL12345", "shipDate": "20230515" },
}
transactionSet: "856" # Required - Transaction set to generate
template: "standard" # Optional - Template name to use
options:
segmentTerminator: "~"
elementSeparator: "*"
subElementSeparator: ">"
lineEnding: "\n"
outputs:
- name: "ediString"
mapping: "ediString"
- name: "controlNumbers"
mapping: "controlNumbers"

Attribute Details:

Input ParameterDescription
dataStructured data to convert to EDI format
transactionSetEDI transaction set to generate
templateNamed template to use for generation
options.segmentTerminatorCharacter used to terminate segments
options.elementSeparatorCharacter used to separate elements
options.subElementSeparatorCharacter used to separate sub-elements
options.lineEndingLine ending character sequence

Output:

{
"ediString": "ISA*00* *00* *ZZ*ABCDEFGH *ZZ*123456789 *230515*1030*U*00401*000000001*0*P*>\nGS*SH*ABCDEFGH*123456789*20230515*1030*1*X*004010\nST*856*0001\n...",
"controlNumbers": {
"interchangeControlNumber": "000000001",
"groupControlNumber": "1",
"transactionSetControlNumber": "0001"
}
}

EDI/Validate

The EDI/Validate task validates EDI data against standard schemas or custom validation rules.

task: "EDI/Validate@1"
name: validateEDI
inputs:
ediData: "ISA*00* *00* *ZZ*ABCDEFGH *ZZ*123456789 *210101*1030*U*00401*000000001*0*P*>\nGS*SH*ABCDEFGH*123456789*20210101*1030*1*X*004010\nST*856*0001\n..."
transactionSet: "856" # Required - Transaction set to validate
customRules:
[
{
"segment": "REF",
"element": "REF01",
"rule": "required",
"message": "Reference qualifier is required",
},
]
strictMode: true # Optional - Fail on any validation error
outputs:
- name: "isValid"
mapping: "isValid"
- name: "validationErrors"
mapping: "errors"

Attribute Details:

Input ParameterDescription
ediDataRaw EDI data string to validate
transactionSetEDI transaction set to validate against
customRulesArray of custom validation rules
strictModeWhether to fail on any validation error

Output:

{
"isValid": false,
"validationErrors": [
{
"segment": "REF",
"position": 12,
"element": "REF01",
"message": "Reference qualifier is required",
"severity": "error"
}
]
}

EDI/Transform

The EDI/Transform task converts between different EDI formats or maps EDI data to custom formats.

task: "EDI/Transform@1"
name: transformEDI
inputs:
sourceData:
{
"interchangeHeader": { ... },
"functionalGroups": [...],
"segments": [...],
"transactionSets": [...],
}
sourceFormat: "X12" # Required - Source EDI format
targetFormat: "EDIFACT" # Required - Target EDI format
mappingTemplate: "x12ToEdifact856" # Optional - Named mapping template
customMapping:
{
"sourceField": "targetField",
"sourceSegment.element": "targetSegment.element",
}
outputs:
- name: "transformedData"
mapping: "result"

Attribute Details:

Input ParameterDescription
sourceDataSource EDI data (parsed or raw)
sourceFormatSource EDI format (X12, EDIFACT, etc.)
targetFormatTarget EDI format
mappingTemplateNamed template for transformation
customMappingCustom field mapping rules

Output:

{
"transformedData": {
"raw": "UNB+UNOA:1+SENDER+RECEIVER+230515:1030+1+++++1'\nUNH+1+DESADV:D:96A:UN'\n...",
"structured": {
"interchangeHeader": {...},
"messages": [...]
}
}
}

EDI/ExtractData

The EDI/ExtractData task extracts specific data elements from EDI documents.

task: "EDI/ExtractData@1"
name: extractEDIData
inputs:
ediData: "ISA*00* *00* *ZZ*ABCDEFGH *ZZ*123456789 *210101*1030*U*00401*000000001*0*P*>\nGS*SH*ABCDEFGH*123456789*20210101*1030*1*X*004010\nST*856*0001\n..."
extractionRules:
[
{ "path": "ST-856/HL-S/TD1/TD101", "name": "packagingCode" },
{ "path": "ST-856/HL-S/TD1/TD102", "name": "ladingQuantity" },
{
"path": "ST-856/HL-S/REF[REF01=BM]/REF02",
"name": "billOfLadingNumber",
},
]
outputs:
- name: "extractedData"
mapping: "data"

Attribute Details:

Input ParameterDescription
ediDataRaw EDI data string to extract from
extractionRulesArray of rules defining what data to extract

Output:

{
"extractedData": {
"packagingCode": "PLT",
"ladingQuantity": "10",
"billOfLadingNumber": "BOL12345"
}
}

EDI/Acknowledge

The EDI/Acknowledge task generates functional acknowledgments (997/999) for received EDI documents.

task: "EDI/Acknowledge@1"
name: acknowledgeEDI
inputs:
ediData: "ISA*00* *00* *ZZ*ABCDEFGH *ZZ*123456789 *210101*1030*U*00401*000000001*0*P*>\nGS*SH*ABCDEFGH*123456789*20210101*1030*1*X*004010\nST*856*0001\n..."
acknowledgmentType: "997" # Required - 997 or 999
status: "A" # Optional - A (Accepted), P (Partially Accepted), R (Rejected)
errors:
[
{
"segment": "N1",
"position": 15,
"code": "7",
"description": "Missing required segment",
},
]
options:
swapIds: true # Swap sender/receiver IDs
useOriginalControlNumbers: false
outputs:
- name: "acknowledgment"
mapping: "ediString"

Attribute Details:

Input ParameterDescription
ediDataOriginal EDI data to acknowledge
acknowledgmentTypeType of acknowledgment to generate (997 or 999)
statusOverall acknowledgment status
errorsArray of errors to include in acknowledgment
options.swapIdsWhether to swap sender/receiver IDs
options.useOriginalControlNumbersWhether to reference original control numbers

Output:

{
"acknowledgment": "ISA*00* *00* *ZZ*123456789 *ZZ*ABCDEFGH *210101*1030*U*00401*000000002*0*P*>\nGS*FA*123456789*ABCDEFGH*20210101*1030*2*X*004010\nST*997*0001\n..."
}

EDI/BatchProcess

The EDI/BatchProcess task processes multiple EDI files in a single operation.

task: "EDI/BatchProcess@1"
name: batchProcessEDI
inputs:
files:
[
{
"name": "order1.edi",
"content": "ISA*00*...",
"transactionSet": "850",
},
{
"name": "shipment1.edi",
"content": "ISA*00*...",
"transactionSet": "856",
},
]
operation: "parse" # Required - Operation to perform (parse, validate, transform)
options:
continueOnError: true
groupByTransactionSet: true
outputs:
- name: "results"
mapping: "results"
- name: "summary"
mapping: "summary"

Attribute Details:

Input ParameterDescription
filesArray of EDI files to process
operationOperation to perform on each file
options.continueOnErrorWhether to continue processing after errors
options.groupByTransactionSetWhether to group results by transaction set

Output:

{
"results": [
{
"fileName": "order1.edi",
"transactionSet": "850",
"success": true,
"data": {...}
},
{
"fileName": "shipment1.edi",
"transactionSet": "856",
"success": true,
"data": {...}
}
],
"summary": {
"total": 2,
"successful": 2,
"failed": 0,
"byTransactionSet": {
"850": 1,
"856": 1
}
}
}

EDIFACT Tasks

The following tasks handle UN/EDIFACT messages using the indice.Edi serialization library. They support INTTRA D99B specifications for ocean shipping instruction workflows.

EDIFACT/Parse

The EDIFACT/Parse task deserializes raw EDIFACT data into strongly-typed POCO models. Supports IFTMIN (Instruction for Transport), CONTRL (Syntax and Service Report), and APERAK (Application Error and Acknowledgement) message types.

task: "EDIFACT/Parse@1"
name: parseEdifact
inputs:
edifactData: "{{ workflow.input.rawEdifact }}"
messageType: "IFTMIN" # Required - IFTMIN, CONTRL, or APERAK
outputs:
- name: "parsedData"
mapping: "parsedData"
- name: "messageType"
mapping: "messageType"
- name: "success"
mapping: "success"

Attribute Details:

Input ParameterDescription
edifactDataRaw EDIFACT data string to parse
messageTypeEDIFACT message type: IFTMIN, CONTRL, or APERAK

Supported Message Types:

Message TypeDescriptionINTTRA Spec
IFTMINInstruction for Transport (D99B/D01B)v3.08
CONTRLSyntax and Service Report (D99B)v1.1
APERAKApplication Error & Acknowledgementv1.4

Output (IFTMIN example):

{
"parsedData": {
"syntaxIdentifier": "UNOB",
"senderId": "SHIPPER01",
"recipientId": "INTTRA",
"messages": [{
"messageType": "IFTMIN",
"messageVersionNumber": "D",
"messageReleaseNumber": "99B",
"beginningOfMessage": {
"documentNameCode": "340",
"documentNumber": "SI-2026-001",
"messageFunctionCode": "9"
},
"parties": [...],
"transportDetails": [...],
"goodsItems": [...],
"equipment": [...]
}]
},
"messageType": "IFTMIN",
"success": true
}

Output (CONTRL example):

{
"parsedData": {
"senderId": "CARRIER01",
"recipientId": "SHIPPER01",
"messages": [{
"interchangeResponse": {
"interchangeControlReference": "REF001",
"actionCode": "7"
},
"messageResponses": [{
"messageType": "IFTMIN",
"actionCode": "7"
}]
}]
},
"messageType": "CONTRL",
"success": true
}

Output (APERAK example):

{
"parsedData": {
"senderId": "CARRIER01",
"recipientId": "SHIPPER01",
"messages": [{
"beginningOfMessage": {
"documentNameCode": "23",
"documentName": "IFTMIN",
"responseTypeCode": "AP"
},
"freeTexts": [{ "freeTextValue": "Accepted" }],
"references": [{ "referenceCodeQualifier": "BN", "referenceIdentifier": "BKG123" }]
}]
},
"messageType": "APERAK",
"success": true
}

EDIFACT/Generate

The EDIFACT/Generate task serializes structured data into raw EDIFACT format. Currently supports IFTMIN message generation with full INTTRA D99B compliance.

task: "EDIFACT/Generate@1"
name: generateEdifact
inputs:
messageType: "IFTMIN" # Required - Currently supports IFTMIN
sender:
id: "{{ company.ediId }}"
qualifier: "ZZZ"
recipient:
id: "INTTRA"
qualifier: "ZZZ"
documentNumber: "{{ shipment.siNumber }}"
messageReferenceNumber: "{{ sequence.messageRef }}" # Optional, auto-generated if omitted
messageFunctionCode: "9" # 9 = Original, 5 = Replace
documentRevisionNumber: "000001"
dates:
- qualifier: "137"
value: "{{ formatDate now 'yyyyMMddHHmm' }}"
formatCode: "203"
transportServiceRequirements:
contractConditionCode: "30" # 27=Door-Door, 28=Door-Pier, 29=Pier-Door, 30=Pier-Pier
serviceRequirementCode: "2" # 2 = Full loads
references:
- qualifier: "BN"
identifier: "{{ shipment.bookingNumber }}"
- qualifier: "BM"
identifier: "{{ shipment.billOfLading }}"
parties:
- functionCode: "HI" # Requestor (mandatory for INTTRA)
identification: "{{ company.inttraAlias }}"
name: "{{ company.name }}"
- functionCode: "CZ" # Shipper (mandatory)
name: "{{ shipper.name }}"
streetAddress: "{{ shipper.address }}"
city: "{{ shipper.city }}"
country: "{{ shipper.countryCode }}"
- functionCode: "CA" # Carrier (mandatory)
identification: "{{ carrier.scac }}"
codeListAgency: "172" # SCAC
- functionCode: "CN" # Consignee
name: "{{ consignee.name }}"
transportDetails:
- stageQualifier: "20" # Main transport
modeOfTransport: "1" # Maritime
carrierIdentification: "{{ carrier.scac }}"
vesselName: "{{ vessel.name }}"
voyageNumber: "{{ voyage.number }}"
locations:
- functionCode: "88" # Place of receipt
locationIdentifier: "{{ origin.unlocode }}"
- functionCode: "9" # Port of loading
locationIdentifier: "{{ pol.unlocode }}"
- functionCode: "11" # Port of discharge
locationIdentifier: "{{ pod.unlocode }}"
goodsItems:
- itemNumber: 1
numberOfPackages: "{{ cargo.packageCount }}"
packageType: "{{ cargo.packageTypeCode }}"
packageTypeDescription: "{{ cargo.packageTypeDescription }}"
packageTypeAgencyCode: "6" # Auto-set to "6" (UN/ECE) when packageType is provided
packageTypeDescriptionText: "{{ cargo.packageTypeDescriptionText }}" # Printed on B/L
grossWeight: "{{ cargo.grossWeight }}"
weightUnit: "KGM"
description: "{{ cargo.description }}"
equipment:
- equipmentQualifier: "CN" # Container
equipmentIdentification: "{{ container.number }}"
sizeTypeCode: "{{ container.sizeType }}"
fullEmptyIndicator: "5" # Full
sealNumber: "{{ container.sealNumber }}"
sealIssuerCode: "CA" # Carrier
outputs:
- name: "edifactData"
mapping: "edifactData"
- name: "success"
mapping: "success"

Key Input Parameters:

Input ParameterDescription
messageTypeEDIFACT message type (currently IFTMIN)
senderSender identification (id, qualifier)
recipientRecipient identification (id, qualifier)
documentNumberShipment Identification Number (mandatory for INTTRA)
messageFunctionCode9 = Original, 5 = Replace
transportServiceRequirementsContract conditions and service type codes
referencesBusiness references (BN=Booking, BM=B/L, FF=Forwarder ref, etc)
partiesParty details (HI, CZ, CA, CN, NI, FW, etc)
transportDetailsTransport stage, mode, vessel/voyage
locationsLocation codes (origin, POL, POD, delivery)
goodsItemsCargo details (packages, weight, dimensions, DG). Includes packageTypeAgencyCode (auto-set to "6" = UN/ECE when packageType provided) and packageTypeDescriptionText (B/L text)
equipmentContainer/equipment details with seals

INTTRA Party Codes:

CodeRoleRequired
HIRequestorYes
CZConsignor/ShipperYes
CACarrier (SCAC in C082)Yes
CNConsigneeYes
NINotify partyNo
FWFreight forwarderNo
FPFreight/charges payerNo
EXExporterNo
MRMessage recipientNo

INTTRA Location Codes:

CodeFunction
88Place of receipt
9Port of loading
11Port of discharge
7Place of delivery

Output:

{
"edifactData": "UNB+UNOB:3+SHIPPER01:ZZZ+INTTRA:ZZZ+260306:1130+REF001'UNH+1+IFTMIN:D:99B:UN'BGM+340+SI-2026-001+9'...",
"messageType": "IFTMIN",
"success": true
}

EDIFACT Message Models

The backend uses strongly-typed C# POCO classes with indice.Edi serialization attributes for EDIFACT processing:

IFTMIN (Instruction for Transport)

Structure follows IFTMIN D99B specification segment positions:

UNB → UNH → BGM(0020) → DTM(0050) → TSR?(0060) → CUX*(0070) → MOA*(0080) → FTX*(0090) → CNT*(0100) → SG1[LOC+DTM]*(0130) → SG3[RFF+DTM]*(0190) → SG6[CPI]*(0310) → SG8[TDT+LOC+DTM]*(0470) → SG11[NAD+CTA+COM+DOC+RFF]*(0570) → SG18[GID+...]*(0900) → SG37[EQD+SEL+TMP+RNG]*(1650) → UNT → UNZ

Key segments:

  • BGM (pos 0020, M 1) — Document type (340=Shipping Instructions) and shipment ID
  • DTM (pos 0050, C 1) — Document date/time (auto-generated as DTM+137)
  • TSR (pos 0060, C 1) — Carriage conditions (27-30: Door/Pier combinations) and service type
  • CUX (pos 0070, C 9) — Currencies for the message
  • MOA (pos 0080, C 99) — Monetary amounts
  • FTX (pos 0090, C 99) — Free text (AAI=General, BLC=B/L clause, CCI=Customs instructions)
  • CNT (pos 0100, C 5) — Control totals
  • SG1: LOC+DTM (pos 0130, C 2) — Locations with optional date/time (nested DTM per location)
  • SG3: RFF+DTM (pos 0190, C 999) — References (BN=Booking, BM=B/L, TN=ITN, CT=Contract)
  • SG6: CPI (pos 0310, C 9) — Charge payment instructions
  • SG8: TDT+LOC+DTM (pos 0470, C 99) — Transport details with vessel/voyage; now supports nested LOC segments (e.g., port of discharge, place of delivery)
  • SG11: NAD+CTA+COM+DOC+RFF (pos 0570, M 99) — Parties with contacts (CTA), communication details (COM), documents (DOC), and party-level references (SG15 RFF — e.g., FMC number for HI party)
  • SG18: GID+... (pos 0900, C 999) — Goods items with measurements (MEA), dangerous goods (DGS), free text. GID numeric fields (item number, package counts) are serialized as strings to avoid zero-padding issues with EDIFACT 9(n) format specifiers. The outer packaging composite (C213) includes an auto-set agency code (3055 = "6" for UN/ECE) when a package type code is provided, plus a description text field (7064) for B/L printing.
  • SG37: EQD+SEL+TMP+RNG (pos 1650, C 999) — Equipment with seals (SEL) and temperatures (TMP/RNG)

CONTRL (Syntax and Service Report)

Structure: UNB → UNH → UCI → [UCM → [UCS → [UCD]]] → UNT → UNZ

  • UCI — Interchange-level response (action code: 4=rejected, 7=acknowledged)
  • UCM — Message-level response with error codes
  • UCS — Segment error indication (position in message body)
  • UCD — Data element error indication (element/component position)

APERAK (Application Error and Acknowledgement)

Structure: UNB → UNH → BGM → DTM* → FTX* → RFF* → NAD* → UNT → UNZ

  • BGM — Status information (code 23), response type (AP=Accepted, RE=Rejected)
  • FTX — Status text ("Accepted" / "Rejected")
  • RFF — References back to original SI (BN=Booking, ERN=Exporter ref, ZZZ=INTTRA SI Number)
  • NAD — Carrier (CA) and Requestor (HI)

Examples

Parsing an EDI 856 Shipment Notice

task: "EDI/Parse@1"
name: parseShipmentNotice
inputs:
ediData: "{{ workflow.input.ediContent }}"
transactionSet: "856"
validateSchema: true
outputs:
- name: "shipmentData"
mapping: "result"
- name: "transactionType"
mapping: "transactionType"

Generating an EDI 214 Shipment Status Message

task: "EDI/Generate@1"
name: generateStatusUpdate
inputs:
data:
{
"header":
{
"senderId": "{{ company.ediId }}",
"receiverId": "{{ partner.ediId }}",
"controlNumber": "{{ sequence.ediControl }}",
},
"statusDetails":
{
"shipmentId": "{{ shipment.id }}",
"statusCode": "AG",
"statusDescription": "Delivered",
"statusDate": "{{ formatDate shipment.deliveryDate 'YYYYMMDD' }}",
"statusTime": "{{ formatDate shipment.deliveryTime 'HHmm' }}",
},
}
transactionSet: "214"
template: "standardDelivery"
outputs:
- name: "ediMessage"
mapping: "ediString"
- name: "controlInfo"
mapping: "controlNumbers"

Creating and Validating an EDI 204 Motor Carrier Load Tender

task: "EDI/Generate@1"
name: generateLoadTender
inputs:
data: "{{ shipment }}"
transactionSet: "204"
template: "carrierLoadTender"
outputs:
- name: "ediTender"
mapping: "ediString"

task: "EDI/Validate@1"
name: validateLoadTender
inputs:
ediData: "{{ generateLoadTender.ediTender }}"
transactionSet: "204"
strictMode: true
outputs:
- name: "isValid"
mapping: "isValid"
- name: "validationErrors"
mapping: "errors"

Generating an EDIFACT IFTMIN Shipping Instruction via INTTRA

task: "EDIFACT/Generate@1"
name: generateShippingInstruction
inputs:
messageType: "IFTMIN"
sender:
id: "{{ company.inttraAlias }}"
qualifier: "ZZZ"
recipient:
id: "INTTRA"
qualifier: "ZZZ"
documentNumber: "{{ shipment.siNumber }}"
messageFunctionCode: "9"
references:
- qualifier: "BN"
identifier: "{{ shipment.bookingNumber }}"
parties:
- functionCode: "HI"
identification: "{{ company.inttraAlias }}"
- functionCode: "CZ"
name: "{{ shipper.name }}"
- functionCode: "CA"
identification: "{{ carrier.scac }}"
- functionCode: "CN"
name: "{{ consignee.name }}"
equipment:
- equipmentQualifier: "CN"
equipmentIdentification: "{{ container.number }}"
sizeTypeCode: "4510"
fullEmptyIndicator: "5"
outputs:
- name: "ediMessage"
mapping: "edifactData"

Parsing an EDIFACT CONTRL Response

task: "EDIFACT/Parse@1"
name: parseContrlResponse
inputs:
edifactData: "{{ workflow.input.edifactResponse }}"
messageType: "CONTRL"
outputs:
- name: "contrlData"
mapping: "parsedData"
- name: "isAccepted"
mapping: "parsedData.messages[0].interchangeResponse.actionCode"

Parsing an EDIFACT APERAK Acknowledgement

task: "EDIFACT/Parse@1"
name: parseAperakResponse
inputs:
edifactData: "{{ workflow.input.aperakData }}"
messageType: "APERAK"
outputs:
- name: "aperakData"
mapping: "parsedData"
- name: "responseType"
mapping: "parsedData.messages[0].beginningOfMessage.responseTypeCode"

Full INTTRA Shipping Instruction Workflow

steps:
- task: "EDIFACT/Generate@1"
name: generateSI
inputs:
messageType: "IFTMIN"
sender:
id: "{{ company.inttraAlias }}"
qualifier: "ZZZ"
recipient:
id: "INTTRA"
qualifier: "ZZZ"
documentNumber: "{{ shipment.siNumber }}"
messageFunctionCode: "9"
references:
- qualifier: "BN"
identifier: "{{ shipment.bookingNumber }}"
parties:
- functionCode: "HI"
identification: "{{ company.inttraAlias }}"
- functionCode: "CZ"
name: "{{ shipper.name }}"
- functionCode: "CA"
identification: "{{ carrier.scac }}"
- functionCode: "CN"
name: "{{ consignee.name }}"

- task: "HTTP/Request@1"
name: sendToInttra
inputs:
url: "{{ config.inttra.endpoint }}"
method: "POST"
body: "{{ generateSI.ediMessage }}"

- task: "EDIFACT/Parse@1"
name: parseContrl
inputs:
edifactData: "{{ sendToInttra.response }}"
messageType: "CONTRL"

- task: "EDIFACT/Parse@1"
name: parseAperak
inputs:
edifactData: "{{ workflow.input.aperakCallback }}"
messageType: "APERAK"
conditions:
- expression: "{{ workflow.input.aperakCallback != null }}"

Best Practices

  1. Pre-validate Data: Always validate your data structures before generating EDI documents to prevent syntax errors.

  2. Use Templates: Create reusable templates for common EDI transaction sets to ensure consistency.

  3. Implement Error Handling: Set up proper error handling for EDI parsing and validation to gracefully handle malformed documents.

  4. Control Number Management: Implement a robust system for managing EDI control numbers to prevent duplicates.

  5. Logging: Log all EDI transactions for audit and troubleshooting purposes.

  6. Testing: Test EDI documents with trading partners' test systems before moving to production.

  7. Acknowledgments: Always process and respond to acknowledgments (997/999) to ensure successful transmission.