ml-connector
Sage 100ServiceNow

Sage 100 and ServiceNow integration

Sage 100 runs on-premises accounting and purchasing. ServiceNow runs cloud-based Accounts Payable and Procurement. Connecting the two syncs your vendor master, open purchase orders, and AP invoices from Sage 100 into ServiceNow without re-keying, and keeps your general ledger accounts aligned across both systems. ml-connector polls Sage 100's local agent to retrieve the records, handles the credential bridge between on-premises and cloud, and stages the data in ServiceNow's Source-to-Pay module on a schedule that fits your operational rhythm.

How Sage 100 works

Sage 100 is an on-premises ERP system that exposes vendors, purchase orders, AP invoices, GL accounts, and items through SOAP Web Services (eBusiness Web Services) on a customer-hosted IIS server or through a local BOI COM layer wrapped by a Windows service account. The SOAP endpoint covers Sales Orders and Customers only; full AP, GL, and PO access requires the BOI layer accessed by a local Windows agent running on the customer server. There are no webhooks or event streams, so data is retrieved by polling DateLastUpdated and DateCreated fields. Authentication is stateless username and password per call, with no OAuth or token refresh. Every call requires a company code, and GL accounts use a multi-segment format that varies by customer configuration.

How ServiceNow works

ServiceNow is a cloud platform with Source-to-Pay Operations modules for Accounts Payable and Procurement, accessed through a REST API with JSON responses at a customer-specific subdomain. Authentication uses OAuth 2.0 Client Credentials for machine-to-machine flows or Basic Auth, and all operations require a user or service account with module-specific roles. The platform does not include a native outbound webhook registration system; push integration requires admin-configured Business Rules and Outbound REST Messages, so the standard pattern is polling with sysparm_query filters on a custom schedule. The Source-to-Pay staging tables are licensed add-ons, and tokens expire after 30 minutes by default.

What moves between them

The main flow runs from Sage 100 into ServiceNow. ml-connector polls Sage 100 every 15 to 30 minutes for newly created or updated AP invoices, purchase orders, and vendors, and syncs them into ServiceNow's Source-to-Pay staging tables (sn_apo_invoice, proc_po, proc_po_item) and supplier records. GL accounts are synced daily to keep the chart of accounts aligned. Vendor records from Sage 100 map to ServiceNow supplier inbound staging so procurement sees the current vendor master. Reference data such as cost centers flow from ServiceNow back to Sage 100 to validate that invoice allocations land on accounts that exist in both systems.

How ml-connector handles it

ml-connector connects to Sage 100 through the customer's local Windows agent, which wraps the BOI COM layer and exposes an agent-side API with mTLS or API key authentication. It polls Sage 100 on a fixed schedule, retrieving AP invoices, POs, vendors, and GL accounts by checking DateLastUpdated. Because Sage 100 requires a company code on every call and uses a multi-segment GL account format that varies per customer, ml-connector stores the company code and GL mapping rules per customer and applies them to every payload before staging in ServiceNow. On the ServiceNow side, ml-connector authenticates with OAuth 2.0 Client Credentials, handles the 30-minute token expiry by refreshing before each call, and stages records in the Source-to-Pay module's inbound tables so users can review and approve before posting to production. Sage 100's COM record-locking and concurrent write limits mean ml-connector backs off and retries on lock errors. Because neither system has idempotency keys, ml-connector checks for existing records by vendor ID or invoice number before creating new entries, avoiding duplicates on retry.

A real-world example

A mid-sized distributor runs Sage 100 on-premises for accounting, inventory, and purchase orders. The company expanded to use ServiceNow's cloud Accounts Payable module for approval workflows and audit trails, but procurement and finance teams were still re-entering vendor data, PO details, and invoice line items from Sage 100 into ServiceNow by hand every day. The manual process created errors, slowed cycle time, and left no audit trail of where data came from. With Sage 100 and ServiceNow connected, the vendor master syncs automatically from Sage 100 each night, new POs appear in ServiceNow within 30 minutes of creation, and AP invoices flow in automatically on a schedule, pre-populated with the correct GL account codes from Sage 100. The finance team can now review and approve invoices in ServiceNow without re-keying, and month-end close is faster because the GL accounts are already aligned between systems.

What you can do

  • Sync AP invoices, purchase orders, and vendor records from Sage 100 into ServiceNow Source-to-Pay staging tables on a schedule you set.
  • Keep the GL account master aligned between Sage 100 and ServiceNow so invoice allocations reference valid accounts in both systems.
  • Bridge the on-premises Sage 100 server to ServiceNow's cloud instance via the local Windows agent, handling company codes and multi-segment GL formats per customer.
  • Detect and skip duplicate vendor and invoice records across retries using record-matching on vendor ID and invoice number.
  • Handle Sage 100's COM record-locking constraints and concurrent write limits with exponential backoff, and refresh ServiceNow's OAuth 2.0 tokens before they expire.

Questions

How does ml-connector connect to Sage 100 if it is on-premises and has no cloud API?
ml-connector connects through a local Windows agent running on the customer's Sage 100 server. The agent wraps the BOI COM layer and exposes an agent-side interface authenticated with mTLS or API key. ml-connector polls the agent on a schedule, and the agent retrieves data from Sage 100 and returns it as JSON. This model keeps Sage 100 on-premises while allowing ServiceNow and other cloud systems to stay in sync.
Does ml-connector handle Sage 100's company codes and multi-segment GL account format?
Yes. Sage 100 requires a three-character company code on every API call and uses a multi-segment GL account format (e.g., 4000-01-00) that varies by customer configuration. ml-connector stores the company code and GL mapping rules per customer, applies them when building payloads, and validates that GL accounts exist in both systems before staging invoices in ServiceNow. This ensures invoices land on valid accounts without manual remapping.
What is the sync cadence and how are duplicates avoided?
ml-connector polls Sage 100 every 15 to 30 minutes for AP invoices, POs, and vendors, checking the DateLastUpdated field. GL accounts sync daily. Because neither system has idempotency keys, ml-connector checks for existing records by vendor ID or invoice number before creating new entries. On lock errors or timeouts, the retry reuses the same check so duplicates are avoided even if the first attempt partially succeeded.

Related integrations

Connect Sage 100 and ServiceNow

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

Get started