Microsoft Dynamics 365 F&O and AvidXchange integration
Microsoft Dynamics 365 F&O runs financials, procurement, and the general ledger. AvidXchange automates invoice capture, approval routing, and payment execution. Connecting the two keeps the vendor master and chart of accounts in agreement so AP staff code invoices against valid payees and accounts, and the settled payment records AvidXchange produces post back into D365 without re-keying. ml-connector handles the very different APIs on each side and moves the data on a schedule you control. Because invoice approval routing stays inside AvidXchange, ml-connector syncs the data around it rather than trying to manage the workflow.
What moves between them
Vendor master records and GL accounts flow from Microsoft Dynamics 365 F&O into AvidXchange so invoices can be coded to the correct payee and account, since AvidXchange treats GL codes as read-only reference data pulled from the ERP. Financial dimensions such as departments and cost centers move the same direction for multi-segment coding. Invoices captured in AvidXchange, along with their approved status, are read back and posted into D365 as vendor invoice records. After AvidPay executes payment, ml-connector pulls the settled payment data, including method, check number, and ACH trace, into D365 vendor payment journal lines. Cadence is a scheduled poll, typically every 15 to 30 minutes, because neither side offers a webhook that fits this flow.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the D365 side it requests an Entra ID OAuth2 client-credentials bearer token scoped to the environment host, refreshes it on expiry, and accepts the full tenant URL per customer since there is no shared base address. On the AvidXchange side it passes the Company Token and User Token as headers on each AvidConnect call. Because AvidXchange has no public webhook and D365 Business Events carry only stubs, ml-connector polls on a schedule rather than waiting for a push, paging D365 reads through the @odata.nextLink server-driven cursor. Vendors and GL accounts are synced first, since a missing payee in AvidXchange causes a payment failure, and financial dimensions are passed to D365 as a formatted display string that must match the configured dimension format or the write fails silently. D365 has no idempotency key, so ml-connector dedupes posts on the natural entity key plus a BullMQ jobId to avoid a duplicate-key error on re-read, and it writes vendor invoices only before posting because posted invoices are read-only in OData. D365 returns HTTP 429 with a Retry-After header under service protection limits, so ml-connector honors the backoff. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A mid-sized property management firm with roughly 400 employees runs Microsoft Dynamics 365 F&O for financials and procurement and uses AvidXchange to capture and pay supplier invoices across dozens of buildings. Before the integration, an AP clerk re-keyed each approved invoice from AvidXchange into D365 by hand and later typed the check and ACH details from payment reports into the vendor payment journal, which left the ledger lagging behind actual payments and produced coding errors when a new vendor or cost center was missed. With Microsoft Dynamics 365 F&O and AvidXchange connected, vendors and GL accounts stay in agreement, approved invoices post into D365 automatically, and settled payments land in the vendor payment journal allocated to the right cost center. The manual re-keying is gone and the AP ledger reflects real payment status within the polling window.
What you can do
- Push Microsoft Dynamics 365 F&O vendor master records into AvidXchange so invoices route to valid payees.
- Sync D365 main accounts and financial dimensions into AvidXchange for accurate invoice coding.
- Post approved AvidXchange invoices back into D365 as vendor invoice records before posting.
- Pull settled AvidXchange payment data, including check number and ACH trace, into D365 vendor payment journals.
- Bridge Entra ID OAuth2 client credentials to AvidXchange token auth, with retries, dedup, and a full audit trail.
Questions
- Which direction does data move between Microsoft Dynamics 365 F&O and AvidXchange?
- Vendors, GL accounts, and financial dimensions move from D365 into AvidXchange so invoices can be coded against valid payees and accounts. Approved invoices and settled payment data move back from AvidXchange into D365 vendor invoice and payment journal records. AvidXchange treats GL codes as read-only reference data, so ml-connector never writes chart-of-accounts changes from AvidXchange into D365.
- Does the integration use webhooks or polling?
- It uses scheduled polling. AvidXchange has no confirmed public webhook support and operates on a pull and batch sync model, and D365 Business Events carry only lightweight identifier stubs rather than full records. ml-connector reads each side on a schedule, typically every 15 to 30 minutes, and pages D365 results through the OData server-driven nextLink cursor.
- How does ml-connector avoid duplicate invoices or payments in Dynamics 365 F&O?
- D365 OData has no idempotency key and uses natural keys such as invoice number plus vendor account, so creating the same record twice raises a duplicate-key error. ml-connector dedupes on that natural key combined with a BullMQ jobId before posting, and it writes vendor invoices only before they are posted because posted invoices are read-only in OData. It also honors the HTTP 429 Retry-After header under D365 service protection limits.
Related integrations
More Microsoft Dynamics 365 F&O integrations
Other systems that connect to AvidXchange
Connect Microsoft Dynamics 365 F&O and AvidXchange
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started