ml-connector
DeltekServiceTitan

Deltek and ServiceTitan integration

ServiceTitan runs field-service operations: dispatch, jobs, invoicing, and payments. Deltek runs project-based accounting and the general ledger. Connecting the two moves the money side of completed work into the books without re-keying. Job invoices and payments recorded in ServiceTitan post into Deltek as receivables and cash, while purchase-order bills feed Deltek accounts payable. ml-connector handles the different APIs on each side and keeps customers, vendors, and GL coding aligned.

How Deltek works

Deltek Vantagepoint exposes firms (clients and vendors), contacts, employees, projects, AP invoices, AR invoices, journal entries, cash receipts, and GL accounts through a REST JSON API on a tenant-specific URL such as acme.deltekfirst.com, documented in an interactive reference per version. It authenticates with OAuth2 using the password grant, which must be explicitly enabled in newer versions, and access to fields is governed by the API user role. Vantagepoint has only workflow-triggered outbound webhooks with no HMAC signature, so finance records are read by polling. The Costpoint product is SOAP and template based and is integrated differently.

How ServiceTitan works

ServiceTitan exposes customers, job invoices, payments, purchase orders, vendors, inventory bills, business units, and pricebook items through its V2 REST API, organized into namespaces such as accounting, inventory, crm, and settings, with the tenant ID embedded in every URL path. Every call uses an OAuth2 client-credentials bearer token that lives for 15 minutes plus a required ST-App-Key header. ServiceTitan pushes events such as invoice.created, payment.created, and job.updated by webhook, signed with HMAC-SHA256 in the x-servicetitan-signature header. AP bills cannot be created through the API; they are generated when a received purchase order has auto-create-bill enabled.

What moves between them

The main flow runs from ServiceTitan into Deltek. ml-connector reads completed job invoices and posts them into Deltek as AR invoices against the matching project, reads payments and posts them as Deltek cash receipts applied to those invoices, and reads PO-derived inventory bills and posts them into Deltek as AP invoices or journal entries against the correct GL accounts and vendors. Customer and vendor reference data is aligned so every posting references a firm that already exists in Deltek. ServiceTitan has no general-ledger chart-of-accounts API, so all GL coding lives on the Deltek side, and ml-connector does not write GL entries back into ServiceTitan.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the ServiceTitan side it caches the 15-minute client-credentials token, reuses it until expiry, and sends the ST-App-Key header and the correct tenant-path namespace on every call. On the Deltek side it accepts the full tenant URL per customer, uses the OAuth2 password grant, and refreshes the bearer token before it lapses. ServiceTitan invoice and payment webhooks arrive signed with HMAC-SHA256, so each notification is verified against the secret before processing and acted on as activity occurs; a scheduled poll backfills anything a webhook missed. Because Deltek finance has no usable push, Deltek reads are polled on the cadence you set. Customers map to Deltek firms and ServiceTitan business units map to Deltek projects or organizations, so postings land on valid dimensions. ServiceTitan rate limits at 60 calls per second and Deltek has no documented idempotency key, so ml-connector backs off on 429s and checks for an existing record before posting to avoid duplicates. Every record carries a full audit trail and can be replayed if a Deltek post fails.

A real-world example

A regional commercial HVAC and plumbing contractor with roughly 120 field staff runs ServiceTitan for dispatch, job invoicing, and field payments, and runs Deltek Vantagepoint for project accounting and the general ledger. Before the integration, the accounting team exported invoice and payment registers from ServiceTitan each week and keyed the totals into Deltek by project, then spent month-end close chasing differences between field revenue and the ledger and matching supplier bills to the jobs that incurred them. With Deltek and ServiceTitan connected, each completed invoice and payment posts into Deltek against the right project as it happens, and purchase-order bills flow into accounts payable. Close starts from reconciled project revenue, and the weekly re-keying step is gone.

What you can do

  • Post ServiceTitan job invoices into Deltek as AR invoices against the matching project.
  • Record ServiceTitan payments as Deltek cash receipts applied to the right invoices.
  • Move PO-derived ServiceTitan inventory bills into Deltek accounts payable against the correct vendors and GL accounts.
  • Align ServiceTitan customers and vendors with Deltek firms so every posting references a record that already exists.
  • Verify ServiceTitan HMAC webhooks, poll Deltek on a schedule, and retry with a full audit trail on every record.

Questions

Which direction does data move between Deltek and ServiceTitan?
The main flow is ServiceTitan into Deltek. Job invoices, payments, and purchase-order bills move from ServiceTitan into Deltek as receivables, cash receipts, and payables. Customers and vendors are aligned across both systems, and ml-connector does not write general-ledger entries back into ServiceTitan because ServiceTitan has no GL chart-of-accounts API.
How are vendor bills handled when ServiceTitan cannot create them by API?
ServiceTitan generates an inventory bill automatically when a received purchase order has auto-create-bill enabled, since bills cannot be posted directly through the API. ml-connector reads that derived inventory bill and posts it into Deltek as an AP invoice or journal entry against the matching vendor and GL account. The purchase order receipt in ServiceTitan remains the trigger for the payable.
How does the integration handle the two different auth schemes and webhooks?
ServiceTitan uses an OAuth2 client-credentials token that expires every 15 minutes plus a required ST-App-Key header, so ml-connector caches the token, reuses it until expiry, and sends the app key on every call. Deltek uses the OAuth2 password grant against a tenant-specific URL, which ml-connector refreshes before it lapses. ServiceTitan webhooks are verified with HMAC-SHA256, while Deltek finance records are polled because Deltek has no usable push.

Related integrations

Connect Deltek and ServiceTitan

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

Get started