ml-connector
Sage 100Coupa

Sage 100 and Coupa integration

Sage 100 runs accounts payable and purchasing on-premises. Coupa unifies procurement and spend across the organization in the cloud. Connecting them brings your vendor master and AP documents out of Sage 100 into Coupa without re-keying. New vendors in Sage 100 flow into Coupa as suppliers, purchase orders sync for visibility, and AP invoices are recorded in Coupa's unified spend ledger. ml-connector handles Sage 100's on-premises architecture and Coupa's OAuth requirements so your teams see one view of procurement and spend.

How Sage 100 works

Sage 100 is an on-premises ERP system covering accounts receivable, accounts payable, GL, inventory, and purchasing. It exposes data through SOAP eBusiness Web Services (limited to sales orders and AR customers) or through the BOI COM layer (full AP, GL, PO, and vendor access) wrapped by a local Windows agent running on the customer server. Authentication uses username and password per call; there are no tokens, no webhooks, and no native REST interface. Data is retrieved by polling using DateLastUpdated or DateCreated fields. Sage 100 uses multi-segment GL account formats that vary by customer configuration, requires a 3-character company code on every call, and enforces concurrent write limits due to COM record-locking.

How Coupa works

Coupa is a cloud-based procurement and spend management platform accessed through REST APIs at the customer's tenant URL (e.g., https://acme.coupahost.com/api). It authenticates with OAuth 2.0 client credentials and exposes suppliers, purchase orders, invoices, payments, and lookup values. Coupa can push events via webhooks with HMAC-SHA256 signature verification for requisitions, purchase orders, invoices, suppliers, expense reports, and payments. It enforces rate limiting with 429 responses and a 30-second default request timeout, and webhook bodies are capped at 256 KB.

What moves between them

Vendors from Sage 100 flow into Coupa as suppliers. Purchase orders from Sage 100 AP module sync into Coupa for spend visibility and matching. AP invoices from Sage 100 are posted into Coupa's invoice ledger. The sync direction is primarily from Sage 100 into Coupa, running on a scheduled cadence aligned with your AP close cycle (typically every 15 minutes for invoices and POs, hourly for vendors). Reference data such as GL account codes is read from Sage 100 and mapped to Coupa's cost allocation dimensions.

How ml-connector handles it

ml-connector authenticates to Sage 100 using the BOI COM agent running on the customer's Sage 100 server, passing username and password per call. It polls Sage 100 for vendors, POs, and AP invoices on a schedule (since Sage 100 has no webhooks). For Coupa, ml-connector uses OAuth 2.0 client credentials to obtain a bearer token and refreshes it when a call returns 401. It maps Sage 100 vendors to Coupa suppliers, POs to purchase orders, and AP invoices to Coupa invoices. Because Sage 100 enforces concurrent write limits and uses no idempotency keys, ml-connector checks for existing records before create operations or uses Sage-supplied next-number helpers to avoid duplicates. Coupa rate limits are handled with exponential backoff (up to 3 retries capped at 30 seconds). Every record carries a full audit trail and can be replayed if a downstream sync to Coupa fails.

A real-world example

A mid-market distributor runs Sage 100 for AP, inventory, and purchasing on-premises. The company uses Coupa for procurement visibility across multiple regional warehouses. Before the integration, the procurement team manually entered new supplier contracts and PO details from Sage 100 into Coupa each week, causing delays in vendor onboarding and a mismatch between the invoice records in each system during month-end close. With Sage 100 and Coupa connected, vendors from Sage 100 flow into Coupa automatically, purchase orders sync as they are created, and AP invoices are recorded in Coupa's unified ledger. The procurement team gains real-time visibility into spend, vendor performance improves because Coupa's analytics now cover all company purchases, and AP reconciliation no longer requires manual cross-checking.

What you can do

  • Sync vendors from Sage 100 AP module into Coupa as suppliers, keeping your vendor master aligned across systems.
  • Post purchase orders from Sage 100 into Coupa for centralized spend visibility and PO-to-invoice matching.
  • Flow AP invoices from Sage 100 into Coupa's invoice ledger and unified spend analytics.
  • Authenticate Sage 100 via the local BOI agent with username and password, and Coupa via OAuth 2.0 client credentials.
  • Poll Sage 100 on a schedule aligned to your AP cycle, with retries and a full audit trail on every vendor, PO, and invoice.

Questions

Does ml-connector work with Sage 100 on-premises without a cloud API?
Yes. Sage 100 has no native REST or cloud API, so ml-connector uses the BOI COM layer on the customer's Sage 100 Windows server to access vendors, POs, and AP invoices. The local BOI agent acts as a bridge, and ml-connector polls it on a schedule since Sage 100 has no webhooks or event stream.
What happens if a vendor or PO already exists in both Sage 100 and Coupa?
ml-connector checks for existing records before creating new ones in Coupa to avoid duplicates. It uses the vendor number or PO number as the unique identifier and updates matching records in Coupa if the data in Sage 100 has changed. GL account and cost center codes are validated before posting to avoid misallocated invoices.
How does the integration handle Sage 100's multi-segment GL account format?
Each customer's Sage 100 GL accounts use a unique multi-segment format (e.g. 4000-01-00). ml-connector reads the GL account structure from Sage 100 and maps it to Coupa's cost allocation dimensions during setup. When AP invoices are posted, the GL codes are validated against the customer's Sage 100 configuration to ensure they exist before the invoice is sent to Coupa.

Related integrations

Connect Sage 100 and Coupa

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

Get started