ml-connector
Sage 100SAP Ariba

Sage 100 and SAP Ariba integration

Sage 100 runs accounts payable, the general ledger, and purchasing for the business. SAP Ariba runs procurement, supplier management, and invoice approval in the cloud. Connecting the two means purchase orders and the supplier invoices approved against them flow into Sage 100 without re-keying, and the vendor master stays in agreement with the Ariba supplier list. Because Sage 100 has no cloud API, ml-connector reaches its accounts payable and general ledger through a local agent. ml-connector handles the very different access models on each side and moves the data on a schedule you control.

How Sage 100 works

Sage 100 is on-premises and has no native REST or cloud API. Its narrow eBusiness Web Services SOAP surface covers only Sales Orders and Customers, so full vendor, AP invoice, purchase order, and GL access is reached through the Business Object Interface, a COM layer that runs on the customer server. A local Windows agent wraps that interface and exposes HTTPS REST that ml-connector can reach, authenticating with an API key or mutual TLS. Sage 100 has no webhooks, so records are read by polling the DateLastUpdated fields on each table.

How SAP Ariba works

SAP Ariba is a cloud procurement platform that exposes purchase orders, supplier invoices, suppliers, requisitions, and contracts through its REST Open APIs on the openapi.ariba.com gateway. Every call carries an OAuth2 client-credentials bearer token, a static apiKey header, and the customer realm as a query parameter, and the bearer token expires in about one hour. Bulk procurement data is pulled through async reporting jobs that you submit, poll, and download page by page with a pageToken. The Supplier Data API reads and updates supplier status, but invoice and purchase order writes go through cXML and SOAP, not these REST APIs.

What moves between them

The main flow runs from SAP Ariba into Sage 100. ml-connector reads purchase orders and the supplier invoices approved against them from Ariba and posts them into Sage 100 as purchase orders and AP bills through the local agent, mapped to the matching Sage 100 vendor and segmented GL accounts. Supplier records flow the same direction so the Sage 100 vendor master reflects Ariba suppliers and their status. Accounting codes carried on Ariba PO and invoice lines are aligned to Sage 100 GL account keys so each posting lands on a valid account. Sage 100 is the accounting book of record, and Ariba invoice and PO writes use cXML rather than REST, so ml-connector does not push financial entries back into Ariba over the Open APIs.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Ariba side it requests and refreshes the OAuth2 bearer token before its roughly one-hour expiry, sends the static apiKey header on every call, and appends the customer realm as a query parameter. Because Ariba exposes bulk data through async reporting jobs rather than a simple list endpoint, ml-connector submits a job filtered by an updated-date window, polls until it completes, then downloads the results page by page with the pageToken, respecting the one-year maximum window and the X-RateLimit-Remaining-minute header to back off before a 429. On the Sage 100 side it calls the local agent over HTTPS with the agent API key, since Sage 100 itself cannot be reached from the cloud, and passes the three-character company code on every operation. Suppliers and GL accounts are mapped first, so every invoice line resolves to a Sage 100 VendorNo, an APDivisionNo, and a real segmented GL account key. Sage 100 has no idempotency key, so ml-connector dedupes on VendorNo plus InvoiceNo and a BullMQ jobId before it posts, and it checks for an existing record first to avoid double-booking a re-read invoice. High-frequency AP writes can trigger Sage 100 record-locking errors, so it retries with backoff, and every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized manufacturer with about three hundred staff runs Sage 100 for accounts payable and the general ledger, and uses SAP Ariba to issue purchase orders and approve supplier invoices across several plants. Before the integration, an AP clerk opened each approved invoice in Ariba and keyed it into Sage 100 by hand, which meant invoices sat for days, vendor numbers were sometimes mismatched, and the purchasing accruals in the ledger rarely tied out to the open purchase orders. With Sage 100 and SAP Ariba connected, each approved invoice and its purchase order flow into Sage 100 within the polling window, allocated to the correct vendor and GL account, and supplier changes keep both lists aligned. Invoices post on time, the keying errors are gone, and month-end close starts with the AP accounts already reconciled.

What you can do

  • Post SAP Ariba approved supplier invoices into Sage 100 as AP bills, mapped to the correct vendor and GL account.
  • Bring SAP Ariba purchase orders into Sage 100 so receipts and bills match against a real PO.
  • Keep the Sage 100 vendor master aligned with SAP Ariba suppliers and their registration status.
  • Bridge Ariba OAuth2 and apiKey to the local agent that exposes Sage 100 over HTTPS, with the company code on every call.
  • Poll Ariba reporting jobs on a schedule with VendorNo and jobId dedup, retries, and a full audit trail on every record.

Questions

Which direction does data move between Sage 100 and SAP Ariba?
The main flow is SAP Ariba into Sage 100. Purchase orders, approved supplier invoices, and supplier records move from Ariba into Sage 100, mapped to the matching vendor and GL accounts. Sage 100 is the accounting book of record, and Ariba invoice and PO writes use cXML rather than the REST Open APIs, so ml-connector does not push financial entries back into Ariba.
Why does Sage 100 need a local agent instead of a direct cloud connection?
Sage 100 is on-premises and has no native cloud API, and its full AP, GL, and purchase order breadth is only available through the Business Object Interface, a COM layer that runs on the customer server. A lightweight Windows agent wraps that interface and exposes HTTPS REST that ml-connector reaches over the internet, authenticating with an API key or mutual TLS. Without that agent, only the narrow SOAP surface for Sales Orders and Customers is reachable.
How does the integration pull data from SAP Ariba without webhooks?
Ariba does not provide general outbound webhooks, so ml-connector uses the async reporting job pattern. It submits a job filtered by an updated-date window, polls until the job completes, then downloads the results page by page with the pageToken. It keeps a high-water-mark timestamp so each poll only picks up new and changed records, and it watches the rate-limit header to back off before hitting a limit.

Related integrations

Connect Sage 100 and SAP Ariba

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

Get started