Epicor Service Connect: Workflow and Integration Engine Capabilities

Type: ERP Integration System: Epicor Kinetic (Service Connect 10.2.x) Confidence: 0.78 Sources: 7 Verified: 2026-03-02 Freshness: 2026-03-02

TL;DR

System Profile

Epicor Service Connect (ESC) is the built-in integration middleware for Epicor Kinetic (formerly Epicor ERP 10). It provides a visual Workflow Designer for building data transformation and orchestration flows without extensive custom code. ESC operates as a Windows service and processes messages through configurable input/output channels. Available for on-premise and hybrid deployments; cloud SaaS deployments may have restricted ESC access. As of Kinetic 2023.2, Epicor also offers Data Fabric (Kafka-based) as a cloud-native alternative. [src1, src2]

PropertyValue
VendorEpicor
SystemEpicor Kinetic (Service Connect 10.2.x)
API SurfaceSOAP, REST (v1/v2), .NET Assemblies, XML Web Services
Current VersionKinetic 2024.x / ESC 10.2.700+
Editions CoveredAll Epicor Kinetic editions with Service Connect license add-on
DeploymentOn-Premise / Hybrid (limited in SaaS)
API DocsEpicor Service Connect (instance-specific REST help at /apps/resthelp/)
StatusGA (actively maintained)

API Surfaces & Capabilities

ESC interacts with Epicor and external systems through multiple API surfaces. The primary method is .NET Reference calls to Epicor business objects within ESC workflows, while REST and SOAP APIs provide alternative access paths for external integrations. [src1, src4]

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
.NET Reference (BO calls).NET AssemblyDirect Epicor BO operations within ESC workflowsTransaction-dependentNo explicit limitYesNo
REST API v2HTTPS/JSON+ODataExternal integrations, mobile/web apps$top/$skip pagination (default 100)None built-in (IIS-configured)YesVia batch
SOAP/WCF ServicesHTTPS/XMLLegacy integrations, .NET clients2,000+ per queryNone built-inYesNo
ESC Web Service EndpointHTTPS/XMLExposing ESC workflows as callable servicesPer-workflowN/AYesNo
File Channel (CSV/XML/Excel)File systemScheduled batch imports/exportsFile size limited by memoryN/ANoYes
FTP/Email ChannelFTP/SMTPRemote file pickup, email-triggered workflowsFile/message sizeN/ANoYes
MSMQ ChannelMSMQReliable queued messaging4 MB default message sizeQueue depthYesNo

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
REST API default page size100 recordsREST API v2 OData queriesUse $top and $skip for pagination [src4]
REST API request bodyServer-configuredREST API POST/PATCHIIS maxAllowedContentLength (default 28.6 MB)
MSMQ message size4 MB defaultMSMQ channelConfigurable via MSMQ settings on server
File channel file sizeMemory-boundCSV/XML/Excel importsLarge files (>50 MB) may cause OutOfMemoryException
$batch subrequestsServer-configuredREST API v2 batchIIS request limits apply

Rolling / Daily Limits

