ml-connector
VismaWise

Visma and Wise integration

Visma.net ERP manages accounts payable, purchase orders, and supplier invoices. Wise handles international money transfers and multi-currency payouts. Connecting the two automates supplier payments from Visma into cross-border transfers via Wise, eliminating manual bank detail entry and transfer order creation. Approved payments in Visma flow to Wise, where they are executed as transfers to the supplier's registered recipient account, keeping your payment records in sync across both systems.

How Visma works

Visma.net ERP is a cloud-based accounting and financial management platform. It exposes suppliers, supplier invoices, purchase orders, purchase receipts, payments, general ledger accounts, dimensions, journal transactions, and budget information through REST JSON APIs over HTTPS. Visma uses OAuth 2.0 client credentials authentication for service connectors, requiring client_id, client_secret, and tenant_id. All API calls require an ipp-company-id header. Visma supports both webhooks for real-time notification and polling via lastModifiedDateTime query parameters, though webhook notifications are one-time delivery without automatic retry.

How Wise works

Wise is a global payments platform accessible through REST JSON APIs. It exposes profiles, multi-currency balances, balance statements, payment recipients, transfer quotes, transfers, and activity logs. Wise authenticates via OAuth 2.0 with authorization_code or client_credentials grants (12-hour token expiry, refresh tokens supported), or via personal API tokens with Bearer authentication. Wise enforces rate limits of 100 requests per second and 1000 per minute, and supports idempotency via customerTransactionId for transfers. Transfer creation requires a specific sequence: quote, recipient, transfer order, then funding. Wise delivers webhook events including transfer state changes and payout failures with RSA-SHA256 signature verification.

What moves between them

Approved supplier payments from Visma are polled periodically and mapped to Wise transfer recipients. For each payment, ml-connector retrieves or creates the recipient record in Wise using supplier bank details, obtains a fresh transfer quote for the payment amount and currency, creates a transfer order, and funds it from the appropriate Wise balance. Recipient records are immutable in Wise, so updates require delete and recreation. Transfer state changes and payout failures are tracked via Wise webhook events and logged in the audit trail. The primary flow is unidirectional: Visma to Wise for payment execution.

How ml-connector handles it

ml-connector stores both credential sets encrypted: Visma's OAuth client credentials and tenant_id, and Wise's OAuth tokens or personal API token. For Visma, it refreshes OAuth tokens on expiry and includes the required ipp-company-id header on all list and detail calls. It queries Visma's supplier and payment endpoints using lastModifiedDateTime filters to detect new or modified approved payments. For each payment, it looks up the supplier in Wise's recipient list by matching bank account details; if not found, it creates a new recipient, which is immutable in Wise and persists for future use. Before initiating a transfer, it requests a fresh quote to confirm the exchange rate and fee, then creates the transfer order with customerTransactionId set to Visma's payment reference for idempotency. If the quote expires before funding, ml-connector detects and retries with a fresh quote. It funds the transfer from the Wise balance in the source currency. Wise rate limits and 429 responses trigger exponential backoff. Webhooks from Wise (transfer state changes, payout failures) are verified via RSA-SHA256 signature and logged against the corresponding Visma payment. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A Nordic consulting firm uses Visma.net ERP for invoicing and accounts payable, and pays suppliers across Europe, Asia, and the US. Before the integration, the accounting team approved invoices in Visma, exported payment batches weekly, logged into Wise manually, re-entered each supplier's bank details, created a quote for each transfer, selected the correct funding balance, and executed the payout. If a quote expired or a payout failed, manual follow-up was required. With Visma and Wise connected, each week's approved supplier invoices flow automatically into Wise. ml-connector matches suppliers to Wise recipients, generates fresh quotes, and executes the transfers, with every state change logged and accessible for reconciliation. The accounting team now spends minutes reviewing and approving payments in Visma, with execution fully automated.

What you can do

  • Automatically execute supplier payments from Visma as transfers via Wise, eliminating manual entry of bank details and payment orders.
  • Map Visma supplier records to Wise transfer recipients, creating immutable recipient accounts on first use for future payments.
  • Handle Wise transfer creation, quoting, and funding in the correct sequence, with quote expiry detection and refresh.
  • Verify Wise webhook events via RSA-SHA256 signature and log transfer state changes and payout failures against the audit trail.
  • Authenticate Visma with OAuth 2.0 client credentials and Wise with OAuth 2.0 or personal tokens, refreshing and storing credentials securely.

Questions

Which direction does data flow between Visma and Wise?
Supplier payments flow from Visma to Wise for execution. Visma approved invoices and payments are read periodically and mapped to Wise transfers. Wise transfer state changes and payout failures flow back into the audit log for reconciliation. Visma accounts and suppliers are read-only from Wise's perspective.
How does ml-connector handle Wise recipients and the immutability constraint?
Wise recipients cannot be updated after creation. ml-connector looks up recipients by bank account details on each payment and reuses existing recipients if found. If a supplier's bank details change in Visma, a new recipient must be created in Wise and linked to future payments. Recipients created by ml-connector persist and are available for all subsequent payments to that supplier.
What happens if a Wise transfer quote expires before funding?
Wise transfer quotes expire if not funded within a set time. ml-connector detects quote expiry by checking transfer creation responses, cancels the expired transfer, requests a fresh quote at the current exchange rate, and retries the transfer order and funding. This ensures payments use current rates and fees.

Related integrations

Connect Visma and Wise

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

Get started