ml-connector
Sage 100ServiceTitan

Sage 100 and ServiceTitan integration

ServiceTitan runs field service dispatch and job invoicing for HVAC, plumbing, and electrical contractors. Sage 100 runs accounting and AP. Connecting them keeps your cost codes in sync and moves vendor invoices from ServiceTitan into Sage 100's AP automatically, so finance teams no longer re-key invoices by hand. ml-connector deploys a local Windows agent on your Sage 100 server to bridge the two, handling the very different APIs and the vendor matching that makes reconciliation fast.

How Sage 100 works

Sage 100 is on-premises only and exposes GL, AP, inventory, and purchasing through SOAP (eBusiness Web Services, limited to AR and sales orders) or through a local Windows agent wrapping the BOI COM layer (which exposes full AP, GL, vendors, and invoices). SOAP uses username and password per call with no tokens or refresh. The BOI agent requires a Windows service account and optional agent-layer credentials. Sage 100 has no webhooks, so ml-connector polls AP invoices, vendors, and GL accounts using DateLastUpdated and DateCreated fields. All calls require a company code. The GL account format is multi-segment and varies by customer configuration.

How ServiceTitan works

ServiceTitan exposes invoices, AP bills (read-only, auto-generated from purchase orders), vendors, purchase orders, and job data through REST APIs with OAuth2 client credentials. Every call requires a Client ID, Client Secret, App Key header, and Tenant ID in the URL path. Tokens are valid for 15 minutes and should be cached. ServiceTitan supports outbound webhooks with HMAC-SHA256 signature verification for job, invoice, payment, customer, and appointment events. The rate limit is 60 calls per second per tenant. AP bills are read-only; they are generated automatically when a purchase order is marked received if auto-create-bill is enabled.

What moves between them

ServiceTitan invoices and AP bills flow into Sage 100's accounts payable on a poll schedule you control, typically every 15 to 30 minutes. Vendors are synced bidirectionally so new vendors in either system can be matched by name and code. GL accounts are read from Sage 100 to align job cost codes and service categories with valid account dimensions. The integration flags duplicate invoices (by reference number and amount) to prevent double-entry in AP.

How ml-connector handles it

ml-connector runs a Windows service on your Sage 100 server. It caches OAuth2 tokens from ServiceTitan, refreshing every 14 minutes, and makes SOAP calls to Sage 100 with your configured company code and user credentials. For each ServiceTitan invoice, it matches the vendor in Sage 100 by code or name, fetches the matching GL account from Sage 100 for the job cost code or service category, and creates an AP invoice record in Sage 100 with the job reference and amount. Duplicate detection uses the invoice reference number and amount to prevent re-entry. Because Sage 100 COM locks records during concurrent writes, ml-connector backs off and retries on lock timeouts. ServiceTitan's AP bills are read as reference data but not written back, since they are auto-generated and read-only.

A real-world example

A plumbing and electrical contractor runs ServiceTitan for job dispatch, scheduling, and invoicing across 12 service trucks and an office. They also run Sage 100 for accounting, AP, and cost tracking by job. Before the integration, office staff exported service invoices from ServiceTitan daily and manually entered them into Sage 100 AP, a process that took 45 minutes per day and often contained vendor-name mismatches. With ServiceTitan and Sage 100 connected, each invoice flows into AP automatically and is matched to the job cost code in Sage 100, so reconciliation is immediate and the manual data entry step is gone.

What you can do

  • Sync ServiceTitan invoices and AP bills into Sage 100 accounts payable on a poll schedule you control.
  • Match vendors across both systems by code or name, and auto-create missing vendors in Sage 100.
  • Align job cost codes and service categories with Sage 100 GL accounts so invoices post to the correct dimension.
  • Prevent duplicate invoices in Sage 100 AP by checking reference number and amount.
  • Run as a Windows service on your Sage 100 server, handling OAuth2 token refresh and SOAP credential routing.

Questions

Does the integration require changes to Sage 100 or ServiceTitan?
No schema changes. On the Sage 100 side, you must enable the configured user for Web Services in Sage 100 admin (off by default). On the ServiceTitan side, you create an OAuth2 application in the Developer Portal with the permissions to read invoices, AP bills, vendors, and purchase orders. ml-connector does the rest.
Why is a local Windows agent required instead of a cloud connection?
Sage 100 is on-premises only and does not expose a cloud API. The SOAP surface is limited to AR and sales orders, so AP and GL access requires the BOI COM layer, which runs only on a Windows machine with Sage 100 installed. ml-connector runs the agent on that machine to bridge to ServiceTitan's cloud REST API.
What happens if an invoice already exists in Sage 100 AP?
ml-connector checks for duplicates by matching the ServiceTitan invoice reference number and amount against existing Sage 100 AP invoices. If a match is found, the record is skipped and flagged in the audit log. This prevents double-entry if the integration is paused and resumed or if an invoice is re-sent.

Related integrations

Connect Sage 100 and ServiceTitan

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

Get started