ml-connector
Sage 100Slack

Sage 100 and Slack integration

Sage 100 handles your accounts payable, purchase orders, and general ledger, but your finance and operations teams work in Slack. Connecting the two keeps your team informed as records flow through the system. New invoices, open purchase orders, and GL posts surface automatically in the right Slack channels, so your team knows what is pending approval or has posted to the ledger without logging into Sage 100.

How Sage 100 works

Sage 100 is an on-premises ERP system with no native cloud API. Access to AP invoices, purchase orders, GL accounts, and GL journal entries is available only through a local Windows agent that wraps the BOI (Business Objects Interface) COM layer or through eBusiness Web Services SOAP, which covers sales orders and AR customers only. The system requires a Windows service account and agent-layer credentials via mTLS or API key. There are no webhooks or event streams, so records are read by polling using DateCreated and DateLastUpdated fields. Every call must include a three-character company code, and concurrent write operations are subject to COM record-locking, which requires retries with backoff.

How Slack works

Slack is a cloud REST API supporting both pull and push models. Messages are sent via chat.postMessage (rate limit: one per second per channel) and workspace events are delivered via the Events API to a registered HTTPS endpoint. All requests authenticate with OAuth 2.0 bearer tokens (bot token, xoxb- prefix). Webhook payloads are signed with HMAC-SHA256 and validated using the X-Slack-Signature header via constant-time comparison. Endpoints must return HTTP 2xx within three seconds. The Events API retries failed deliveries up to three times with exponential backoff.

What moves between them

Records flow from Sage 100 into Slack. ml-connector polls Sage 100 every 15 minutes for newly created or updated AP invoices and purchase orders, and every hour for new GL journal entries and GL account master changes. On each poll, records are formatted and posted as Slack messages to designated channels (one channel for AP, one for PO, one for GL). The polling schedule is configurable based on your business needs. Slack is write-only; ml-connector does not read back from Slack or post anything into Sage 100.

How ml-connector handles it

ml-connector stores the Sage 100 Windows agent endpoint URL and mTLS credentials encrypted, and verifies the agent certificate on each call. Because Sage 100 has no event stream, polling is controlled by tracking DateCreated and DateLastUpdated in the local Sage 100 database, which requires the agent to expose query filters. ml-connector caches the last poll time and timestamps to avoid re-posting the same records on each cycle. For Slack, ml-connector obtains an OAuth bot token at setup and stores it encrypted, then uses the token in the Authorization: Bearer header on each chat.postMessage call. Slack rate-limits at one message per second per channel, so ml-connector queues messages and throttles based on channel. Each Slack message includes the vendor name, invoice number, amount, status, and a link back to the Sage 100 record key for the finance team to look up the full detail. Retries are automatic on transient failures, and every post is logged with a full audit trail.

A real-world example

A mid-sized distributor runs Sage 100 for accounts payable and purchasing across three warehouses, and uses Slack for daily team communication. Before the integration, the accounts payable and purchasing staff checked Sage 100 multiple times each day for new invoices, open orders, and approvals needed. With the integration, new invoices appear in the AP Slack channel within minutes of entry, open purchase orders post to the procurement channel when created, and the team is notified immediately when a GL batch closes. The finance manager can see pending approvals without opening Sage 100, and the warehouse managers get alerts on orders affecting their locations.

What you can do

  • Post newly created AP invoices to a designated Slack channel, including vendor, amount, invoice number, and due date.
  • Notify the team when new purchase orders are issued, with PO number, vendor name, line count, and total amount.
  • Alert designated channels when GL journal entries post to the ledger, with account number, debit and credit totals, and posting date.
  • Authenticate to the Sage 100 Windows agent using mTLS or API key credentials stored encrypted.
  • Poll Sage 100 on a configurable schedule (AP and PO every 15 minutes, GL daily) and throttle Slack messages to respect rate limits.

Questions

How does ml-connector access Sage 100 if it has no cloud API?
ml-connector connects to the Sage 100 local Windows agent, which wraps the BOI COM layer and exposes BOI queries and inserts over mTLS or API key authentication. The agent runs on a customer server and is installed and configured by the customer. ml-connector does not call Sage 100 directly; it calls the agent, which bridges to the on-premises system.
Does ml-connector post messages back into Sage 100?
No. The integration is read-only from Sage 100. ml-connector polls AP invoices, purchase orders, and GL entries from Sage 100 and posts them to Slack, but does not create, update, or delete records in Sage 100. Slack is a notification layer only.
How are Sage 100 records mapped to Slack channels and formatted for readability?
Configuration maps record types (AP Invoice, PO, GL Entry) to Slack channels at setup time. When a record arrives, ml-connector extracts key fields (vendor, amount, number, date, status) and formats them as a Slack message block with text and metadata fields, making it scannable and including a record key link so the team can look up full detail in Sage 100 if needed.

Related integrations

Connect Sage 100 and Slack

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

Get started