Infor ION Messaging: Async Event-Driven Integration with BODs

Type: ERP Integration System: Infor OS / ION (2024.x) Confidence: 0.82 Sources: 8 Verified: 2026-03-02 Freshness: evolving

TL;DR

System Profile

Infor ION (Intelligent Open Network) is the middleware integration platform embedded in Infor OS. ION Messaging is its core async communication layer, routing Business Object Documents (BODs) between applications using a publish-subscribe model. ION Connect acts as the central messaging hub where you define connection points (application endpoints) and document flows (routing rules for BODs between connection points). This card covers the BOD messaging subsystem — not the ION API Gateway REST surface, ION Workflow automation, or ION Mapper transformations, though all three depend on ION Messaging.

All Infor CloudSuite applications (LN, M3, CloudSuite Industrial, CloudSuite Distribution, etc.) ship with pre-built BOD interfaces. Third-party systems connect via Technology Connectors — File, Database, Message Queue, API Gateway, or Kafka connection points.

PropertyValue
VendorInfor
SystemInfor OS / ION 2024.x
API SurfaceION Messaging (BOD/XML pub-sub), ION API Gateway (REST)
Current Version2024.x (Cloud Edition)
Editions CoveredEssentials (350 units), Professional (3,500 units), Enterprise (35,000 units)
DeploymentCloud (multi-tenant), On-Premise (12.0.x)
API DocsInfor Documentation Central
StatusGA

API Surfaces & Capabilities

ION provides multiple integration surfaces. BOD messaging is the native async mechanism; the API Gateway handles synchronous REST calls.

API SurfaceProtocolBest ForMax PayloadRate LimitReal-time?Bulk?
ION Messaging (BOD)XML/HTTPS pub-subEvent-driven sync between Infor apps5-50 MB (tier-dependent)Throughput units (tier)Near-real-timeNo
ION API GatewayREST/HTTPSExternal system CRUD, real-time queriesNo limit (streaming), 10 MB (buffered)Not publishedYesNo
File ConnectionFTP/SFTP/Windows shareBatch imports/exports, CSV/XML filesFilesystem limitN/ANoYes
Database ConnectionJDBC/SQLDirect DB reads/writes for non-BOD appsQuery-dependentN/ANear-real-timeYes
Message QueueJMSIntegration with external MQ systemsJMS provider limitN/AYesNo
Kafka ConnectionApache KafkaHigh-throughput streaming integrationKafka topic configN/AYesYes

Rate Limits & Quotas

Per-Message Limits

Limit TypeValueApplies ToNotes
Max message size (Essentials)5 MB1-3,499 processing unitsPer tenant
Max message size (Professional)20 MB3,500-34,999 processing unitsPer tenant
Max message size (Enterprise)50 MB35,000+ processing unitsPer tenant
Intermediate-step payload5 MB recommended maxDocument flows with mapping/enrichmentRegardless of tier
API Gateway payload (buffered)10 MBPolicies that buffer request/responseStreaming has no limit

Throughput / Capacity Limits

Limit TypeValueWindowEdition Differences
Processing capacity350 / 3,500 / 35,000 unitsSubscription-basedAdd-ons in multiples of 350
Data Lake ingestion600 per 1 TB storagePer customerShared across all tiers
API Gateway timeout (sync)Default 1 min, max 5 minPer requestConfigurable per endpoint
API Gateway timeout (async)Up to 2 hoursPer requestFor long-running operations
LN/Baan bshellsMax 10 per channelPer connection pointExceeding causes queue backpressure

History Retention Limits

