Sage Intacct and ServiceNow integration
Sage Intacct runs accounting and GL posting. ServiceNow runs procurement and accounts payable approval. Connecting the two keeps your AP records, vendor master, and general ledger synchronized across both systems. Bills from Sage Intacct flow into ServiceNow's staging tables for review and approval, and reconciliation data flows back to Intacct so your GL always matches the approved invoice register. ml-connector handles the very different transports on each side and moves the data on a schedule you control.
What moves between them
The main flow runs from Sage Intacct into ServiceNow. After processing, ml-connector reads AP bills and vendors from Intacct and stages them in ServiceNow's APO invoice and supplier staging tables so the procurement team can review and approve them. Once approved in ServiceNow, invoice reconciliation records flow back into Intacct's AP payment and GL posting tables, closing the cycle. Reference data such as GL accounts and cost centers is aligned in both directions on an hourly schedule so approved invoices land on valid Intacct GL dimensions.
How ml-connector handles it
ml-connector stores both credential sets encrypted and manages the authentication differences carefully. On the Sage Intacct side, it calls getAPISession to exchange partner and user credentials for a sessionid at startup, caches the session for up to 50 minutes, and automatically refreshes when approaching expiry. The session key is keyed on senderId, companyId, and userId so different customer tenants are isolated. All Intacct operations go through the single XML gateway with synchronous polling, and because HTTP 200 responses may contain application-level errormessage tags inside the XML body, ml-connector parses every response to detect errors that a naive HTTP status code check would miss. On the ServiceNow side, ml-connector obtains an OAuth 2.0 bearer token for the configured instance subdomain, refreshes it when a call returns 401, and verifies that the service account has the required APO and procurement roles. Intacct's XML control character constraints are respected: forbidden C0 controls except tab, newline, and carriage return are stripped before escaping entity references. Retried operations use Intacct's control block uniqueid flag for server-side deduplication so a network hiccup does not create duplicate bills. Staging records carry full audit trails and can be replayed if a downstream approval fails.
A real-world example
A mid-sized manufacturing company runs Sage Intacct for general ledger and accounts payable, and uses ServiceNow for procurement and vendor management. Before integration, the AP team entered vendor invoices into Intacct by hand after procurement approved them in ServiceNow, creating a two-day lag and frequent discrepancies between the invoice register and GL. With Sage Intacct and ServiceNow connected, bills from Intacct stage directly into ServiceNow's APO workflow for review, and once approved, reconciliation data flows back to Intacct so the GL is updated automatically. Month-end close is faster because approved invoices are already posted to the correct GL accounts and cost centers.
What you can do
- Read AP bills and vendors from Sage Intacct and stage them in ServiceNow APO tables for procurement review and approval.
- Sync GL accounts and cost centers between Sage Intacct and ServiceNow so invoices post to valid dimensions in both systems.
- Post approved invoices and payment records from ServiceNow back into Sage Intacct for GL reconciliation and closure.
- Manage Sage Intacct session refresh every 50 minutes and ServiceNow OAuth token refresh on demand, with automatic retry on 401.
- Poll on a schedule tied to your AP and procurement calendar, with full audit trails and error replay on every record.
Questions
- How does ml-connector handle Sage Intacct's XML session expiry and ServiceNow OAuth tokens?
- Sage Intacct sessions expire after 50 minutes and are automatically refreshed on the next call by re-executing getAPISession with the partner and user credentials. ServiceNow OAuth tokens expire after 30 minutes and are refreshed by requesting a new token when a call returns 401 or when the cached token is within 5 minutes of expiry. Both refresh flows are transparent and do not interrupt the data pipeline.
- What makes the XML parsing tricky with Sage Intacct?
- Sage Intacct always returns HTTP 200, even when an operation fails. Application-level errors are embedded in the XML response body inside errormessage tags, so ml-connector must parse every response to detect failures that a naive HTTP status check would miss. Additionally, forbidden XML control characters (C0 controls except tab, newline, and carriage return) must be stripped from bill and vendor data before XML escaping to prevent parse errors.
- How are invoices approved in ServiceNow and then posted to Sage Intacct?
- Approved invoices in ServiceNow trigger a workflow state change in the APO staging tables. ml-connector reads the approved records on a polling schedule and posts them to Sage Intacct using the updateAPBILL operation, mapped to the matching GL accounts and cost centers. The control block uniqueid flag ensures that retried posts do not create duplicate bills if a network error occurs.
Related integrations
More Sage Intacct integrations
Other systems that connect to ServiceNow
Connect Sage Intacct and ServiceNow
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started