IFS Event Architecture: ECA Rules, Event Actions, and Event-Driven Integration Guide

Type: ERP Integration System: IFS Cloud (24R2 / 25R1) Confidence: 0.84 Sources: 7 Verified: 2026-03-03 Freshness: 2026-03-03

TL;DR

System Profile

IFS Cloud is an enterprise ERP platform focused on asset-intensive industries (aerospace, defense, energy, manufacturing, construction). Its event architecture is built into the Oracle database layer, implementing the ECA (Event-Condition-Action) pattern directly in PL/SQL business logic. The Event Registry manages all event definitions, conditions, and action mappings. Events can trigger seven different action types including REST calls for webhook-style outbound integrations, Workflow starts via the embedded Camunda engine, and Streams notifications for in-app messaging. This card covers the event framework across all IFS Cloud editions (24R2 and 25R1). [src1, src3, src7]

PropertyValue
VendorIFS
SystemIFS Cloud 24R2 / 25R1
API SurfaceEvent Framework (ECA) + OData REST
Current VersionFoundation1 / 24R2
Editions CoveredAll editions
DeploymentCloud (SaaS) / Hybrid / On-Premise
API DocsIFS Events Documentation
StatusGA

API Surfaces & Capabilities

IFS Cloud provides multiple integration surfaces. The Event Framework is the primary mechanism for outbound, reactive integrations. [src1, src3, src6]

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
Event Framework (ECA)PL/SQL / DB triggersOutbound notifications, webhook REST calls, workflow triggersPer-event (single entity change)No explicit limit (DB-bound)YesNo
OData REST API (Projections)HTTPS/JSON (OData v4)CRUD operations, queries, integrationsConfigurable (5,000+ projections)Fair-use / throttledYesPartial (paged)
IFS ConnectXML/XSLT message busAsync message routing, connector integrationsPer-messageDepends on routing configAsyncNo
Workflows (Camunda)REST / BPMNMulti-step process orchestration, human tasksN/AN/AYesN/A
Streams NotificationsInternal messagingIn-app user notificationsN/AN/AYesN/A
Application MessagesXML via connectorsB2B integrations (EDI, partner connectors)Per-messageConnector-dependentAsyncNo

Rate Limits & Quotas

Per-Request Limits

IFS Cloud does not publish explicit per-request rate limits for the event framework. Events fire synchronously within database transactions, so throughput is bounded by database capacity. [src1, src3]

Limit TypeValueApplies ToNotes
Event actions per eventNo hard limitEvent FrameworkMultiple actions registered per event; all execute sequentially within the transaction
REST Call timeoutConfigurable (default varies)REST Call event actionOutbound REST calls exceeding timeout fail silently; no retry
Streams message recipientsUser-scopedStreams Message actionNotifications delivered only to Foundation1 users
Execute Online SQL scopeSingle transactionExecute Online SQLSQL runs within the triggering transaction — failure rolls back everything

Rolling / Daily Limits

Limit TypeValueWindowEdition Differences
OData API requestsFair-use / throttledPer-sessionNot edition-specific; IFS manages throttling at proxy layer
Concurrent API sessionsTenant-dependentPer-tenantControlled by IFS IAM; depends on deployment topology
Workflow engine capacityInstance-dependentPer-instanceCamunda throughput depends on infrastructure sizing
Application Message throughputConnector-dependentPer-connectorIFS Connect routing rules control message flow rates

Authentication

