ml-connector
Microsoft Dynamics 365 Business CentralWise

Microsoft Dynamics 365 Business Central and Wise integration

Microsoft Dynamics 365 Business Central runs your finance and accounts payable. Wise moves money across borders. Connecting the two lets approved vendor payments in Business Central trigger real international payouts in Wise without anyone re-keying bank details or amounts. As each Wise transfer is funded and sent, ml-connector records it back in Business Central as a posted vendor payment so the ledger stays current. The two APIs are very different, and ml-connector handles the auth, the mapping, and the multi-step payout sequence between them.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, purchase invoices, payment journals, GL accounts, general ledger entries, and dimensions through the Business Central API v2.0, a REST API built on OData v4 with JSON payloads scoped under a company id. It authenticates with OAuth 2.0 client credentials against Microsoft Entra ID, using a tenant-specific environment name in the URL. It supports push webhooks through a subscription API that expires every 3 days and must be renewed, but those notifications signal only what changed and carry no record data, so the resource is fetched afterward. Purchase orders are not webhook-enabled, and incremental reads use an OData filter on lastModifiedDateTime.

How Wise works

Wise is a payments platform, not an ERP, so it has no vendors, invoices, purchase orders, GL accounts, or accounting dimensions. The Wise Platform API exposes profiles, multi-currency balances, recipients, quotes, transfers, balance statements, and a unified activity feed over REST with JSON. A connector authenticates with OAuth 2.0, whose access tokens expire after 12 hours, and nearly every call needs the numeric business profile id. Creating a payout is a fixed four-step sequence: get a quote, create or reuse a recipient, create the transfer, then fund it from a balance. Wise pushes transfer state changes by webhook signed with RSA-SHA256 in the X-Signature-SHA256 header.

What moves between them

The main flow runs from Microsoft Dynamics 365 Business Central into Wise. ml-connector reads approved vendor payment lines from Business Central payment journals, resolves the vendor to a Wise recipient, requests a Wise quote for the source and target currency, creates the transfer, and funds it from the matching balance. Vendor master records flow the same direction so each payee exists as a Wise recipient before a payout is attempted. Transfer status then flows back from Wise into Business Central: once a transfer reaches outgoing_payment_sent, ml-connector posts the vendor payment in Business Central against the originating bill. Wise holds no ledger, so no chart of accounts or invoices are written into Wise.

How ml-connector handles it

ml-connector stores both credential sets encrypted, refreshes the Wise OAuth token before its 12-hour expiry, and renews the Business Central webhook subscription before its 3-day window closes so payment signals are not lost. Because a Business Central webhook carries no data, the connector fetches the payment journal line after each notification, and it also polls with an OData lastModifiedDateTime filter as a backstop. A vendor is mapped to a Wise recipient by bank details, and because Wise recipients are immutable the connector recreates a recipient when those details change and updates the cached id. Each payout runs the mandatory quote then transfer then fund sequence, and a fresh quote is requested if the prior one has expired. A unique customerTransactionId is set on every transfer so a retry never sends a duplicate payment, and BullMQ jobs are keyed on the Business Central document number for the same reason. Inbound Wise webhooks are verified with RSA-SHA256 against the right environment public key before any posting. Wise rate limits return HTTP 429 with a Retry-After value, so ml-connector backs off and retries, and every record carries a full audit trail and can be replayed if a Business Central post fails.

A real-world example

A mid-sized engineering firm with about 200 staff buys components and contract services from suppliers in several countries and runs Microsoft Dynamics 365 Business Central for finance and accounts payable. Before the integration, the finance team approved bills in Business Central, then logged into Wise separately to key in each supplier's bank details and the payment amount, and afterward typed the cleared payments back into the ledger by hand. With Business Central and Wise connected, an approved payment journal line creates and funds the Wise transfer automatically, and the sent payout posts back as a vendor payment against the original bill. The double entry and the login switching are gone, and the ledger shows which supplier invoices are actually paid.

What you can do

  • Turn approved vendor payments in Microsoft Dynamics 365 Business Central into funded Wise transfers without re-keying bank details.
  • Map each Business Central vendor to a Wise recipient, recreating the recipient when bank details change.
  • Run the required Wise quote, transfer, and fund sequence, refreshing an expired quote before it can fail the payout.
  • Post each sent Wise transfer back into Business Central as a vendor payment applied to the originating bill.
  • Bridge Entra ID client credentials on Business Central with Wise OAuth, with retries and a full audit trail on every payment.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and Wise?
Payment instructions move from Business Central into Wise, and payout status moves from Wise back into Business Central. Approved vendor payment lines and vendor records drive transfer creation in Wise, while a sent transfer posts back as a vendor payment in Business Central. Wise has no ledger, so no invoices or GL accounts are written into it.
Can Wise receive invoices or purchase orders from Business Central?
No. Wise is a payments platform and has no invoice, purchase order, GL account, or dimension objects. What it offers is recipients, quotes, transfers, and balances, so ml-connector maps a Business Central vendor payment to a Wise recipient and transfer rather than sending a document. The bill itself stays in Business Central and is marked paid when Wise reports the transfer sent.
How does the integration avoid sending a vendor payment twice?
Every Wise transfer is created with a unique customerTransactionId, the value Wise uses to deduplicate, so a retried call cannot send the money again. BullMQ jobs are also keyed on the Business Central document number to prevent duplicate enqueues, and the connector only posts the payment back in Business Central once Wise confirms the transfer reached outgoing_payment_sent.

Related integrations

Connect Microsoft Dynamics 365 Business Central and Wise

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

Get started