TierComplete RecordsIn-Flight Records
Essentials (1-3,499 units)45 days180 days
Professional (3,500-34,999)90 days270 days
Enterprise (35,000+)180 days360 days

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 Authorization CodeNative/desktop apps, web appsSession-basedYesStandard 3-legged flow via Infor IFS
OAuth 2.0 Resource Owner PasswordServer-to-server via ION API GatewaySession-basedYesUses service account AccessKey + SecretKey
OAuth 2.0 SAML BearerApps integrated with Infor Ming.leSession-basedYesFor SSO-enabled environments
JDBC Inbox/OutboxBOD messaging between Infor appsN/A (persistent)N/AInternal; uses application connection point credentials
Enterprise ConnectorOn-premise to cloud bridgeCertificate-basedN/ARequires EC agent installation on-premise

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START — User needs to integrate with Infor CloudSuite via ION
|-- What's the integration pattern?
|   |-- Event-driven (BOD pub-sub, near-real-time)
|   |   |-- Infor-to-Infor app?
|   |   |   |-- YES -> Application Connection Point (IOBOX/IMS), Sync BODs
|   |   |   +-- NO -> Technology Connector (File/DB/MQ/Kafka/API)
|   |   |-- Need request-reply confirmation?
|   |   |   |-- YES -> Process BOD (request) + Acknowledge BOD (response)
|   |   |   +-- NO -> Sync BOD (broadcast, fire-and-forget)
|   |   +-- Need data enrichment in transit?
|   |       |-- YES -> ION Mapper in document flow (keep payload < 5 MB)
|   |       +-- NO -> Direct connection point to connection point
|   |-- Real-time synchronous (individual records, <1s)
|   |   +-- ION API Gateway REST endpoint (max 5 min timeout)
|   |-- Batch/Bulk (scheduled, high volume)
|   |   |-- Data volume < 5 MB per batch?
|   |   |   |-- YES -> BOD messaging with scheduled trigger
|   |   |   +-- NO -> File Connection Point via SFTP
|   |   +-- Need incremental or full load?
|   |       |-- Incremental -> Sync BODs (change-driven)
|   |       +-- Full -> Get/Show BOD pair or file export
|   +-- File-based (CSV/XML)
|       +-- File Connection Point (SFTP from Cloud or Enterprise Connector)
|-- Which direction?
|   |-- Inbound (writing to Infor) -> Process BOD to system of record
|   |-- Outbound (reading from Infor) -> Subscribe to Sync BODs from SOR
|   +-- Bidirectional -> Define SOR per business object FIRST
+-- Error tolerance?
    |-- Zero-loss required -> Monitor Confirm BODs in ION Desk + alerting
    +-- Best-effort -> Sync BODs with retry on subscriber side

Quick Reference

BOD Verb Reference

VerbDirectionPatternResponse RequiredUse Case
SyncSOR -> SubscribersPublish-subscribe (broadcast)NoData changed in SOR — notify all subscribers
ProcessRequester -> SORPoint-to-point (request)Yes (Acknowledge)Request SOR to create/update a record
AcknowledgeSOR -> RequesterPoint-to-point (response)NoAccept/reject a Process request
GetRequester -> SORPoint-to-point (query)Yes (Show)Request specific records (initial load, recovery)
ShowSOR -> RequesterPoint-to-point (response)NoReturn requested records
PostSender -> ReceiverPoint-to-pointNoSimilar to Process but no Acknowledge expected
LoadNon-SOR -> SORPoint-to-point (push)NoForce-create document — cannot be refused
UpdateNon-SOR -> SORPoint-to-point (notify)NoNotify SOR of event-triggered changes
ConfirmION -> ION DeskSystem-generated (error)NoError notification with original message for resubmission

Connection Point Types

TypeProtocolUse WhenCloud?On-Prem?
Application (IOBOX)JDBC Inbox/OutboxInfor apps with native BOD supportYesYes
IMSREST/HTTPSInfor apps using ION Messaging ServiceYesYes
LN/BaanBshellInfor LN/Baan specificYesYes
FileFTP/SFTP/Windows shareNon-BOD apps, batch filesYes (SFTP from Cloud)Yes
DatabaseJDBC/SQLDirect DB integration, non-BOD appsVia ECYes
Message QueueJMSExternal MQ systems (IBM MQ, RabbitMQ)Via ECYes
ION APIRESTExternal REST APIsYesYes
KafkaApache KafkaHigh-throughput streamingYesYes

Step-by-Step Integration Guide

1. Register application and create connection point

Open ION Desk and create a connection point matching your integration type. For third-party apps, use a Technology Connector. [src2]

ION Desk > Connect > Connection Points > + Add
  - Name: "EXT_MyApp_CP"
  - Type: Select connector type (File, Database, Message Queue, API, Kafka)
  - Configure credentials and endpoint details
  - Select BODs to send (outbox) and receive (inbox)
  - Save and activate

Verify: Connection point status shows "Active" in ION Desk with green indicator.

2. Define a document flow between connection points

Create a document flow that routes specific BODs from source to target connection points. [src2, src7]

ION Desk > Connect > Document Flows > + Add
  - Name: "ItemMaster_ERP_to_WMS"
  - Source: Select source connection point
  - Target: Select target connection point
  - BODs: Select specific BODs (e.g., SyncItemMaster)
  - Optional: Add ION Mapper node for field transformation
  - Activate flow

Verify: Document flow shows active status; test with a sample BOD and confirm delivery in ION OneView.

3. Publish a Sync BOD from the source system

When data changes in the SOR, it publishes a Sync BOD to ION. For custom apps, write BOD XML to the outbox table or send via IMS/REST. [src3]

