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.
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
More Sage 100 integrations
Other systems that connect to Adobe Commerce
Connect Sage 100 and Adobe Commerce
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started