ml-connector
Microsoft Dynamics NAVServiceTitan

Microsoft Dynamics NAV and ServiceTitan integration

ServiceTitan manages dispatch and invoicing for field-service businesses. Microsoft Dynamics NAV manages accounting and finance. Connecting the two keeps your purchase orders and invoices in sync without re-keying. Work orders and inventory bills from ServiceTitan flow into Microsoft Dynamics NAV as purchase invoices and general ledger entries, so your field costs are recorded in the general ledger automatically. ml-connector bridges the different APIs and handles the credentials, retries, and audit trail.

How Microsoft Dynamics NAV works

Microsoft Dynamics NAV is available as an on-premises ERP or Dynamics 365 Business Central online. It exposes vendors, purchase orders, purchase invoices, GL accounts, general ledger entries, items, dimensions, and employees through OData v4 REST or SOAP web services. The online product authenticates with OAuth 2.0 client credentials via Microsoft Entra ID; on-premises environments support OAuth 2.0 or legacy Basic auth with a web service access key. Both support webhook push notifications with a 3-day subscription window that must be renewed, or polling via REST queries. Webhooks for purchase orders are not in the standard supported list, so integration typically polls for new or updated orders and invoices.

How ServiceTitan works

ServiceTitan is a cloud-based field-service-management platform that exposes purchase orders, inventory bills (read-only), invoices, payments, vendors, items, employees, jobs, and appointments through REST APIs secured with OAuth2 client credentials. Authentication requires a Client ID, Client Secret, App Key header, and Tenant ID in the URL path, with tokens valid for 15 minutes. ServiceTitan sends outbound webhooks with HMAC-SHA256 signatures and supports event types including job.created, job.updated, invoice.created, and invoice.updated with automatic retries at 10s, 30s, 60s, and 300s intervals. The API rate limit is 60 calls per second; GL accounts are not exposed via API.

What moves between them

Purchase orders created or updated in ServiceTitan flow into Microsoft Dynamics NAV as purchase invoices, mapped to the matching vendor in NAV. Inventory bills (generated when purchase orders are marked received in ServiceTitan) are read and mapped into NAV's general ledger journal entries, allocated to the appropriate GL accounts and dimensions. The flow runs from ServiceTitan into NAV on a polling schedule or via ServiceTitan webhooks if available. Reference data such as vendors, items, and dimensions are aligned in both directions so field-service purchase orders land on valid NAV accounts.

How ml-connector handles it

ml-connector stores the OAuth2 credentials for both systems and refreshes tokens when they expire (15 minutes for ServiceTitan, per the client credentials flow). For Microsoft Dynamics NAV online, it uses OAuth 2.0 via Microsoft Entra ID; for on-premises NAV, it uses OAuth 2.0 or Basic auth depending on your instance configuration. It polls ServiceTitan for new or updated purchase orders and inventory bills on a schedule you set, then maps those records to NAV's vendor master, GL accounts, and dimensions before posting them as purchase invoices and journal lines. ml-connector handles the ServiceTitan rate limit (60 calls per second) and implements exponential backoff on retries. It tracks the webhook subscription window in NAV and renews before expiry so notifications do not drop. Every record carries a full audit trail showing which ServiceTitan order mapped to which NAV invoice and GL entry, and jobs can be replayed if a downstream call fails.

A real-world example

A regional HVAC and plumbing contractor runs ServiceTitan for dispatch and job invoicing across four service territories, and uses Microsoft Dynamics NAV online for accounting. Before the integration, the office team exported purchase orders from ServiceTitan weekly and manually entered them into NAV as purchase invoices, then had to reconcile service-cost allocations to job codes and GL accounts during month-end close. With ServiceTitan and NAV connected, each ServiceTitan purchase order automatically posts into NAV mapped to the correct GL account and service territory dimension, and inventory bills flow directly to the journal. The accounting team no longer re-keys field-service purchases, month-end reconciliation is faster, and the general ledger reflects the true cost of each territory's service work.

What you can do

  • Post ServiceTitan purchase orders into Microsoft Dynamics NAV as purchase invoices with automatic vendor and item mapping.
  • Flow inventory bills from ServiceTitan into NAV's general ledger journal, allocated to the correct GL accounts and dimensions.
  • Authenticate ServiceTitan with OAuth2 and Microsoft Dynamics NAV with OAuth2 via Microsoft Entra ID (online) or Basic auth (on-premises).
  • Renew NAV webhook subscriptions before the 3-day expiry window and handle field-service-to-ERP data mapping with a full audit trail.
  • Support polling on a schedule tied to your service workflow, with retries and error replay on every record.

Questions

Which direction does data move between Microsoft Dynamics NAV and ServiceTitan?
The main flow is from ServiceTitan into Microsoft Dynamics NAV. Purchase orders and inventory bills from ServiceTitan move into NAV as purchase invoices and journal entries. Reference data such as vendors, items, and dimensions can be aligned in both directions so field-service orders map to valid NAV GL accounts. NAV GL accounts are read-only, so ml-connector does not write financial entries back into ServiceTitan.
How does the integration handle the 3-day webhook subscription expiry in NAV?
ml-connector tracks the 3-day expiry window on NAV webhook subscriptions and automatically renews them before they expire so push notifications from NAV do not drop. For entities like purchase orders that are not in NAV's standard webhook list, ml-connector can poll instead of waiting for a push.
What happens to purchase orders that ServiceTitan marks as received but NAV has not yet processed?
ml-connector polls ServiceTitan for new and updated purchase orders on a schedule you set, then maps them to NAV vendors, items, and GL accounts before posting as purchase invoices. Inventory bills (generated when orders are marked received in ServiceTitan) are read and posted as journal lines. If a downstream NAV call fails, ml-connector retries with exponential backoff and keeps a full audit trail so the job can be replayed.

Related integrations

Connect Microsoft Dynamics NAV and ServiceTitan

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

Get started