Limit TypeValueWindowEdition Differences
REST API callsNo built-in limitN/AMust configure via IIS Dynamic IP Restrictions or reverse proxy [src5]
Concurrent REST sessionsIIS AppPool worker threadsPer-AppPoolDefault: 25 worker threads per AppPool
ESC concurrent workflowsThread pool-dependentPer ESC service instanceDefault configurable in ESC admin; typically 5-20 concurrent
Web Service license seatsLicense-dependentPer-orgExhaustion causes progressive response time degradation [src5]

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
Basic AuthenticationSimple REST API integrations, testingPer-request (stateless)N/ABase64 username:password. Most common for ESC REST calls. [src4]
OAuth 2.0 (ROPC)Production REST integrations~20 min (configurable)Yes (refresh token)POST to /Token endpoint with grant_type=password. [src4]
API Key (REST v2)Programmatic accessPersistent until revokedN/AConfigured per-user in Epicor Admin Console. REST v2 only. [src4]
Epicor Session (.NET)ESC internal BO callsSession durationAutomaticDedicated service account required. [src3]
Windows AuthenticationOn-premise intranetWindows sessionN/AIIS-level SSO for domain-joined clients

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Integrate with Epicor Kinetic
|-- What is the integration surface?
|   |-- Service Connect (ESC) workflow orchestration
|   |   |-- Data source format?
|   |   |   |-- XML --> Direct input channel (File, FTP, MSMQ, Web Service)
|   |   |   |-- CSV/Excel/Fixed-width --> Conversion Map + File channel
|   |   |   |-- Database --> dbLookup functoid within workflow
|   |   |   |-- Epicor BO call --> .NET Reference activity
|   |   |-- Integration trigger?
|   |   |   |-- Scheduled --> File channel with folder polling
|   |   |   |-- Event-driven --> BPM directive triggers ESC workflow
|   |   |   |-- On-demand --> Expose workflow as Web Service endpoint
|   |   |   |-- Queue-based --> MSMQ channel for reliable delivery
|   |   |-- Error handling approach?
|   |       |-- Simple notification --> Choice + Poster (email) [src3]
|   |       |-- UD table logging --> Choice + UpdateExt to UD table [src3]
|   |       |-- Full reprocessing --> Log all fields to UD + errors [src3]
|   |-- Direct REST API (bypass ESC)
|   |   |-- Volume < 1,000 records/day --> REST API v2 + Basic Auth/API Key
|   |   |-- Volume > 1,000 records/day --> REST API v2 + batch + IIS throttle
|   |   |-- Real-time notifications --> BPM + Epicor Functions + REST callout
|   |-- Epicor Data Fabric (Kinetic 2023.2+)
|       |-- Cloud-native event streaming --> Apache Kafka via Confluent Cloud
|       |-- High-volume real-time CDC --> Data Fabric preferred over ESC

Quick Reference

Workflow ElementTypePurposeNotes
.NET ReferenceActivityCall Epicor BO methods (GetNew, Update, GetList)Core activity for all Epicor data operations [src2]
XML MapperActivityTransform XML structure between schemasDrag-and-drop field mapping with functoid support [src2]
ChoiceControl FlowConditional branching / error checkingEssential after every .NET Reference call [src3]
PosterActivitySend email notifications, write to channelsError notification pattern [src3]
dbLookupFunctoidQuery external databases within XML MapperUses ADO.NET; connection string required [src2]
Conversion MapActivityConvert non-XML formats to XMLRequired for CSV/Excel/fixed-width imports
SchedulerConfigurationTime-based workflow triggersCron-style scheduling within ESC admin
Human WorkflowActivityUser task assignment with emailApproval-based integration flows [src1]
Web Service EndpointChannelExpose workflow as callable SOAP serviceExternal systems invoke via WSDL
File Drop ChannelChannelMonitor folder for new filesUNC paths supported; configurable polling interval
FTP ChannelChannelMonitor FTP/SFTP for filesEDI and partner data exchange [src1]
MSMQ ChannelChannelMicrosoft Message Queue integrationTransactional delivery; survives ESC restart
Email ChannelChannelProcess inbound emails/attachmentsEmail-triggered workflows
COM ChannelChannelCOM-based application interactionLegacy; rarely used in modern integrations

Step-by-Step Integration Guide

1. Set up dedicated Service Connect user

Create a dedicated Epicor user for ESC that will never be used for interactive logins. Assign appropriate security groups. [src3]

Epicor Admin steps:
1. Go to System Setup > Security Maintenance > User Account Maintenance
2. Create user: "ESC_SvcAcct" with strong password
3. Assign to security groups covering required BO access
4. Set default plant, company, and site context
5. NEVER log in interactively with this account
6. Configure ESC service to use these credentials

Verify: Log in to ESC Administration Console and confirm the service account can connect to the Epicor application server.