<SyncItemMaster xmlns="http://schema.infor.com/InforOAGIS/2"
                releaseID="9.2" versionID="2.12.0">
  <ApplicationArea>
    <Sender>
      <LogicalID>lid://infor.myerp.1</LogicalID>
      <ComponentID>ERP</ComponentID>
    </Sender>
    <CreationDateTime>2026-03-02T10:00:00Z</CreationDateTime>
    <BODID>bca4f1e8-3d7a-4b2e-9c1d-abc123456789</BODID>
  </ApplicationArea>
  <DataArea>
    <Sync>
      <ActionCriteria>
        <ActionExpression actionCode="Replace"/>
      </ActionCriteria>
    </Sync>
    <ItemMaster>
      <ItemMasterHeader>
        <ItemID><ID>ITEM-10042</ID></ItemID>
        <Description>Widget Assembly Unit</Description>
      </ItemMasterHeader>
    </ItemMaster>
  </DataArea>
</SyncItemMaster>

Verify: Check ION OneView for the published BOD — status should show "Delivered" to all subscriber connection points.

4. Handle Process/Acknowledge request-reply flow

For request-reply patterns, the requesting system sends a Process BOD and the SOR responds with an Acknowledge BOD. [src3, src5]

<!-- Requester sends ProcessPurchaseOrder -->
<ProcessPurchaseOrder>
  <ApplicationArea>
    <Sender><LogicalID>lid://infor.procurement.1</LogicalID></Sender>
    <BODID>proc-order-001</BODID>
  </ApplicationArea>
  <DataArea>
    <Process>
      <ActionCriteria><ActionExpression actionCode="Add"/></ActionCriteria>
    </Process>
    <PurchaseOrder><!-- order details --></PurchaseOrder>
  </DataArea>
</ProcessPurchaseOrder>

<!-- SOR responds with AcknowledgePurchaseOrder -->
<AcknowledgePurchaseOrder>
  <ApplicationArea>
    <Sender><LogicalID>lid://infor.erp.1</LogicalID></Sender>
    <BODID>ack-order-001</BODID>
  </ApplicationArea>
  <DataArea>
    <Acknowledge>
      <OriginalApplicationArea><BODID>proc-order-001</BODID></OriginalApplicationArea>
      <ResponseCriteria><ResponseExpression actionCode="Accepted"/></ResponseCriteria>
    </Acknowledge>
  </DataArea>
</AcknowledgePurchaseOrder>

Verify: Original Process BOD shows "Acknowledged" in ION OneView; Acknowledge BOD delivered to requester.

Code Examples

Python: Send a BOD via ION API Gateway

# Input:  OAuth credentials (.ionapi file), BOD XML string
# Output: HTTP 200 on successful BOD submission

import requests
import json

# Load ION API credentials from .ionapi file
with open("myapp.ionapi", "r") as f:
    creds = json.load(f)

# Step 1: Obtain OAuth token
token_url = f"{creds['pu']}/as/{creds['oa']}/token.oauth2"
token_resp = requests.post(token_url, data={
    "grant_type": "password",
    "username": creds["saak"],    # Service Account Access Key
    "password": creds["sask"],    # Service Account Secret Key
    "client_id": creds["ci"],
    "client_secret": creds["cs"]
})
access_token = token_resp.json()["access_token"]

# Step 2: Send BOD XML via ION API
headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/xml"
}
bod_xml = """<SyncItemMaster xmlns="http://schema.infor.com/InforOAGIS/2">
  <!-- BOD content here -->
</SyncItemMaster>"""

response = requests.post(
    f"{creds['pu']}/{creds['ot']}/IONMessaging/api/bod",
    headers=headers,
    data=bod_xml
)
print(f"Status: {response.status_code}")  # 200 = success

cURL: Test ION API Gateway authentication

# Input:  OAuth token endpoint, client credentials, service account keys
# Output: Access token JSON response

# Step 1: Get OAuth token
curl -X POST "https://{tenant}.inforcloudsuite.com/as/{tenant_id}/token.oauth2" \
  -d "grant_type=password" \
  -d "username={SERVICE_ACCOUNT_ACCESS_KEY}" \
  -d "password={SERVICE_ACCOUNT_SECRET_KEY}" \
  -d "client_id={CLIENT_ID}" \
  -d "client_secret={CLIENT_SECRET}"

# Expected: {"access_token":"eyJ...", "token_type":"bearer", "expires_in":3600}

# Step 2: Send a BOD
curl -X POST "https://{tenant}.inforcloudsuite.com/{tenant_id}/IONMessaging/api/bod" \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "Content-Type: application/xml" \
  -d @sync_item_master.xml

Data Mapping

BOD XML Structure Reference

