ml-connector
Sage 100Stedi

Sage 100 and Stedi integration

Sage 100 runs your accounts payable and procurement. Stedi routes EDI documents to your trading partners over secure SFTP or AS2. Connecting the two means invoices and purchase orders leave Sage and reach your suppliers in their preferred EDI format without re-keying. ml-connector sits between your on-premises Sage instance and Stedi's cloud platform, handling the very different architectures on each side and moving data on a schedule you control.

How Sage 100 works

Sage 100 is an on-premises ERP system covering accounts receivable, accounts payable, purchasing, general ledger, inventory, and sales. Data is exposed through SOAP web services (eBusiness Web Services) for limited entities like customers and sales orders, or through a BOI (Business Objects Interface) COM layer that requires a local Windows agent on the customer server to access the full GL, AP, and PO records. Sage 100 has no native webhooks or REST API, so all integrations must poll. Authentication uses either SOAP username and password credentials or Windows service account credentials passed through the local agent. Every API call requires a three-character company code. GL accounts use a multi-segment format that varies by customer configuration.

How Stedi works

Stedi is a cloud-based EDI platform that receives JSON from integration partners, translates it into X12 EDI format (810 Invoice, 850 Purchase Order, 855 Acknowledgment, and other transaction sets), and routes the resulting EDI files to trading partners via SFTP, FTPS, or AS2. Every call to Stedi REST API requires an API key in the Authorization header, with no token refresh or expiry. Inbound EDI from partners is pushed to a webhook endpoint as parsed JSON. Stedi requires an Idempotency-Key header on outbound writes for deduplication and a webhook endpoint that responds within 5 seconds.

What moves between them

The main flow runs from Sage 100 into Stedi. ml-connector polls Sage 100 for newly created or updated AP invoices and purchase orders every 15 minutes, using Sage's DateLastUpdated and DateCreated fields to identify records since the last poll. Each record is translated into the corresponding X12 transaction set: AP invoices become 810 Invoices, purchase orders become 850 Purchase Orders. The JSON representations are posted to Stedi via REST, where Stedi translates them to EDI format and routes the files to your trading partners according to your Stedi partnership configurations. No data flows back from Stedi into Sage 100.

How ml-connector handles it

ml-connector maintains a local agent or establishes a SOAP connection to Sage 100 with a configured username, password, and company code. Because Sage 100 has no webhooks or event stream, ml-connector polls the AP_Invoice and PO_PurchaseOrder tables at a fixed 15-minute cadence, storing the last poll timestamp and only fetching records updated since that point. Each Sage record is mapped to the Stedi equivalent: AP invoice line items map to the 810 Invoice detail lines, and PO line items map to the 850 Purchase Order lines. ml-connector calls Stedi's REST endpoint with the JSON payload and includes a unique Idempotency-Key derived from the Sage document number to ensure Stedi deduplicates if the request is retried. Sage 100 uses multi-segment GL account codes that can vary by customer, so ml-connector accepts a per-customer mapping table. Because Sage COM is locked to the customer's on-premises server and cannot be called remotely, the local agent must run on Windows inside the Sage network. Concurrent write limits due to COM record-locking mean that if a poll catches a heavy transaction window, ml-connector backs off and retries. Every record is logged with its Sage document ID and Stedi File Execution ID for audit and replay.

A real-world example

A mid-sized manufacturing distributor runs Sage 100 for accounts payable and purchasing. When a sales order comes in from a customer, the company creates a purchase order in Sage to order raw materials or components from five key suppliers. Before the integration, staff exported each PO as a CSV, manually entered or reformatted it into X12 format, and uploaded it to each supplier's EDI portal or SFTP site. With Sage 100 and Stedi connected, each new PO in Sage is automatically translated to X12 format and delivered to the supplier via SFTP or AS2 within minutes. The same flow handles AP invoices: when a supplier invoice lands in Sage, it is immediately available to the supplier partner in EDI format. This eliminates the manual re-keying step and tightens the procurement cycle.

What you can do

  • Poll Sage 100 for new and updated AP invoices and purchase orders every 15 minutes using the DateLastUpdated field.
  • Translate Sage AP invoices into X12 810 Invoice format and POs into X12 850 Purchase Order format for Stedi.
  • Post translated documents to Stedi with idempotency keys derived from Sage document numbers to ensure no duplicates.
  • Route EDI files to your trading partners via SFTP, FTPS, or AS2 as configured in Stedi partnerships.
  • Maintain a full audit trail linking each Sage document to its Stedi File Execution ID for compliance and debugging.

Questions

How does ml-connector connect to Sage 100 if it is on-premises?
ml-connector uses either Sage's SOAP web services with username and password credentials, or a local Windows agent that wraps the BOI COM layer. The SOAP path works for basic entities; the agent path provides full access to AP, PO, and GL data. Since Sage 100 cannot be called remotely over HTTP, the agent must run on a Windows machine inside your Sage network and present its own credentials to ml-connector.
What happens if a PO or invoice is updated in Sage after ml-connector has already sent it to Stedi?
ml-connector tracks the last poll time and uses Sage's DateLastUpdated field on the next poll cycle to detect changes. If a document is modified, ml-connector re-sends it to Stedi with the same Idempotency-Key that is derived from the Sage document number. Stedi deduplicates on this key within a 24-hour window, so the update either replaces the prior version or is silently absorbed depending on your Stedi partnership rules.
Can data flow from Stedi back into Sage 100?
No. This integration moves data one direction only: from Sage 100 into Stedi for EDI translation and partner routing. Stedi is a translation platform, not a system of record, and does not store vendor or invoice data. If you need to receive EDI documents from trading partners and record them in Sage, a separate reverse flow would be required.

Related integrations

Connect Sage 100 and Stedi

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started