Sage X3 and Slack integration
Sage X3 processes procurement, manufacturing, and finance for your mid-market business. Slack is where your teams stay coordinated. When a purchase order clears approval in X3 or a vendor invoice arrives, your procurement team should know immediately without logging into the ERP. ml-connector watches Sage X3 for the transactions that matter to your business and posts them to Slack in real time, so finance and operations teams are always in the loop.
What moves between them
The main flow is from Sage X3 into Slack. ml-connector polls Sage X3 at a configurable interval for new or modified purchase orders, supplier invoices, and GL entries. When records are detected, it posts a formatted message to designated Slack channels containing the purchase order number, GL account, amount, supplier or customer name, and status. The messages are read-only in Slack; no data flows back to Sage X3 from Slack. Polling frequency is typically tied to your procurement workflow cadence, e.g. every 15 minutes during business hours or hourly overnight.
How ml-connector handles it
ml-connector stores both credential sets encrypted: the Sage X3 OAuth2 bearer token (with 5-minute expiry and 30-day refresh window) and the Slack bot token (non-expiring). On each poll interval, ml-connector calls Sage X3's REST api1 or GraphQL endpoint at the customer-supplied server URL, supplying the current timestamp as a filter against updatedDate to fetch only changed records since the last successful poll. It parses supplier IDs and GL account codes from the returned data, formats a summary message, and posts to Slack via chat.postMessage, throttling to 1 per second per channel to stay under rate limits. If the Sage X3 token nears expiry, ml-connector refreshes it using the persistent 30-day refresh token before it can cause a polling failure. Slack webhook signatures are verified with constant-time compare on every inbound signature. Every message and poll cycle is audited with timestamp, record counts, and any errors, so if a post fails it can be replayed.
A real-world example
A mid-sized industrial distributor runs Sage X3 on-premise for procurement, inventory, and finance across two regional offices. The procurement manager and finance team rely on X3 for purchase order approvals and vendor invoice posting, but they spend time checking X3 manually to see which orders cleared. They also miss urgent notifications when a large invoice arrives and needs to be disputed before payment. By connecting Sage X3 to Slack, approved purchase orders and newly received invoices post automatically to a dedicated procure channel so the procurement team is notified without logging in. Large invoices (above a threshold) post to finance for accounting review. Month-end close is faster because the team already knows which invoices arrived and which orders shipped, rather than discovering them while reconciling.
What you can do
- Post notifications to Slack when purchase orders are approved or modified in Sage X3, with order number and supplier name.
- Alert designated Slack channels when new supplier invoices arrive in X3, including GL account, amount, and vendor details.
- Send formatted messages to Slack when GL entries post to the general ledger, showing account code, debit/credit amount, and transaction source.
- Poll Sage X3 at your configured interval (15 minutes, hourly, or custom) without requiring webhooks, and refresh OAuth2 bearer tokens automatically before expiry.
- Maintain a full audit trail of every X3 query, message posted to Slack, and any errors, so notifications can be replayed if a post fails.
Questions
- How does the integration handle Sage X3 lack of webhooks?
- Sage X3 does not support outbound webhooks or event push notifications, so ml-connector polls the X3 instance at a configurable interval (e.g. every 15 minutes) and uses the updatedDate and modifiedDateTime fields on purchase orders, invoices, and GL entries to detect changes since the last poll. This approach works on both on-premise and cloud X3 deployments. If your business requires tighter real-time notification, increase the polling frequency.
- What happens when the Sage X3 OAuth2 token expires?
- Sage X3 access tokens expire in 5 minutes by design. ml-connector caches the refresh token (valid for 30 days) and automatically refreshes the bearer token before it expires on each poll cycle, so polling does not interrupt. The refresh token itself must be rotated by your X3 administrator at the 30-day boundary in the Connected Application; ml-connector will surface the expiry to you via audit log so you can schedule a refresh.
- How does Slack signature verification protect this integration?
- Every webhook notification from Slack includes an HMAC-SHA256 signature in the X-Slack-Signature header, computed from the request body and Slack's app signing secret. ml-connector verifies the signature using constant-time compare to ensure the message came from your Slack workspace and was not tampered with in transit. If the signature fails or the timestamp is older than 5 minutes, the request is rejected immediately.
Related integrations
More Sage X3 integrations
Other systems that connect to Slack
Connect Sage X3 and Slack
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started