ml-connector
Sage IntacctServiceTitan

Sage Intacct and ServiceTitan integration

Sage Intacct runs accounting and finance for service businesses. ServiceTitan runs field dispatch, scheduling, and job invoicing. Connecting them keeps your accounts payable, inventory, and vendor records aligned. When a technician schedules a service job in ServiceTitan, the resulting inventory bill and purchase orders can flow into Intacct automatically, allocated to the correct cost centers and vendor accounts. Vendor master data stays synchronized so invoices post to valid accounts.

How Sage Intacct works

Sage Intacct exposes vendors, AP bills, accounts payable payments, GL accounts, and cost center 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 for a sessionid that caches for 50 minutes. HTTP 200 responses may contain application-level errors inside XML body elements, so all responses must be parsed for errormessage tags. Intacct has no webhook system, so all data flows are scheduler-driven or manual.

How ServiceTitan works

ServiceTitan exposes invoices, inventory bills, purchase orders, vendors, customers, items, employees, business units, and jobs through a REST API with JSON payloads. Authentication uses OAuth2 client credentials and requires Client ID, Client Secret, App Key, and Tenant ID; tokens are valid for 900 seconds and must be cached. ServiceTitan supports outbound event webhooks with HMAC-SHA256 signature verification for events like job.created, invoice.created, and payment.created, with retry intervals of 10s, 30s, 60s, and 300s. AP Bills are read-only in the API; they are generated automatically when a Purchase Order is marked received.

What moves between them

The main flow is ServiceTitan into Sage Intacct. After a service job completes and an inventory bill is generated in ServiceTitan, ml-connector reads the bill and its associated purchase orders and posts them into Intacct's AP module as APBILL records, mapped to the vendor and GL account configured for that job type. Vendor master data flows in both directions so invoices reference valid vendors in Intacct. The sync runs on a schedule tied to your billing cycle, and ServiceTitan webhook events can also trigger real-time syncs where enabled.

How ml-connector handles it

ml-connector manages Sage Intacct's 50-minute session cache by storing the sessionid and refreshing it before expiry, eliminating session timeout outages during long polling runs. It handles Intacct's XML serialization requirements, including stripping forbidden C0 control characters before escaping entity references, and parses XML responses for application-level errormessage tags since HTTP 200 does not guarantee success. On the ServiceTitan side, ml-connector caches OAuth2 tokens for their full 900-second lifespan and refreshes them only when a call returns 401, and it reads AP bills and purchase orders on a schedule or via webhook push where configured. Vendor records are mapped first so AP bills reference VENDOR records that already exist in Intacct. Cost centers and job types are matched between the systems so each bill posts to the correct GL account and dimension. ServiceTitan AP bills are read-only, so ml-connector never writes financial entries back to ServiceTitan. Every record carries a full audit trail and can be replayed if a downstream API call fails.

A real-world example

A regional HVAC contractor runs ServiceTitan for field dispatch, job scheduling, and invoicing across 12 service territories, and uses Sage Intacct for accounting and AP. Before the integration, the back-office team received service reports from ServiceTitan, manually created inventory bills in Intacct by matching job type to the correct vendor, and entered costs by hand, a process that took 6 to 8 hours per week and introduced posting errors. With ServiceTitan and Sage Intacct connected, each completed job's inventory bill flows into Intacct automatically at cost, allocated to the vendor and GL account for that service type, and month-end close is accelerated because all AP transactions are posted and reconciled.

What you can do

  • Post ServiceTitan inventory bills and purchase orders into Sage Intacct as AP bills, allocated to the correct vendors and GL accounts.
  • Synchronize vendor master data bidirectionally so both systems reference the same vendors and account numbers.
  • Cache Intacct session tokens and ServiceTitan OAuth2 tokens to eliminate authentication round-trips and timeout failures.
  • Handle ServiceTitan webhooks for real-time bill and purchase order events, with fallback to polling on your billing cycle.
  • Parse Intacct XML responses for application-level errors and strip control characters automatically.

Questions

How does ml-connector handle Sage Intacct's session-based authentication and the 50-minute session timeout?
ml-connector stores the sessionid in encrypted memory and tracks its creation time. Before the session expires, ml-connector automatically refreshes it by calling getAPISession again with the stored credentials. This prevents timeout errors during long polling runs and allows uninterrupted syncs across multiple API calls.
What happens if ServiceTitan inventory bills are read-only in the API?
ServiceTitan generates AP bills automatically when a Purchase Order is marked received with auto-create-bill enabled. ml-connector reads these read-only bills from ServiceTitan and posts them into Sage Intacct as APBILL records. ml-connector never attempts to write bills back to ServiceTitan, so the read-only constraint is not a limitation.
Can ServiceTitan and Sage Intacct sync in real-time, or is polling the only option?
ServiceTitan supports outbound webhooks with HMAC-SHA256 signature verification, so job completion and billing events can trigger immediate syncs. Sage Intacct has no webhook system, so inbound changes are read by polling on a schedule you control. Both models are supported: webhook-driven push from ServiceTitan, or poll-based pull from Intacct on your billing cycle.

Related integrations

Connect Sage Intacct and ServiceTitan

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

Get started