ml-connector
Microsoft Dynamics 365 F&OPlaid

Microsoft Dynamics 365 F&O and Plaid integration

Microsoft Dynamics 365 F&O runs financials, procurement, and the general ledger. Plaid connects to bank, credit, and investment accounts and returns balances, cleared transactions, and account and routing numbers. Connecting the two brings real bank activity into the ERP so cash and bank reconciliation stay current without re-keying statements. ml-connector reads transactions and balances from Plaid and posts them into D365 against the right bank and GL accounts, and uses Plaid account and routing data to confirm vendor banking before payments go out. It handles the very different authentication on each side and syncs on a cadence you control.

How Microsoft Dynamics 365 F&O works

Microsoft Dynamics 365 F&O exposes vendors, customers, main accounts, general journal entries, and vendor and customer payment journal lines through an OData v4 REST service at a tenant-specific operations.dynamics.com host, so there is no shared base URL. Authentication is OAuth2 client credentials through Microsoft Entra ID, scoped to the environment host, and tokens last about an hour. Posted general ledger entries are read-only, so financial postings are created through journal entities. D365 can push outbound events through the Business Events framework over HTTPS, but those payloads are lightweight stubs that require a follow-up OData read for full detail.

How Plaid works

Plaid is a bank-data network, not an ERP, so it has no vendors, invoices, purchase orders, or GL accounts. It exposes account balances, bank-level transactions, account and routing numbers for ACH, transfer status, and investment holdings through REST endpoints that are all HTTP POST with JSON bodies. Authentication uses a client ID and a secret plus a per-user access token obtained from the Plaid Link flow and exchanged through the public token endpoint. Plaid pushes signed webhooks, verified with an ES256 JWT, and the transactions sync endpoint returns added, modified, and removed records by cursor.

What moves between them

The flow runs from Plaid into Microsoft Dynamics 365 F&O. ml-connector reads cleared and pending bank transactions and refreshed account balances from Plaid and posts them into D365 as general journal entries mapped to the matching bank and GL accounts for reconciliation. Account and routing numbers from Plaid Auth are read to verify vendor bank details before vendor payment journal lines are released in D365. Plaid is treated as a read-only banking source for accounting, so ml-connector does not post ledger entries or vendor records back into Plaid. Transaction pulls are driven by the Plaid sync cursor, and a scheduled poll backfills anything a webhook missed.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Plaid side it holds the client ID and secret plus the per-user access token from the Link exchange, sends every request as a POST with the Plaid-Version header, and pulls transactions through the cursor-based sync endpoint so only added, modified, and removed records move each run. On the D365 side it requests an OAuth2 client credentials token from Microsoft Entra ID scoped to the tenant environment host, refreshes it on expiry, and writes postings through journal entities because posted GL entries are read-only. Each Plaid account is mapped to a D365 bank and GL account first, so every journal line references an account that already exists. The Plaid SYNC_UPDATES_AVAILABLE webhook, verified by fetching the rotating JWK with the JWT key id, triggers a sync; ITEM ERROR and PENDING_EXPIRATION webhooks surface bank connections that need re-authentication. Plaid returns HTTP 429 on per-Item and per-client limits and a shared institution rate limit, and D365 returns 429 with a Retry-After header, so ml-connector backs off and retries on both. Because each Plaid bank connection requires the user to complete Link in a browser, there is no bulk import of bank credentials.

A real-world example

A mid-sized property management firm with roughly 150 staff runs Microsoft Dynamics 365 F&O for accounting across several operating entities and holds rent collection and operating accounts at three banks. Before the integration, an accountant downloaded statements from each bank portal every morning and keyed deposits and fees into D365 by hand, and bank reconciliation lagged a week behind. With Plaid connected, each morning's cleared transactions and refreshed balances flow into D365 as journal entries against the right bank accounts, and verified account and routing numbers confirm new vendor banking before payment runs. Reconciliation is current daily and the manual statement download is gone.

What you can do

  • Post cleared and pending Plaid bank transactions into Microsoft Dynamics 365 F&O general journal entries against the matching bank and GL accounts.
  • Pull refreshed Plaid account balances into D365 to support daily cash and bank reconciliation.
  • Verify vendor account and routing numbers from Plaid Auth before D365 vendor payment journal lines are released.
  • Bridge the Plaid client ID and per-user access token to the D365 OAuth2 token on the tenant environment host.
  • Sync only changed transactions by Plaid cursor on webhook or schedule, with retries and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 F&O and Plaid?
The flow runs from Plaid into Microsoft Dynamics 365 F&O. Bank transactions, balances, and account and routing numbers are read from Plaid and used to create journal entries and verify vendor banking in D365. Plaid is a read-only banking source for accounting, so ml-connector does not write ledger entries or vendor records back into Plaid.
How does ml-connector bridge the two different authentication schemes?
Plaid uses a client ID and secret plus a per-user access token from the Plaid Link flow, while Microsoft Dynamics 365 F&O uses OAuth2 client credentials through Microsoft Entra ID scoped to a tenant-specific host. ml-connector stores both credential sets encrypted, sends Plaid calls as POST with the per-user access token, and requests and refreshes the D365 token automatically as it expires.
Does the integration use Plaid webhooks or polling?
Both. ml-connector listens for the Plaid SYNC_UPDATES_AVAILABLE webhook, verified with the ES256 JWT and the rotating JWK key, and then pulls only changed transactions through the cursor-based sync endpoint. A scheduled poll backfills anything a webhook missed, and ITEM error webhooks flag bank connections that need the user to re-authenticate through Link.

Related integrations

Connect Microsoft Dynamics 365 F&O and Plaid

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

Get started