IFS Cloud uses OAuth 2.0 via the IFS Identity and Access Manager (IFS IAM) for API access. The event framework itself does not require separate authentication. Outbound REST Call event actions can include authentication headers. [src6]

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 Client CredentialsServer-to-server, scheduled jobsConfigurable via IFS IAMYesRecommended for integrations
OAuth 2.0 Authorization CodeUser-context, interactive appsSession-dependentYesRequires redirect URI configuration
Basic AuthenticationData migration onlySession timeoutNoExplicitly not recommended for production
Bearer Token (REST Call action)Outbound REST calls from eventsPre-configuredNoStatic token; no auto-refresh
OAuth 2.0 (Workflow delegate)Outbound REST calls from WorkflowsPer-requestYesSupported in IFS REST Call delegate

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- User needs event-driven integration with IFS Cloud
|-- What's the event source?
|   |-- IFS Cloud entity change (insert/update/delete)
|   |   |-- System-defined event exists?
|   |   |   |-- YES --> Use system-defined event (better performance) [src1]
|   |   |   |-- NO --> Create custom event on entity's base table [src1, src3]
|   |   |-- What action do you need?
|   |       |-- Notify external system (webhook)? --> REST Call event action [src2]
|   |       |-- Complex multi-step process? --> Start Workflow event action [src4, src7]
|   |       |-- Send email? --> E-Mail event action [src1]
|   |       |-- Execute database logic? --> Execute Online SQL (CAUTION) [src1]
|   |       |-- Notify IFS users? --> Streams Message [src1]
|   |       |-- Route to middleware? --> Application Message [src1]
|   |-- External system pushes data TO IFS Cloud?
|       |-- YES --> OData REST API (POST/PUT via projections) [src6]
|       |-- Need transformation? --> IFS Connect inbound connector [src1]
|-- Timing requirement?
|   |-- Real-time (<1s) --> REST Call event action [src2]
|   |-- Near real-time --> Workflow orchestrates async REST calls [src4, src5]
|   |-- Batch/scheduled --> OData API polling with date filter [src6]
|-- Error tolerance?
    |-- Zero-loss --> Workflow with retry + IFS Connect [src4, src5]
    |-- Best-effort --> REST Call event action (fire-and-forget) [src2]

Quick Reference

Event Action Types

Action TypePurposeExecution ContextExternal?Retry?Notes
E-MailSend email notificationsAsync (mail queue)Yes (SMTP)Mail server retrySupports substitution fields for dynamic content
Execute Online SQLRun PL/SQL/SQL statementsSynchronous (same transaction)NoNoCAUTION: failure rolls back triggering transaction
Application MessageRoute to IFS ConnectAsync (message queue)Yes (via connector)Connector-dependentSupports XSLT transformation
TaskCreate user assignmentSynchronousNoN/AVisible in Enterprise Explorer
Start WorkflowTrigger Camunda workflowAsync (workflow engine)Yes (via workflow)Workflow-definedPrimary mechanism for complex multi-step integrations
Streams MessageIn-app notificationAsyncNoN/AFoundation1 users only
REST CallOutbound HTTP requestSynchronousYesNoWebhook-style; fire-and-forget

Event Parameter Substitution Fields

Field TypeSyntaxExampleNotes
New value after changeNEW:{AttributeName}NEW:ORDER_STATUSAvailable for insert and update events
Old value before changeOLD:{AttributeName}OLD:ORDER_STATUSAvailable for update and delete events
Event-specific field&{FieldName}&EVENT_DATETIMEStandard parameters: datetime, user, rowkey
Context variable#{ContextVar}#USER_IDENTITYSystem-level: user, mail, phone

Step-by-Step Integration Guide

1. Identify or create the event

Navigate to IFS Solution Manager > Events. Check for existing system-defined events. If none exists, create a custom event by selecting the Logical Unit, trigger type, and timing. [src1, src3]

Steps in IFS Cloud:
1. Navigate to Solution Manager > Events
2. Search for target entity (Logical Unit name)
3. If system-defined event exists: click to view (read-only except subscriptions)
4. If no system event, create Custom Event:
   - Click "+" to add new event
   - Select Logical Unit (e.g., CustomerOrderLine)
   - Set trigger: "New" / "Modify" / "Remove"
   - Set timing: "After" (post-commit, safer) or "Before" (pre-commit, can block)
   - Select attributes to expose as NEW: and OLD: parameters
   - Enable the event

Verify: Event appears in list with status "Enabled". For custom events, verify the database trigger was created.

2. Define conditions for the event action

Add conditions that filter when the action should execute. [src1]

Condition configuration:
1. Open event action configuration
2. Add conditions using parameter substitution:
   Example: NEW:ORDER_STATUS = 'Released' AND OLD:ORDER_STATUS != 'Released'
3. Multiple conditions are AND-ed by default
4. Leave conditions empty to fire on every event occurrence

Verify: Test with matching and non-matching record modifications. Only matching records trigger the action.

3. Configure a REST Call event action (webhook)

Create a REST Call action to notify external systems when the event fires. [src2]