ElementLocationTypePurposeGotcha
LogicalIDApplicationArea > SenderString (lid://...)Unique app instance identifierMust match connection point config exactly
BODIDApplicationAreaUUIDUnique message identifierDuplicates cause silent drops — use UUID v4
CreationDateTimeApplicationAreaDateTime (UTC)When BOD was createdMust be UTC; local time causes routing errors
ActionExpressionDataArea > VerbAttribute (actionCode)Add, Replace, Change, DeleteSync uses Add/Replace; Process uses Add/Change
TenantEmbedded in LogicalIDStringMulti-tenant routing keyWrong tenant ID routes BOD to wrong environment
AccountingEntityDataArea > NounStringFinancial entity contextRequired for multi-entity deployments

Data Type Gotchas

Error Handling & Failure Points

Common Error Patterns

ErrorMeaningCauseResolution
Confirm BOD generatedMessage processing failedReceiver threw exception or timed outReview in ION Desk; fix data; resubmit
Connection point "Paused"No messages processedManual pause or maintenanceResume in ION Desk; messages replay from queue
BOD schema validation errorXML doesn't match OAGIS schemaWrong namespace or missing elementsValidate against Infor OAGIS schema
LN/Baan processing timeoutBshell did not respondComplex logic or DB locks in LNIncrease timeout; optimize LN processing
"Message size exceeds limit"BOD payload too largeLarge master data syncSplit into multiple BODs; upgrade tier
OAuth token expired (401)API Gateway auth failedToken not refreshedImplement token refresh with TTL check

Failure Points in Production

Anti-Patterns

Wrong: Polling ION API Gateway for changes

# BAD — Polling REST API every 30 seconds for changes
while True:
    response = requests.get(f"{base_url}/api/items?modifiedAfter={last_check}")
    process_changes(response.json())
    time.sleep(30)
# Wastes API Gateway capacity, misses changes between polls

Correct: Subscribe to Sync BODs via document flow

# GOOD — Configure document flow in ION Desk
# 1. Create connection point for your application
# 2. Create document flow: ERP (source) -> YourApp (target)
# 3. Select SyncItemMaster BOD
# 4. ION pushes changes to your inbox automatically
# Result: Zero polling, guaranteed delivery, near-real-time

Wrong: Sending large bulk data as a single BOD

<!-- BAD — 50,000 line items in one BOD = ~30 MB -->
<!-- Exceeds Essentials/Professional tier limits -->

Correct: Chunk into smaller BODs

<!-- GOOD — Split into batches of 500 items each (~300 KB) -->
<!-- Use BODID convention (batch-001-of-100) to track completeness -->

Wrong: Assuming SOR is always the ERP

# BAD — Hardcoding ERP as system of record for all objects
# "Customer master comes from ERP" — WRONG if CRM owns customer data

Correct: Define SOR per business object

# GOOD — SOR designation per noun:
# Customer -> CRM is SOR (publishes SyncCustomer)
# ItemMaster -> ERP is SOR (publishes SyncItemMaster)
# Document the SOR map before configuring any document flows

Common Pitfalls

Diagnostic Commands

# Check ION connection point status
# ION Desk > Connect > Connection Points > select CP > Status tab
# Look for: Active (green), Paused (yellow), Error (red)

# Monitor document flow throughput
# ION Desk > Connect > Document Flows > select flow > Monitoring tab
# Shows: messages/hour, failed count, queue depth

# View Confirm BODs (failed messages)
# ION Desk > Connect > OneView > filter by Status = "Error"

# Test BOD delivery end-to-end
# ION Desk > Connect > Test > select document flow > Send test BOD

# Check Enterprise Connector health (on-premise)
# EC Admin Console > Status > check "Connected" indicator

# Monitor message queue depth
# ION Desk > Connect > Connection Points > select CP > Queue tab

Version History & Compatibility

VersionRelease DateStatusBreaking ChangesMigration Notes
2024.x (Cloud)2024-01CurrentKafka connection points addedNew connector — no impact on existing flows
2023.x (Cloud)2023-01SupportedSFTP from Cloud connector addedAlternative to EC-routed SFTP
12.0.x (On-Premise)2020-01SupportedLast major on-premise releaseCloud migration via Enterprise Connector
11.x (On-Premise)2017-01EOLUpgrade to 12.0.x or cloud

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Async event-driven sync between Infor CloudSuite appsSynchronous real-time CRUD with <1s responseION API Gateway REST endpoints
Standardized XML messaging with built-in routing and monitoringCustom binary or non-XML payload formatsFile or Kafka Connection Point
Multi-subscriber broadcast of data changes (pub-sub)Point-to-point low-latency API callsION API Gateway direct REST
Need guaranteed delivery with error handling via Confirm BODsNeed message replay/rewind from arbitrary offsetKafka-based integration
Integration between on-premise and cloud Infor systemsPure cloud-to-cloud REST API integrationION API Gateway with OAuth

Important Caveats

Related Units