ml-connector
Sage 100Cin7

Sage 100 and Cin7 integration

Sage 100 runs procurement and finance on premises; Cin7 Core manages orders and inventory in the cloud. Connecting the two keeps your supplier master and purchase lifecycle synchronized across both systems. New vendors and purchase orders created in Sage 100 flow into Cin7 as suppliers and purchases without manual re-entry, and invoice receipts close the loop by updating purchase status in Cin7. ml-connector bridges the gap between Sage 100's stateless SOAP/BOI authentication and Cin7's cloud REST API, handling the on-premises polling cadence and vendor-to-supplier mapping automatically.

How Sage 100 works

Sage 100 is an on-premises ERP that exposes vendors, purchase orders, invoices, GL accounts, and items through SOAP web services at a customer-hosted endpoint or through a local Windows agent wrapping the BOI COM library. SOAP covers sales orders and customers only; full access to AP invoices, purchase orders, and GL accounts requires the BOI COM layer wrapped by a local agent. Authentication is stateless username and password passed per call, not tokens or OAuth. There is no native webhook system, so all reads are polls against DateLastUpdated or DateCreated fields on a schedule matched to your procurement cycle. The system requires a three-character company code on every call, and GL accounts follow a customer-specific multi-segment format. Concurrent writes face COM record-locking contention, so retries with backoff are necessary for high-frequency operations.

How Cin7 works

Cin7 Core is a cloud SaaS inventory and order management ERP that exposes suppliers, purchases, sales, customers, products, and chart of accounts through a REST API at https://inventory.dearsystems.com/externalapi/v2/. Authentication uses custom API key headers (api-auth-accountid and api-auth-applicationkey), not OAuth or Basic Auth. Webhooks are available for outbound events like sales, purchases, and supplier changes, configured through the UI Automation module rather than the API; webhook payloads are not HMAC-signed, so transport-layer security such as mTLS is recommended. The chart of accounts is read-only via API. Purchases follow a procure-to-pay lifecycle with an Approach field (ORDER, INVOICE, RECEIVE) that moves a purchase through its stages. Multiple API keys can be created per account, each with its own rate limits.

What moves between them

Purchase orders, vendors, and invoices flow from Sage 100 into Cin7 Core. Vendors are mapped to Cin7 suppliers and synced hourly to keep the supplier master current. Purchase orders are polled from Sage 100 and created or updated as purchases in Cin7 every 15 minutes, with the PO line items and dates preserved. When an AP invoice arrives in Sage 100, ml-connector reads it and advances the matching purchase in Cin7 to INVOICE status. GL account master data flows monthly to ensure Cin7 chart of accounts includes all active Sage 100 accounts. The flow is read-mostly; Cin7's general ledger is read-only, so ml-connector never writes GL postings back into Cin7.

How ml-connector handles it

ml-connector stores Sage 100 BOI agent credentials (Windows service account and API key or mTLS certificate) encrypted alongside Cin7 API keys, and on each poll cycle it connects to the customer's Sage 100 server via the local agent to fetch new or updated vendors, POs, and invoices. It applies the company code from Sage 100 configuration to every query and checks DateLastUpdated and DateCreated to identify changed records since the last run. On the Sage 100 side, concurrent write attempts face COM record-locking, so ml-connector implements exponential backoff and retry on conflict responses. For each vendor found, it queries or creates a matching supplier in Cin7 by matching the Sage 100 vendor code to the Cin7 supplier reference. Purchase orders become Cin7 purchases with line items mapped from Sage 100 PO lines, and the PO number becomes the purchase reference. When an invoice is detected in Sage 100, ml-connector finds the matching Cin7 purchase and advances it from ORDER to INVOICE status using Cin7's Approach field. GL accounts from Sage 100 are matched to Cin7 chart of accounts by account number; mismatches are logged as audit events for manual review. Every record carries a complete audit trail and can be replayed if a downstream Cin7 write fails.

A real-world example

A mid-sized product distributor runs Sage 100 on premises for procurement and finance, and uses Cin7 Core in the cloud for order management and multi-location inventory. Before the integration, the procurement team created purchase orders in Sage 100, then manually entered them into Cin7 to track stock inbound, and again when invoices arrived from vendors to match receipts. The finance team maintained duplicate vendor master lists in both systems. With Sage 100 and Cin7 connected, vendors entered once in Sage 100 populate Cin7 automatically, POs sync across both systems without re-keying, and invoice receipts close the purchase in Cin7 without a second data-entry step. The procurement cycle is now unified, and month-end reconciliation starts with PO and receipt data already synchronized.

What you can do

  • Poll Sage 100 for vendors, purchase orders, and invoices, then sync them into Cin7 suppliers, purchases, and purchase status updates on a schedule matched to your procurement cycle.
  • Map Sage 100 vendors to Cin7 suppliers by vendor code, keeping the supplier master synchronized hourly.
  • Move purchase orders from Sage 100 into Cin7 purchases with line items and dates preserved, updating purchase status as invoices arrive.
  • Handle the on-premises BOI COM agent authentication and stateless password-per-call model on Sage 100, and Cin7 custom API key authentication, with encrypted credential storage.
  • Track GL account mappings between Sage 100's multi-segment format and Cin7's chart of accounts, with a complete audit trail for every record and replay capability if a write fails.

Questions

How does ml-connector handle Sage 100's on-premises architecture and lack of cloud API?
ml-connector connects to the customer's Sage 100 server through a local Windows agent that wraps the BOI COM layer and exposes the connector API over HTTP. The agent credentials (Windows service account and API key or mTLS certificate) are stored encrypted alongside Sage 100 SOAP endpoint details. Each poll applies the customer's company code to all queries and checks DateLastUpdated fields to identify new or changed records since the last run.
What records move between Sage 100 and Cin7, and in which direction?
Vendors, purchase orders, and invoices flow from Sage 100 into Cin7. Vendors are mapped to suppliers and synced hourly; POs become purchases every 15 minutes; and invoices advance matching purchases from ORDER to INVOICE status. GL account master data syncs monthly. The flow is read-mostly; Cin7's general ledger is read-only, so ml-connector does not write GL postings back into Cin7.
How are vendors and purchase orders matched between Sage 100 and Cin7?
Sage 100 vendor codes are matched to Cin7 supplier reference fields on creation and update. Purchase order numbers from Sage 100 become the purchase reference in Cin7. If a match cannot be found, the record is logged as an audit event for manual review, and no duplicate is created.

Related integrations

Connect Sage 100 and Cin7

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

Get started