ml-connector
DeltekMicrosoft Dynamics 365 Sales

Deltek and Microsoft Dynamics 365 Sales integration

Deltek Vantagepoint runs project accounting and delivery for professional services firms. Microsoft Dynamics 365 Sales runs the sales pipeline, from leads through opportunities and accounts. Connecting the two means the accounts, contacts, and won deals captured by sales land in Vantagepoint as client firms, contacts, and project opportunities without re-keying, and a project is seeded when a deal closes so delivery can start. ml-connector handles the very different APIs on each side and moves the data on a schedule you control. Dynamics 365 Sales has no GL accounts or project ledger, so the accounting stays in Deltek where it belongs.

How Deltek works

Deltek Vantagepoint exposes firms, contacts, employees, projects, opportunities, activities, AP and AR invoices, journal entries, and GL accounts through REST Hub and accounting transaction APIs on a tenant-specific URL such as https://acme.deltekfirst.com/acme/api/. It authenticates with OAuth 2.0 password grant, which requires the Allow Password Grant Type setting and an API user with the right roles and field visibility. Vantagepoint webhooks are workflow-driven, fire on record-save events, and carry no HMAC signature, so records are read by polling with page and pagesize parameters. There is no idempotency key, so the caller checks for an existing record before posting.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales is accessed entirely through the Microsoft Dataverse Web API, an OData v4 REST surface on a per-customer environment URL such as https://contoso.api.crm.dynamics.com/api/data/v9.2/. It exposes accounts, contacts, leads, opportunities, quotes, orders, invoices, products, and system users, all with full CRUD. Authentication uses OAuth 2.0 client credentials through Microsoft Entra ID, with a scope built from the environment URL and an Application User assigned a Dataverse security role. Dataverse pushes Create, Update, Win, and QualifyLead events to a registered webhook secured by a shared key rather than an HMAC signature, and supports delta tokens for incremental change tracking.

What moves between them

The main flow runs from Microsoft Dynamics 365 Sales into Deltek. ml-connector reads accounts and contacts from Dynamics and posts them into Vantagepoint as client firms and contacts, so the project ledger reflects the customers the sales team is working. When an opportunity is created or qualified, it is written to Vantagepoint as an opportunity against the matching client firm, and when the opportunity is marked Won, ml-connector seeds a Vantagepoint project so delivery and time capture can begin. System user owners on the Dynamics side are mapped to Vantagepoint employees. Dynamics 365 Sales holds no GL accounts, AP invoices, or project financials, so ml-connector never writes accounting data back into the CRM.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Dynamics side it requests an Entra ID client-credentials token, building the scope from the per-customer environment URL since there is no global address, and refreshes it before the roughly 60-minute expiry. On the Deltek side it accepts the full tenant URL and the database name per customer and requests a password-grant token, refreshing it on a 401. Because Vantagepoint webhooks carry no signature and fire only on configured workflow saves, the default is to poll Dynamics with delta tokens so each pass returns only changed records, and where a Dataverse webhook is registered with a shared key it can act as a trigger while the connector still reconciles by polling. Firms and contacts are mapped first so every opportunity references a client that already exists in Vantagepoint, and Dynamics owners resolve to Vantagepoint employees. Dynamics customerid lookups are polymorphic across account and contact, so the type field is read before mapping. Vantagepoint has no idempotency key, so ml-connector dedupes on the Dynamics record id and a BullMQ jobId and checks for an existing firm or opportunity before posting, which avoids creating duplicates from a re-read record. Dynamics returns HTTP 429 with a Retry-After header under its 5-minute service-protection limits, so the connector respects that header and applies exponential backoff. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A 200-person architecture and engineering firm runs Deltek Vantagepoint for project accounting and uses Microsoft Dynamics 365 Sales to track pursuits and client relationships. Before the integration, business developers logged accounts, contacts, and opportunities in Dynamics, and when a pursuit was won a project accountant re-keyed the client, the contacts, and the new project into Vantagepoint by hand, which delayed project setup and left the client lists in the two systems drifting apart. With Deltek and Microsoft Dynamics 365 Sales connected, accounts and contacts stay aligned, each opportunity is mirrored into Vantagepoint, and a won deal seeds a Vantagepoint project automatically. Project setup starts the same day a deal closes, and the duplicate data entry is gone.

What you can do

  • Post Microsoft Dynamics 365 Sales accounts and contacts into Deltek Vantagepoint as client firms and contacts.
  • Mirror Dynamics opportunities into Vantagepoint and seed a Vantagepoint project when a deal is marked Won.
  • Map Dynamics system user owners to Vantagepoint employees so pursuits and projects carry the right principal.
  • Bridge Entra ID client-credential tokens to Deltek tenant password-grant login across two different OAuth models.
  • Sync with Dataverse delta tokens and scheduled polling, with id and jobId dedup, retries, and a full audit trail.

Questions

Which direction does data move between Deltek and Microsoft Dynamics 365 Sales?
The main flow is Dynamics 365 Sales into Deltek. Accounts, contacts, and opportunities move from Dynamics into Vantagepoint as client firms, contacts, and project opportunities, and a won opportunity seeds a Vantagepoint project. Dynamics 365 Sales has no GL accounts or project ledger, so the accounting stays in Deltek and ml-connector never writes financial data back into the CRM.
How does the integration bridge the two different OAuth models?
Dynamics uses OAuth 2.0 client credentials through Microsoft Entra ID, with a scope built from each customer's environment URL and an Application User assigned a Dataverse role. Deltek Vantagepoint uses OAuth 2.0 password grant against a tenant URL, which requires the Allow Password Grant Type setting and an API user with the right roles. ml-connector stores both credential sets encrypted and refreshes each token on its own schedule, including refreshing the Deltek token when a call returns 401.
Does Dynamics push changes, or does ml-connector poll for them?
Both are supported, but polling with Dataverse change tracking is the default because Deltek Vantagepoint has no signed webhook and its callbacks only fire on configured workflow saves. ml-connector uses Dynamics delta tokens so each pass returns only changed records, and where a Dataverse webhook is registered with a shared key it can act as a trigger. Because Vantagepoint has no idempotency key, the connector dedupes on the Dynamics record id and a jobId and checks for an existing record before posting.

Related integrations

Connect Deltek and Microsoft Dynamics 365 Sales

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

Get started