ml-connector
Sage 100Basware

Sage 100 and Basware integration

Sage 100 runs accounting and procurement for smaller to mid-sized manufacturers and distributors. Basware automates the full three-way match and invoice-to-payment process. Connecting the two keeps your AP workflow fed with fresh vendor and invoice data from Sage 100 without manual re-entry into Basware. When invoices land in Basware through the integration, Basware can match them to POs and receipt lines, route them for approval, and post payments back to Sage 100 accounts payable when the flow is complete.

How Sage 100 works

Sage 100 is an on-premises ERP with no native REST API. It exposes a limited SOAP surface (Customers and Sales Orders only) via eBusiness Web Services at a customer-hosted endpoint, and full AP, GL, and PO access through the BOI COM layer wrapped by a local Windows service agent on the customer server. Authentication is username and password per SOAP call, plus Windows service account credentials for the BOI agent. Sage 100 publishes no webhooks and has no event stream, so polling is required. The system uses DateLastUpdated and DateCreated fields to track changes. AP Invoices, POs, and Vendors each have distinct date-based polling patterns; GL Accounts are generally static. Company code (a three-character identifier) is mandatory on every call, and multi-segment GL account formats vary by customer configuration.

How Basware works

Basware is a cloud-based AP automation platform deployed regionally (EU, US, AU, CA). Its REST APIs sit under a regional base URL and the /v1/ path prefix. The P2P API (covering invoices, purchase orders, requisitions, and vendors) accepts OAuth2 Client Credentials and supports webhooks for push notifications on account documents and exported records. The Network API and Data Access API are pull-only and require HTTP Basic Auth with a unique X-BW-REQUEST-ID header on every request. Basware credentials are provisioned by a delivery consultant rather than self-serve, and OAuth2 tokens default to one-hour validity. Webhook payloads are signed with HMAC-SHA256 in the X-BWAPI-Signature-256 header.

What moves between them

Sage 100 AP Invoices, Purchase Orders, and Vendors are polled from Sage 100 every 15 minutes and 1 hour respectively and pushed into Basware's P2P API via OAuth2-authenticated REST calls. The vendor master is synced hourly so Basware always has a current supplier list. Basware matches incoming invoices to POs and receipt lines using its three-way match engine; payment confirmations and posting confirmations are pulled back from Basware using the Data Access API or webhook push. GL postings from Basware payment runs can be mapped back to Sage 100 GL accounts and posted as journal entries to complete the cycle.

How ml-connector handles it

ml-connector stores Sage 100 credentials (username, password, Windows service account details) and Basware OAuth2 secrets encrypted, then obtains a Bearer token from Basware before each polling cycle. It polls Sage 100 using the BOI COM layer via the customer's local Windows agent, passing the company code and polling dates per entity. Invoices and POs include line-level details; Vendors are fetched as a master list. Each incoming record is checked for existence in Basware using vendor ID or invoice number to avoid duplicates. Regional endpoint routing is controlled by the customer's Basware region; ml-connector uses the corresponding regional base URL (eu, us, au, ca). Sage 100 has no idempotency keys, so ml-connector tracks imported records in its audit log and skips re-sends. The BOI COM layer has record-locking constraints on concurrent writes, so ml-connector backs off and retries on lock conflicts. Webhook signatures from Basware are validated using the shared secret before processing, and payment confirmations are parsed to update invoice status in both systems.

A real-world example

A mid-sized industrial distributor runs Sage 100 for accounting and purchase orders across three regional branches, with hundreds of invoices arriving each week. Before the integration, invoices were printed, scanned, and manually entered into Basware, a process that consumed 6 to 8 hours per week and introduced frequent data-entry errors. With Sage 100 connected to Basware, invoices are automatically pushed within minutes of receipt, Basware's three-way match runs on fresh PO and receipt data, approval routes are automated, and payment confirmation posts back to Sage 100 accounts payable at settlement. The distributor now processes invoices in Basware without any manual data re-keying, reduces approval turnaround from weeks to days, and gains immediate visibility into the AP pipeline.

What you can do

  • Push Sage 100 AP Invoices into Basware's P2P API every 15 minutes, with line-level detail and GL coding.
  • Sync Sage 100 Vendors as a master list into Basware hourly so purchase orders reference current supplier data.
  • Automatically match incoming invoices to Sage 100 purchase orders and receipt lines using Basware's three-way match engine.
  • Bridge Sage 100's on-premises architecture by accepting SOAP and BOI COM credentials and polling on a schedule, then pushing to Basware's cloud REST API.
  • Track payment confirmations from Basware and post them back to Sage 100 accounts payable to close the cycle.

Questions

How does ml-connector handle Sage 100 being on-premises with no cloud API?
ml-connector accepts Sage 100 SOAP credentials and BOI COM agent credentials from the customer's local Windows server, then polls Sage 100 on a schedule (AP Invoices every 15 minutes, Vendors every hour) using the BOI layer via the local agent. The agent acts as a bridge so ml-connector can read Sage 100 data without requiring direct remote HTTP access to the on-premises system.
Which Sage 100 records move into Basware and how often?
AP Invoices (with line detail), Purchase Orders, and Vendors are polled from Sage 100 and pushed into Basware. AP Invoices and POs are synced every 15 minutes to catch new transactions quickly, while Vendors are synced hourly as a master list. Polling uses DateLastUpdated fields so only changed records are pulled and re-sent.
What happens when Basware matches an invoice to a PO, and how does payment confirmation flow back?
Basware matches incoming invoices to POs and receipt lines using its three-way match engine. When an invoice is approved and payment is confirmed in Basware, ml-connector polls the Basware Data Access API or receives a webhook notification, then posts the payment confirmation and GL posting back into Sage 100 accounts payable so the invoice is marked paid and the GL is updated.

Related integrations

Connect Sage 100 and Basware

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

Get started