ml-connector
Sage IntacctSlack

Sage Intacct and Slack integration

Sage Intacct runs your general ledger, AP, and finance operations. Slack keeps your team connected and informed. Connecting the two surfaces finance events and exceptions directly in the channels where teams already work, so your finance and operations staff can monitor bill posts, payment runs, and reconciliation issues in real time without logging into a separate portal. ml-connector handles the session management and XML parsing on the Intacct side and the OAuth token flow on Slack, and moves the data on a schedule that fits your accounting calendar.

How Sage Intacct works

Sage Intacct exposes vendors, AP bills, payments, GL accounts, and dimensions through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Every request is an HTTPS POST with Content-Type application/xml. Authentication is session-based using senderId, senderPassword, companyId, userId, and userPassword; an initial getAPISession call exchanges credentials for a sessionid that is cached for 50 minutes and automatically refreshed. All data flows are read via polling; Intacct does not support webhooks. Responses always return HTTP 200 even on application-level errors, so every response must be parsed for errormessage tags to detect failures. The XML gateway serializes all operations through a single endpoint, and sessions are isolated in-process per senderId, companyId, and userId combination.

How Slack works

Slack exposes users, conversations, messages, and files through a REST API at https://slack.com/api/{method}, where method follows the pattern family.action (e.g., conversations.list, chat.postMessage). Authentication is OAuth 2.0 Authorization Code flow, resulting in a non-expiring bot token (xoxb- prefix) that is passed via Authorization Bearer header. Slack supports both webhooks and polling: the Events API can push workspace activity to your HTTPS endpoint via HTTP POST callbacks with HMAC-SHA256 signature verification. Webhook endpoints must return HTTP 2xx within 3 seconds or Slack retries up to 3 times with exponential backoff. The chat.postMessage method is rate-limited to 1 per second per channel.

What moves between them

Finance events and exceptions flow one direction, from Sage Intacct to Slack. After a scheduled GL posting run or on-demand payment batch in Intacct, ml-connector reads the GL accounts affected and the vendor payments processed, formats a summary, and posts it to a designated Slack channel. If Intacct detects unbalanced entries or vendor exceptions during the read, ml-connector posts those as alerts. Slack is write-only in this flow; team comments in the channel do not flow back into Intacct.

How ml-connector handles it

ml-connector stores the Intacct partner credentials and user credentials encrypted, and caches the sessionid it receives from getAPISession, refreshing it before the 50-minute expiry window closes. Because Intacct uses a single XML gateway endpoint, all read requests serialize through one HTTPS POST connection; ml-connector batches related queries (GL accounts, vendor masters, payments) into a single session to minimize round trips. Responses are parsed for errormessage tags at the application level, since HTTP 200 does not indicate success. For Slack, ml-connector exchanges the OAuth authorization code for a bot token during setup and stores it encrypted; every message post uses that token via the Authorization Bearer header. Slack rate-limits chat.postMessage to 1 per second per channel, so ml-connector queues posts and spaces them if necessary. When a webhook from Slack is enabled, ml-connector verifies the HMAC-SHA256 signature on every incoming request and responds within 3 seconds. Every GL posting and payment alert carries a full audit trail and can be replayed if the Slack post fails or is retried.

A real-world example

A mid-sized distribution and logistics company runs Sage Intacct for GL, AP, and vendor management across three regional offices. The finance team processes vendor invoices and approves payments on a bi-weekly cycle, but has no real-time visibility into whether GL postings succeeded or if there are exceptions in the payment batch. Before the integration, finance staff logged into Intacct every morning to check the prior day's posts and payments, and spent time chasing down missing or malformed entries. With Sage Intacct and Slack connected, each day's GL posting run and payment batch automatically post a summary to a dedicated finance-operations channel, flagging any unbalanced entries or rejected vendors. The finance team now catches exceptions while they are still in the current window to fix them, and the daily sync takes minutes instead of hours.

What you can do

  • Post Sage Intacct GL posting summaries and payment batch results to Slack channels on a schedule tied to your close calendar.
  • Alert the finance team to GL posting exceptions, unbalanced entries, and vendor payment rejections in real time.
  • Authenticate Intacct with session-based XML credentials and Slack with OAuth 2.0 bot tokens, storing both encrypted.
  • Parse Intacct's XML responses for application-level errors and handle 50-minute session expiry with automatic refresh.
  • Batch Intacct queries into a single XML gateway connection and respect Slack's rate limits with automatic queuing.

Questions

Which direction does data move between Sage Intacct and Slack?
Data flows one direction, from Sage Intacct to Slack. GL posting confirmations, payment batch summaries, and finance exceptions are posted to a designated Slack channel. Slack is write-only; comments from team members in the channel do not flow back into Intacct.
Why does every Sage Intacct response need to be checked for error messages?
Sage Intacct returns HTTP 200 on every request, regardless of success or failure. Application-level errors are embedded in the XML response body as errormessage tags. ml-connector parses every response for these tags so that posting failures, vendor exceptions, and GL imbalances can be detected and alerted.
How does ml-connector handle Slack's 1-per-second rate limit on chat.postMessage?
Slack rate-limits the chat.postMessage method to 1 request per second per channel. ml-connector queues posts to the same channel and spaces them automatically so that multiple alerts or summaries do not collide. This ensures every message is delivered without rejection.

Related integrations

Connect Sage Intacct and Slack

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

Get started