2. Create a workflow package and input channel

Open the Workflow Designer, create a new Workflow Package, then configure an input channel for your data source. [src2]

Workflow Designer steps:
1. Right-click Workflow Packages > New Package > name: "SalesOrderImport"
2. Right-click package > New Workflow > name: "ImportSalesOrders"
3. Configure Input Channel:
   - Type: File Drop
   - Path: \\server\share\incoming\sales_orders\
   - File Pattern: *.xml (or *.csv with conversion map)
   - Polling Interval: 60 seconds
4. If CSV: Add Conversion Map activity to convert CSV to XML

Verify: Drop a test file in the monitored folder and confirm ESC picks it up via Workflow Monitor.

3. Add .NET Reference activities for BO calls

Drag .NET Reference activities onto the workflow canvas. Browse to target Epicor business objects and map fields via XML Mapper. [src2, src4]

.NET Reference configuration:
1. Drag ".NET Reference" activity to workflow canvas
2. Browse Assembly: Erp.Contracts.BO.SalesOrder.dll
3. Select Method: GetNewOrderHed
4. Open XML Mapper: drag source XML fields to target BO dataset fields
5. Add second .NET Reference: SalesOrderSvc.Update
6. Map all required fields (CustNum, OrderDate, OrderLines, etc.)

Verify: Right-click the .NET Reference activity > Test with sample data. Check Epicor for created records.

4. Implement error handling with Choice elements

After every .NET Reference call, add a Choice element to check for errors. Branch to error handling (email, UD table, or both). [src3]

Error handling pattern:
1. After each .NET Reference, add Choice element
2. Condition: Check callContext.ExceptionMessage != ""
   - TRUE branch: Error occurred
     - Option A: Poster (email to admin) -- simplest
     - Option B: .NET Reference to UD table (UpdateExt) -- queryable audit trail
     - Option C: Log all input fields + error details -- enables re-run
   - FALSE branch: Continue to next step

Verify: Send malformed data deliberately. Confirm error notification received and/or UD table entry created.

Code Examples

Python: Query Epicor via REST API v2

# Input:  Epicor server URL, credentials, business object name
# Output: JSON array of records from Epicor

import requests
from requests.auth import HTTPBasicAuth

server = "https://epicor-server/ERP_Instance"
username = "ESC_SvcAcct"
password = "YourSecurePassword"

url = f"{server}/api/v2/odata/Erp.BO.SalesOrderSvc/SalesOrderHeds"
params = {
    "$filter": "OrderHeld eq false",
    "$select": "OrderNum,CustNum,OrderDate,OrderTotal",
    "$top": 50,
    "$orderby": "OrderDate desc"
}

response = requests.get(
    url, params=params,
    auth=HTTPBasicAuth(username, password),
    headers={"Accept": "application/json"}
)

if response.status_code == 200:
    data = response.json()
    for order in data.get("value", []):
        print(f"Order {order['OrderNum']}: ${order['OrderTotal']}")
elif response.status_code == 401:
    print("Authentication failed - check credentials")
else:
    print(f"Error {response.status_code}: {response.text}")

JavaScript/Node.js: Create a Sales Order via REST API v2

// Input:  Epicor server URL, credentials, customer number
// Output: Created sales order number

const fetch = require("node-fetch"); // npm install node-fetch@2
const server = "https://epicor-server/ERP_Instance";
const credentials = Buffer.from("username:password").toString("base64");