REST Call event action setup:
1. In Event Actions, click "+" to add new action
2. Set Action Type: "REST Call"
3. Configure:
   - URL: https://external-system.example.com/webhook/ifs-event
   - Method: POST
   - Headers: Content-Type: application/json
   - Body:
     {
       "event": "order_status_change",
       "order_no": "NEW:ORDER_NO",
       "old_status": "OLD:ORDER_STATUS",
       "new_status": "NEW:ORDER_STATUS",
       "changed_by": "#USER_IDENTITY",
       "timestamp": "&EVENT_DATETIME"
     }
4. Authentication: Bearer Token (if required)
5. Enable the event action

Verify: Change a matching record. Check external system's webhook endpoint logs for the incoming POST request.

4. Configure a Workflow event action

For complex multi-step integrations, trigger a Camunda workflow instead of a direct REST call. [src4, src7]

Workflow event action setup:
1. In Event Actions, set Action Type: "Workflow"
2. Reference the deployed Workflow process definition key
3. Map event parameters to workflow input variables
4. Enable the event action

The workflow handles:
- Multiple outbound REST calls with retry logic
- Human approval tasks if needed
- Error handling and compensation

Verify: Trigger the event. Check IFS Workflow Monitor for a new workflow instance.

5. Start a workflow via REST API (external trigger)

External systems can invoke IFS Workflows directly via the Camunda REST API. [src4]

# Get OAuth token from IFS IAM
TOKEN=$(curl -s -X POST \
  "https://yourifs.cloud/auth/realms/ifs/protocol/openid-connect/token" \
  -d "grant_type=client_credentials" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "client_secret=YOUR_CLIENT_SECRET" \
  | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")

# Start a workflow instance
curl -X POST \
  "https://yourifs.cloud/main/ifsapplications/projection/engine-rest/process-definition/key/MyWorkflow/start" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "withVariablesInReturn": true,
    "variables": {
      "orderNumber": {"value": "CO-12345", "type": "String"},
      "integrationTarget": {"value": "external-erp", "type": "String"}
    }
  }'

Verify: Query workflow history to confirm instance completed successfully.

6. Implement outbound REST calls from a Workflow

Use the IFS REST Call delegate within a Camunda workflow service task. [src5]

<!-- Camunda service task for REST Call delegate -->
<serviceTask id="callExternalApi" name="Call External System"
  camunda:delegateExpression="${ifsHttpConnectionDelegate}">
  <extensionElements>
    <camunda:inputOutput>
      <camunda:inputParameter name="ifsBpaHttpConnectionMethod">POST</camunda:inputParameter>
      <camunda:inputParameter name="ifsBpaHttpConnectionUrl">
        https://external-system.example.com/api/orders
      </camunda:inputParameter>
      <camunda:inputParameter name="ifsBpaHttpConnectionHeaders">
        {"Content-Type": "application/json"}
      </camunda:inputParameter>
      <camunda:inputParameter name="ifsBpaHttpConnectionBody">
        {"order_no": "${orderNumber}", "status": "${newStatus}"}
      </camunda:inputParameter>
      <camunda:inputParameter name="ifsBpaHttpConnectionOutputs">
        {"externalId": "$.id", "confirmationCode": "$.confirmation"}
      </camunda:inputParameter>
      <camunda:inputParameter name="ifsBpaRestResponseCheck">true</camunda:inputParameter>
    </camunda:inputOutput>
  </extensionElements>
</serviceTask>

Verify: After workflow completes, check that output variables are populated in workflow history.

Code Examples

Python: Receive IFS webhook events

# Input:  Incoming HTTP POST from IFS REST Call event action
# Output: Processed event data, logged and acknowledged

# pip install flask==3.x
from flask import Flask, request, jsonify
import logging, json

app = Flask(__name__)
logging.basicConfig(level=logging.INFO)

@app.route("/webhook/ifs-event", methods=["POST"])
def handle_ifs_event():
    payload = request.get_json(force=True)
    event_type = payload.get("event", "unknown")
    logging.info(f"IFS event: {event_type} | {json.dumps(payload)}")

    if event_type == "order_status_change":
        order_no = payload.get("order_no")
        new_status = payload.get("new_status")
        # Add your business logic here

    return jsonify({"status": "received"}), 200

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

JavaScript/Node.js: OData polling fallback

// Input:  IFS Cloud instance URL, OAuth credentials
// Output: Changed records since last poll timestamp

