ml-connector
Sage 100Adobe Commerce

Sage 100 and Adobe Commerce integration

Sage 100 runs the back-office ERP: accounting, inventory, and order entry. Adobe Commerce runs the online store where customers place orders. Connecting the two means storefront orders land in Sage 100 as sales orders without re-keying, the customer who placed the order exists in the Sage 100 customer master, and the prices and stock levels Sage 100 maintains stay current on the Adobe Commerce catalog. ml-connector handles the very different way each system is reached and moves the data on the schedule you set.

How Sage 100 works

Sage 100 is on-premises and has no native cloud API. Its full module surface, including AR customers, sales orders, inventory items, and GL, is reached through the Business Object Interface, a COM automation layer that runs only on the customer's own Windows server and cannot be called over HTTP directly. A narrower SOAP web service, eBusiness Web Services, covers only Customers and Sales Orders and takes a username and password in a Logon object on every call over HTTPS, with no tokens and no refresh cycle. Every call targets a customer-specific server URL and requires a three-character company code. Sage 100 has no webhooks or push events, so records are read by polling DateLastUpdated and DateCreated fields.

How Adobe Commerce works

Adobe Commerce exposes orders, invoices, customers, products, and credit memos through its REST Commerce Web APIs, with list endpoints paged through searchCriteria parameters and a total_count for paging. PaaS instances authenticate with OAuth 1.0a integration credentials or an admin bearer token; the Cloud Service uses Adobe IMS OAuth 2.0 client credentials whose tokens expire in about 24 hours. Adobe Commerce can also push outbound webhooks for events such as order placed and product saved, signed with HMAC SHA256 in an x-adobe-commerce-webhook-signature header, though those webhooks are synchronous and wait for the receiver to respond. It has no GL account resource, so general ledger detail stays in Sage 100.

What moves between them

Orders flow from Adobe Commerce into Sage 100. ml-connector reads new and updated storefront orders and creates them as Sage 100 sales orders, with each line mapped to the matching Sage 100 item and GL account. The customer on each order flows the same direction, created or updated in the Sage 100 customer master so every order references a valid customer. Item price and stock levels flow the other way, from the Sage 100 inventory records out to the Adobe Commerce product catalog, so the storefront reflects what the ERP holds. Adobe Commerce keeps its own invoices and credit memos and Sage 100 keeps the general ledger, so financial postings are not duplicated across the two systems.

How ml-connector handles it

ml-connector stores both credential sets encrypted. Because Sage 100 cannot be reached from the cloud, it calls a local agent installed on the customer's Sage 100 server that wraps the Business Object Interface and exposes it as HTTPS, authenticating to that agent with an API key while the agent talks to Sage 100 under its Windows service account. On the Adobe Commerce side it signs OAuth 1.0a requests for PaaS or refreshes the IMS bearer token for the Cloud Service when a call returns 401. Adobe Commerce order-placed and product-saved webhooks, verified by HMAC SHA256, trigger work as it happens, and a scheduled poll backfills anything a webhook missed, since Sage 100 itself is pull-only. Items are mapped first so every order line and price update references a SKU that exists on both sides, and the Sage 100 company code and segmented GL account keys are validated before any write. Neither system offers an idempotency key, so ml-connector dedups on the Adobe Commerce increment_id and checks the Sage 100 customer and order keys before insert. Sage 100 record locks under heavy writes are retried with backoff, every record carries a full audit trail, and a failed call can be replayed.

A real-world example

A mid-sized outdoor gear company with about 120 employees sells through an Adobe Commerce storefront and runs its accounting, inventory, and order fulfillment in Sage 100 on a server in its warehouse. Before the integration, a clerk printed each day's web orders and re-typed them into Sage 100 sales order entry, added new web customers by hand, and emailed the warehouse when a stock count looked wrong because the website still showed items as available after they sold out in the ERP. With Sage 100 and Adobe Commerce connected, each storefront order becomes a Sage 100 sales order automatically with its customer attached, and Sage 100 stock and price changes push back to the catalog so the website stops overselling. The re-keying disappears and the storefront reflects real inventory.

What you can do

  • Create Adobe Commerce storefront orders as Sage 100 sales orders, with lines mapped to the right items and GL accounts.
  • Create or update the Sage 100 customer master record for the buyer on each order.
  • Push Sage 100 item price and stock levels out to the Adobe Commerce product catalog so the store reflects the ERP.
  • Reach on-premises Sage 100 through a local agent over the Business Object Interface, bridged to Adobe Commerce OAuth.
  • Trigger on Adobe Commerce webhooks verified by HMAC SHA256, backfill by scheduled poll, and replay any failed record.

Questions

Which direction does data move between Sage 100 and Adobe Commerce?
Orders and their customers move from Adobe Commerce into Sage 100, created as sales orders and customer master records. Item price and stock levels move the other way, from Sage 100 out to the Adobe Commerce catalog. Adobe Commerce keeps its own invoices and credit memos and Sage 100 keeps the general ledger, so financial postings are not duplicated.
Why does Sage 100 need a local agent?
Sage 100 is on-premises and has no cloud API. Its full sales order, customer, and inventory surface is only available through the Business Object Interface, a COM layer that runs on the customer's own Windows server and cannot be called over HTTP. ml-connector talks to a lightweight local agent on that server that wraps the Business Object Interface and exposes it as a secured HTTPS endpoint the connector can reach.
How does the integration stay current without Sage 100 webhooks?
Sage 100 has no webhooks or push events, so ml-connector polls it on a schedule, reading records by their DateLastUpdated and DateCreated fields. On the Adobe Commerce side it does use webhooks, verified by HMAC SHA256, so storefront orders are picked up as they happen, and a scheduled poll backfills anything a webhook missed.

Related integrations

Connect Sage 100 and Adobe Commerce

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

Get started