async function createSalesOrder(custNum) {
  const getNewResp = await fetch(
    `${server}/api/v2/odata/Erp.BO.SalesOrderSvc/GetNewOrderHed`,
    {
      method: "POST",
      headers: {
        Authorization: `Basic ${credentials}`,
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      body: JSON.stringify({ ds: {} }),
    }
  );
  if (!getNewResp.ok) throw new Error(`GetNewOrderHed: ${getNewResp.status}`);

  const ds = await getNewResp.json();
  ds.parameters.ds.OrderHed[0].CustNum = custNum;

  const updateResp = await fetch(
    `${server}/api/v2/odata/Erp.BO.SalesOrderSvc/Update`,
    {
      method: "POST",
      headers: {
        Authorization: `Basic ${credentials}`,
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      body: JSON.stringify({ ds: ds.parameters.ds }),
    }
  );
  if (!updateResp.ok) throw new Error(`Update: ${updateResp.status}`);

  const result = await updateResp.json();
  console.log("Created Order:", result.parameters.ds.OrderHed[0].OrderNum);
}
createSalesOrder(1234).catch(console.error);

cURL: Quick REST API test

# Input:  Epicor server URL, credentials
# Output: JSON response from business object query

# Test Basic Auth connectivity
curl -s -X GET \
  "https://epicor-server/ERP_Instance/api/v2/odata/Erp.BO.SalesOrderSvc/SalesOrderHeds?\$top=5" \
  -H "Authorization: Basic $(echo -n 'username:password' | base64)" \
  -H "Accept: application/json" | jq .

# Test OAuth token acquisition
curl -s -X POST \
  "https://epicor-server/ERP_Instance/Token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=password&username=ESC_SvcAcct&password=YourPassword" | jq .

Data Mapping

Field Mapping Reference

Epicor FieldREST API PathTypeTransformGotcha
OrderHed.OrderNumSalesOrderHeds(OrderNum)IntAuto-assignedRead-only after creation
OrderHed.CustNumSalesOrderHeds.CustNumIntDirectMust exist in Customer table
OrderHed.OrderDateSalesOrderHeds.OrderDateDateTimeISO 8601REST: 2026-03-02T00:00:00; ESC XML: .NET DateTime
OrderDtl.PartNumSalesOrderDtls.PartNumStringDirectMax 50 chars; must exist in Part table
OrderDtl.OrderQtySalesOrderDtls.OrderQtyDecimalDirectPrecision depends on UOM setup
Customer.NameCustomers.NameStringDirectMax 50 chars in Epicor
JobHead.JobNumJobHeads.JobNumStringDirectMax 14 chars; alphanumeric only

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
BPM ExceptionBusiness logic violationBPM rule prevents operationCheck BPM directives; add pre-validation [src6]
"null value" errorRequired field missingUpgrade added new required fieldsCompare BO schema pre/post upgrade; update XML Mapper [src7]
"Object reference not set"Null referenceMissing parent record or bad dataset structureEnsure GetNew called before Update; verify dataset hierarchy
401 UnauthorizedAuth failureBad credentials or expired tokenVerify username/password; acquire new token [src4]
429 Too Many RequestsIIS rate limit hitToo many concurrent API callsImplement backoff; increase IIS limits [src5]
"Session limit reached"License exhaustionAll Web Service license seats consumedScale back concurrent workflows; purchase licenses [src5]
TimeoutBO method too slowLarge dataset or complex BPM processingIncrease WCF timeout; break into smaller batches
MSMQ fullQueue at capacityConsumer not processing fast enoughIncrease MSMQ storage limits; scale ESC threads

Failure Points in Production

Anti-Patterns

Wrong: No error handling after .NET Reference calls

<!-- BAD - no error check; failures are silent -->
<NetReference assembly="SalesOrderSvc" method="Update" />
<NetReference assembly="SalesOrderSvc" method="GetByID" />
<!-- If Update fails, GetByID runs on stale data -->

Correct: Choice element after every .NET Reference

<!-- GOOD - error check after every BO call -->
<NetReference assembly="SalesOrderSvc" method="Update" />
<Choice condition="callContext.ExceptionMessage != ''">
  <True>
    <Poster type="email" to="[email protected]"
            subject="ESC Error: SalesOrder Update failed"
            body="{callContext.ExceptionMessage}" />
    <Stop />
  </True>
  <False>
    <NetReference assembly="SalesOrderSvc" method="GetByID" />
  </False>
</Choice>

Wrong: Using interactive user account for ESC

// BAD - ESC runs as "JSmith" who also uses Epicor desktop client
// When JSmith switches to Plant B, ESC writes data to Plant B instead of Plant A
Service Account: JSmith (also logs in interactively)

Correct: Dedicated non-interactive service account

// GOOD - dedicated account with locked context
Service Account: ESC_SvcAcct
  - Never used for interactive login
  - Default Plant: Plant A (locked)
  - Default Company: Company01 (locked)
  - Security: Only BO permissions needed for workflows

Wrong: Loading entire large file in single ESC workflow

// BAD - 500,000-row CSV into ESC file channel
// ESC converts entire file to XML in memory -> OutOfMemoryException
Input: customers_full_export.csv (500,000 rows, 200 MB)

Correct: Pre-split files into manageable chunks

# GOOD - split large file into 10,000-row chunks
split -l 10000 --additional-suffix=.csv customers_full_export.csv chunk_
for f in chunk_*.csv; do
    cp "$f" /epicor/esc/incoming/
    sleep 30  # Allow ESC to process each chunk
done

Common Pitfalls

Diagnostic Commands

# Check ESC Windows service status
sc query "EpicorServiceConnect" | findstr STATE

# View ESC service logs (Windows Event Viewer)
wevtutil qe Application /q:"*[System[Provider[@Name='EpicorServiceConnect']]]" /c:20 /f:text

# Test REST API connectivity and authentication
curl -s -X GET \
  "https://epicor-server/ERP_Instance/api/v2/odata/Ice.BO.UserFileSvc/UserFiles?\$top=1" \
  -H "Authorization: Basic $(echo -n 'username:password' | base64)" \
  -H "Accept: application/json" | jq .

# Check IIS AppPool status
%systemroot%\system32\inetsrv\appcmd.exe list apppool "EpicorAppPool" /text:state

# Monitor IIS worker process memory
tasklist /fi "imagename eq w3wp.exe" /v

# Check MSMQ queue depth (if using MSMQ channel)
powershell "Get-MsmqQueue -Name 'EpicorESC*' | Select QueueName, MessageCount"

Version History & Compatibility

VersionRelease DateStatusBreaking ChangesMigration Notes
Kinetic 2024.12024-03CurrentNone for ESCField Service Management added; ESC unchanged
Kinetic 2023.22023-09SupportedData Fabric introducedKafka-based alternative; ESC still supported
Kinetic 2022.22022-09SupportedREST API v2 enhancementsv2 adds API Key auth; OData improvements
ERP 10.2.7002021-06Supported (legacy)Rebranded to KineticESC workflows from 10.2.x forward-compatible
ERP 10.2.5002020-03EOLESC installation changesNew installer; configs migrate automatically
ERP 10.2.4002019-06EOLBO dataset schema changesReview all XML mappings [src7]

Deprecation Policy

Epicor follows a rolling support model: current release and two prior releases are actively supported. Service Connect continues in Kinetic, though Data Fabric (2023.2+) represents the strategic direction for cloud-native integrations. No announced deprecation date for Service Connect. [src1]

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Multi-step data transformation with conditional logic and error handlingSimple CRUD on single business objectsEpicor REST API v2 direct calls
Scheduled file-based imports (CSV, Excel, XML from partners/EDI)High-volume real-time streaming (>1,000 TPS)Epicor Data Fabric (Kafka) or REST + message queue
BPM-triggered outbound integrations requiring data enrichmentSimple BPM email notifications or field calculationsEpicor BPM directives (no ESC needed)
Legacy SOAP/COM integrations with older partner systemsModern microservices architecture with REST APIsREST API v2 + iPaaS (MuleSoft, Boomi, Workato)
Reliable message-based integration via MSMQCloud-to-cloud SaaS integrationsiPaaS platform or Epicor Data Fabric

Important Caveats

Related Units