// npm install [email protected]
const axios = require("axios");

async function getIfsToken(ifsUrl, clientId, clientSecret) {
  const resp = await axios.post(
    `${ifsUrl}/auth/realms/ifs/protocol/openid-connect/token`,
    new URLSearchParams({
      grant_type: "client_credentials",
      client_id: clientId,
      client_secret: clientSecret,
    }),
    { headers: { "Content-Type": "application/x-www-form-urlencoded" } }
  );
  return resp.data.access_token;
}

async function pollChangedOrders(ifsUrl, token, sinceTimestamp) {
  const url = `${ifsUrl}/main/ifsapplications/projection/v1/CustomerOrderHandling.svc/CustomerOrderSet`;
  const resp = await axios.get(url, {
    headers: { Authorization: `Bearer ${token}`, Accept: "application/json" },
    params: { $filter: `Objversion gt '${sinceTimestamp}'`, $top: 100 },
  });
  return resp.data.value || [];
}

cURL: Test IFS Cloud connectivity

# Step 1: Get OAuth token
TOKEN=$(curl -s -X POST \
  "https://yourifs.cloud/auth/realms/ifs/protocol/openid-connect/token" \
  -d "grant_type=client_credentials&client_id=ID&client_secret=SECRET" \
  | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")

# Step 2: Query OData projection
curl -s "https://yourifs.cloud/main/ifsapplications/projection/v1/CustomerOrderHandling.svc/CustomerOrderSet?\$top=3" \
  -H "Authorization: Bearer $TOKEN" -H "Accept: application/json"

# Step 3: List workflow process definitions
curl -s "https://yourifs.cloud/main/ifsapplications/projection/engine-rest/process-definition" \
  -H "Authorization: Bearer $TOKEN" | python3 -m json.tool

Data Mapping

Event Parameter Mapping Reference

IFS Event ParameterExternal FieldTypeTransformGotcha
NEW:ORDER_NOorder_numberStringDirectFormat includes prefix (e.g., "CO-12345")
NEW:ORDER_STATUSstatusString (enum)Map to external codesIFS uses internal status codes
OLD:ORDER_STATUSprevious_statusString (enum)Map to external codesOnly available in Modify events
&EVENT_DATETIMEevent_timestampDateTimeISO 8601 conversionServer-local time zone, not UTC
#USER_IDENTITYchanged_byStringDirectIFS user ID, not display name
#USER_MAIL_ADDRESSuser_emailStringDirectMay be empty if not configured
&ROWKEYrecord_keyString (GUID)DirectEnables deep linking back to IFS record
LOB attachmentsN/ABinaryNot availableLOBs excluded from event parameters

Data Type Gotchas

Error Handling & Failure Points

Common Error Scenarios

ScenarioSymptomCauseResolution
Execute Online SQL failureUser's transaction rolls back with generic errorSQL syntax error or constraint violationWrap SQL in BEGIN...EXCEPTION...END blocks
REST Call timeoutEvent fires but external system never receives payloadTarget endpoint slow or unreachableImplement health check; consider Workflow with retry
Custom event performance hitSlow insert/update on affected tableDatabase trigger overhead on high-volume tableReview trigger necessity; consider async Application Message
OAuth token expiredREST Call returns 401 silentlyStatic Bearer Token in event action expiredUse Workflow with OAuth 2.0 delegate for auto-refresh
Workflow fails to startEvent fires but no workflow instanceProcess definition key mismatch or not deployedVerify process key in Workflow Monitor; redeploy
Condition evaluation errorEvent action never firesIncorrect substitution syntax or type mismatchTest conditions with known data; verify attribute names

Failure Points in Production

Anti-Patterns

Wrong: Using Execute Online SQL for external integration

-- BAD: runs in triggering transaction; HTTP call failure rolls back user's order
BEGIN
  send_http_request('https://external.com/api', :NEW:ORDER_NO);
  INSERT INTO external_db_link.orders VALUES (:NEW:ORDER_NO, :NEW:STATUS);
END;

Correct: Use REST Call event action or Workflow

-- GOOD: REST Call action fires within transaction but does not block on failure.
-- For guaranteed delivery, use Workflow:
Event Action Type: REST Call (or Workflow for retry)
URL: https://external.com/api/webhook
Method: POST
Body: {"order_no": "NEW:ORDER_NO", "status": "NEW:ORDER_STATUS"}

Wrong: Creating redundant custom events

-- BAD: creates a redundant database trigger alongside existing system event
Custom Event: CustomerOrder_Modify_After
(System-defined event already exists for CustomerOrder status changes)

Correct: Register actions on existing system-defined events

-- GOOD: attach action to existing system-defined event, no extra trigger overhead
Event: CustomerOrder.StatusChanged (system-defined)
Action Type: REST Call
Condition: NEW:ORDER_STATUS = 'Released'

Wrong: Relying solely on REST Call for mission-critical sync

-- BAD: no retry, no delivery confirmation, no dead letter queue
Event: InventoryTransaction.New
Action: REST Call to WMS
(If WMS is down 10 minutes, all inventory events are permanently lost)

Correct: Workflow with retry + polling fallback

-- GOOD: Workflow handles retry; polling catches gaps
Event: InventoryTransaction.New
Action: Start Workflow "InventorySyncWorkflow"
  - Service Task: REST Call to WMS (3 retries, exponential backoff)
  - Error Handler: Log to error table, send alert email

PLUS: Scheduled OData polling job every 15 minutes as reconciliation

Common Pitfalls

Diagnostic Commands

# Test IFS Cloud OAuth authentication
curl -s -X POST "https://yourifs.cloud/auth/realms/ifs/protocol/openid-connect/token" \
  -d "grant_type=client_credentials&client_id=CLIENT_ID&client_secret=SECRET" \
  | python3 -c "import sys,json;d=json.load(sys.stdin);print('Auth OK' if 'access_token' in d else f'Error: {d}')"

# Verify OData projection accessibility
curl -s "https://yourifs.cloud/main/ifsapplications/projection/v1/CustomerOrderHandling.svc/$metadata" \
  -H "Authorization: Bearer $TOKEN" -H "Accept: application/xml" | head -20

# List deployed workflow process definitions
curl -s "https://yourifs.cloud/main/ifsapplications/projection/engine-rest/process-definition" \
  -H "Authorization: Bearer $TOKEN" | python3 -c "import sys,json;[print(p['key'],p['name']) for p in json.load(sys.stdin)]"

# Check workflow instance history (last 10)
curl -s "https://yourifs.cloud/main/ifsapplications/projection/engine-rest/history/process-instance?sortBy=startTime&sortOrder=desc&maxResults=10" \
  -H "Authorization: Bearer $TOKEN" | python3 -m json.tool

# Monitor active workflow instances
curl -s "https://yourifs.cloud/main/ifsapplications/projection/engine-rest/process-instance?active=true" \
  -H "Authorization: Bearer $TOKEN" | python3 -c "import sys,json;d=json.load(sys.stdin);print(f'{len(d)} active instances')"

Version History & Compatibility

IFS ReleaseDateStatusEvent Framework ChangesMigration Notes
25R12025-06CurrentEnhanced workflow integration, improved monitoringWorkflow definitions may need redeployment
24R22024-10SupportedREST Call improvements, OAuth 2.0 in Workflow delegateVerify REST Call configurations after upgrade
23R12023-06SupportedCustom command workflow triggering addedNew capability; no breaking changes
22R12022-06LegacyWorkflow (Camunda) engine integration with eventsMinimum version for Workflow event actions
21R22021-10LegacyStreams Message event action type introduced--
Foundation1 (Apps 10)Pre-2021LegacyOriginal ECA framework (5 action types, no REST Call/Workflow)REST Call and Workflow require IFS Cloud upgrade

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Need real-time outbound notifications on entity changesNeed to poll IFS for changed records on a scheduleOData REST API with date filter polling
Want webhook-style integration without custom codeNeed guaranteed exactly-once deliveryMessage broker (IFS Connect + MQ) or middleware (MuleSoft, Boomi)
Triggering multi-step processes (approvals, multi-system sync)Need simple CRUD operations on IFS dataOData REST API direct calls
Conditional email alerts on business entity changesNeed complex data transformation before sendingIFS Connect with XSLT transformers
Need to validate/block transactions before commitNeed high-volume streaming (>10K events/min)Dedicated streaming platform (Kafka, RabbitMQ) with OData polling

Important Caveats

Related Units