ml-connector
Microsoft Dynamics NAVProcore

Microsoft Dynamics NAV and Procore integration

Microsoft Dynamics NAV runs procurement and GL accounting for small-to-medium businesses. Procore runs construction project management and cost tracking. Connecting the two keeps your project costs and your general ledger synchronized. Purchase orders and invoices from NAV flow into Procore as commitments and requisitions, and project costs and change orders from Procore post back into NAV on the correct GL accounts and cost centers. ml-connector bridges the very different APIs and keeps the subscriptions and tokens alive.

How Microsoft Dynamics NAV works

Microsoft Dynamics NAV exposes vendors, purchase orders, purchase invoices, sales orders, GL accounts, dimensions, items, and employees through OData v4 REST APIs (primary) and legacy SOAP web services. Business Central online authenticates with OAuth 2.0 client credentials via Microsoft Entra ID against a tenant-specific URL. On-premises installations support both OAuth 2.0 and Basic auth with a web service access key. NAV supports webhooks for push notifications on most entities (3-day subscription expiry, max 200 subscriptions per environment), but for high-volume record changes NAV batches notifications into a single collection event instead of per-record pushes. GL accounts are read-only in the standard API, and general ledger entries are immutable once posted.

How Procore works

Procore exposes vendors, purchase order contracts, requisitions, payment applications, direct costs, cost codes, budget line items, change orders, and projects through REST APIs in both v1.0 and v2.x versions. Every call requires OAuth 2.0 client credentials (tokens expire in 1.5 hours) and a company_id parameter; project-scoped resources also require project_id. Procore has no standalone GL accounts endpoint, so cost codes and cost types serve as the accounting mapping layer. Webhooks push create, update, and delete events in real-time on resources like commitments, requisitions, direct costs, and change orders, but must be publicly accessible HTTPS and return a 2xx status within 5 seconds or the webhook is assumed failed.

What moves between them

The main flow runs from Microsoft Dynamics NAV into Procore. Purchase orders and invoices from NAV become commitments and requisitions in Procore, automatically tagged with the correct project so they appear in project costs and forecasts. Change orders and direct costs from Procore flow back into NAV as purchase invoices or GL journal entries, routed to the matching GL account via the cost code mapping. Reference data such as vendors and cost codes is aligned in both directions so that Procore project costs post to valid NAV GL dimensions. The sync runs on a schedule or in response to NAV webhook notifications; Procore pushes cost events back to ml-connector in real-time via webhooks.

How ml-connector handles it

ml-connector stores both credential sets encrypted and manages the OAuth 2.0 token lifecycle on each side: it refreshes NAV tokens when a call returns 401, and it refreshes Procore tokens every 1.5 hours before they expire. NAV webhook subscriptions expire every 3 days, so ml-connector monitors subscription age and renews before expiry to avoid gaps in the sync. Cost codes in Procore are mapped to specific GL accounts and dimensions in NAV so that project costs route to the right bucket at month-end close. Purchase order numbers become commitment IDs in Procore, preserving the link for reconciliation. If a NAV webhook notification batches multiple records (more than 1000 changes in a ~30-second window), ml-connector processes the collection event and fetches the full dataset to avoid missing details. Procore webhook payloads must be handled within 5 seconds, so ml-connector queues them immediately and processes off-thread. Every record carries a full audit trail and can be replayed if a downstream post fails.

A real-world example

A regional concrete and formwork contractor runs Microsoft Dynamics NAV for procurement and GL accounting across five job sites and head office, and uses Procore as the system of record for project costs, budgets, and change tracking. Before integration, the accounting team exported purchase orders from NAV every week and manually entered them into Procore as commitments, then waited for project managers to log direct costs in Procore before exporting them back into NAV for month-end GL postings. Double-entry meant the accounts payable ledger never matched the committed project costs, and change orders were reconciled by hand after the fact. With NAV and Procore connected, every PO flows into Procore automatically, tagged to the correct project, and every change order and direct cost from Procore posts back to NAV on the matching GL account. The accounts payable ledger and the project budgets now stay in sync, and month-end close no longer requires manual reconciliation between systems.

What you can do

  • Sync purchase orders and invoices from Microsoft Dynamics NAV into Procore as commitments and requisitions, tagged to the correct project.
  • Map Procore cost codes and change orders back to Microsoft Dynamics NAV GL accounts and cost centers so project costs post correctly at month-end.
  • Manage NAV webhook subscriptions by renewing them before their 3-day expiry window closes.
  • Refresh OAuth 2.0 tokens on both sides and handle rate-limiting retries so token expiry never blocks a sync.
  • Maintain a full audit trail on every record and replay failed posts if a downstream system rejects a record.

Questions

How does ml-connector handle Microsoft Dynamics NAV's 3-day webhook subscription expiry?
ml-connector tracks the subscription age and renews subscriptions 24 hours before they expire, so the sync never lapses due to an expired subscription. It monitors both NAV online and on-premises webhook subscriptions the same way.
How are Procore cost codes mapped to Microsoft Dynamics NAV GL accounts?
ml-connector stores a mapping table that links each Procore cost code to a specific NAV GL account and dimension (such as department or cost center). When a cost record flows from Procore to NAV, ml-connector uses this table to post the entry to the correct GL account, so project costs land in the right bucket during month-end close.
What happens when NAV or Procore OAuth tokens expire during a sync?
ml-connector refreshes NAV tokens on-demand when a call returns 401, and it refreshes Procore tokens every 1.5 hours before they can expire. If a token refresh fails, the record is queued for retry with exponential backoff so the sync continues as soon as the token service recovers.

Related integrations

Connect Microsoft Dynamics NAV and Procore

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

Get started