ml-connector
Sage IntacctServiceNow

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.

How Sage Intacct works

Sage Intacct is a cloud-based ERP and accounting system that exposes vendors, AP bills, AP payments, GL accounts, and dimensions through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication uses session-based credentials: senderId, senderPassword, companyId, userId, and userPassword are exchanged via getAPISession for a sessionid that is cached for 50 minutes. Intacct has no native webhook system, so all reads are polling-driven. All operations serialize through the single XML gateway POST, and HTTP 200 responses may contain application-level errors inside the XML body that must be parsed carefully. Sessions are automatically refreshed when they expire.

How ServiceNow works

ServiceNow is a cloud-based enterprise platform with Source-to-Pay operations for accounts payable and procurement. It exposes vendors, purchase orders, invoices, GL accounts, cost centers, and users through REST and JSON at https://{instance}.service-now.com. Authentication uses OAuth 2.0 Client Credentials or OAuth 2.0 Authorization Code, with a default token lifespan of 30 minutes. ServiceNow has no native outbound webhook registration; the polling pattern queries using sysparm_query filters on sys_updated_on, typically every 5 minutes. Each customer runs an isolated instance at a unique subdomain with module-specific roles and permissions required for APO and procurement operations.

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

Connect Sage Intacct and ServiceNow

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

Get started