ml-connector
Microsoft Dynamics 365 Business CentralTipalti

Microsoft Dynamics 365 Business Central and Tipalti integration

Microsoft Dynamics 365 Business Central runs your finance and purchasing. Tipalti runs global supplier onboarding and payment execution. Connecting the two lets you keep approving bills in Business Central while Tipalti handles payee compliance and pays suppliers across many countries and methods. Approved vendors and posted purchase invoices flow from Business Central into Tipalti, and payment results flow back so vendor payments and ledger entries stay current without re-keying. ml-connector handles the very different APIs and auth schemes on each side and moves the data on the cadence you set.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, purchase invoices, purchase orders, payment journals, GL accounts, and general ledger entries through its v2.0 REST API built on OData v4, scoped under a company on an environment-specific URL. It authenticates with OAuth 2.0 client credentials against a Microsoft Entra ID tenant, using a client ID, client secret, tenant ID, and environment name. Purchase invoices start as drafts and must be posted with the Microsoft.NAV.post bound action; GL accounts and general ledger entries are read-only. Business Central supports push subscriptions for vendors, purchaseInvoices, and customerPaymentJournals, but those notifications are change signals only and the connector must fetch the changed record itself.

How Tipalti works

Tipalti exposes payees, invoices, purchase orders, payments, and GL accounts through two API families. The SOAP Payer and Payee API is the full-featured path and uses an HMAC-SHA256 key computed over the payer name, payee id, and a timestamp rather than a session token. A newer REST API uses OAuth 2.0 client credentials, with some Procurement endpoints using a static x-api-key header. Upsert functions such as UpdateOrCreatePayeeInfo and CreateOrUpdateInvoices are naturally idempotent. Tipalti pushes payment lifecycle events such as payment_submitted, completed, and error through a single IPN webhook endpoint, signed with the same HMAC key, and offers timestamp reads like GetUpdatedPayments and GetPayeeInvoicesChangedSinceTimestamp for polling.

What moves between them

The main flow runs from Microsoft Dynamics 365 Business Central into Tipalti. Approved vendors are pushed into Tipalti as payees, and posted purchase invoices are pushed in as payable invoices, mapped by vendor number and invoice number. Payment status then flows back from Tipalti into Business Central: when Tipalti reports a payment completed, ml-connector records the vendor payment through a Business Central payment journal so the open bill is cleared and the ledger reflects it. GL account codes are aligned in both directions so invoice lines and payments land on accounts that exist on each side. Tipalti executes the actual payments, so Business Central is never used to move money directly.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On every Tipalti SOAP call it builds the HMAC-SHA256 key from the exact payer name, payee id, and timestamp, and for REST calls it uses the OAuth 2.0 bearer token or the static x-api-key where a Procurement endpoint requires it. On the Business Central side it requests an Entra ID token with the client credentials grant and refreshes it when a call returns 401. New and changed vendors and posted purchase invoices are detected through Business Central subscriptions, with a delta poll using a lastModifiedDateTime greater-than filter as a backstop, since those notifications carry no payload and must be fetched. Only posted invoices are pushed, because drafts are not yet payable. Vendors map to Tipalti payees by the Business Central vendor number used as the payee idap, and the upsert functions make re-sends safe. Payment results are picked up from Tipalti IPN events and reconciled with a GetUpdatedPayments poll, then written back as vendor payment journal lines applied to the matching invoice. Known edge cases are handled: the payer name must match the Tipalti account string exactly or the signature fails silently, updating a payee address forces the payee to re-verify their payment method, Business Central subscriptions expire every three days and are renewed before expiry, and SOAP reads return at most 250 records per call so large pulls are paged. Tipalti Procurement REST also limits some calls to a few per minute, so ml-connector backs off and retries on throttling.

A real-world example

A mid-sized software company with about 300 employees runs Microsoft Dynamics 365 Business Central for finance and purchasing and pays contractors and vendors in a dozen countries. Before the integration, the AP team approved bills in Business Central, then re-entered each one into Tipalti by hand to run payment, and later typed the payment confirmations back into Business Central to close the open invoices. Cross-border payees also needed tax and banking details collected outside the ERP. With the two systems connected, approved purchase invoices and their vendors move into Tipalti automatically, Tipalti handles payee onboarding and pays them, and the completed payments post back into Business Central against the right invoices. The double entry disappears and the open payables list reflects what Tipalti has actually paid.

What you can do

  • Push approved Business Central vendors into Tipalti as payees, keyed by vendor number.
  • Send posted Business Central purchase invoices into Tipalti as payable invoices for payment.
  • Record vendor payments back in Business Central when Tipalti reports a payment completed.
  • Bridge Business Central Entra ID OAuth with Tipalti's HMAC-signed SOAP and OAuth REST calls.
  • Align GL account codes on both sides so invoices and payments land on valid accounts.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and Tipalti?
Vendors and posted purchase invoices move from Business Central into Tipalti, where payment is executed. Payment status moves back from Tipalti into Business Central so vendor payments are recorded and open bills are cleared. GL account codes are aligned in both directions, but the money itself is always paid by Tipalti, not by Business Central.
How does ml-connector handle Tipalti's HMAC signing and Business Central's OAuth token?
For Business Central, ml-connector uses the OAuth 2.0 client credentials grant against your Entra ID tenant and refreshes the token when a call returns 401. For Tipalti SOAP calls, it computes the HMAC-SHA256 key from your exact payer name, the payee id, and a timestamp on every request. The payer name must match the Tipalti account string exactly, because a mismatch fails the signature silently rather than returning a clear error.
Are Business Central webhooks enough, or is polling needed too?
Business Central subscriptions notify the connector when vendors, purchase invoices, or payment journals change, but the notification is only a change signal with no data, so ml-connector fetches the record afterward. Those subscriptions also expire every three days and are renewed before expiry. A delta poll on lastModifiedDateTime runs as a backstop, and payment status from Tipalti is collected from IPN events plus a GetUpdatedPayments poll.

Related integrations

Connect Microsoft Dynamics 365 Business Central and Tipalti

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

Get started