ml-connector
Sage 50Wise

Sage 50 and Wise integration

Sage 50 runs your accounting on-premise while Wise handles your international payments and multi-currency operations. Connecting them keeps your accounts payable and receivable in sync with actual transfer execution and your Wise balances. Vendor invoices in Sage 50 can trigger international payments through Wise without re-keying recipient details, and payments are reconciled back into your Sage 50 bank accounts so your cash position reflects both local and cross-border movements. ml-connector bridges the local SDK world of Sage 50 and the REST API world of Wise on a schedule you control.

How Sage 50 works

Sage 50 is a desktop-installed accounting system available in US and UK editions. It exposes vendors, customers, purchase invoices, sales invoices, purchase orders, sales orders, payments, receipts, general ledger accounts, employees, inventory, and bank records through a local Windows SDK. The US edition uses the Sage 50 .NET SDK or legacy COM/ODBC layer, while the UK edition uses Sage Data Objects (SDO) COM/ActiveX DLLs. Authentication requires Windows-local username and password plus the company data file path, and integration requires a Windows process with direct access on the same machine or LAN. Sage 50 has no webhooks or remote API, so records are read by polling the LastModifiedDate, TransactionDate, or AuditTrail on a 5- to 15-minute interval for near real-time, or hourly for most ERP sync use cases.

How Wise works

Wise exposes profiles, balances, transfers, recipients, quotes, and activity through a REST API with JSON payloads over HTTPS. Authentication uses OAuth 2.0 with 12-hour token expiry and refresh tokens, or a Personal API Token with no expiry, and most endpoints require a Profile ID retrieved from the Wise API first. Wise can push webhook events for transfersstate-change, transferspayout-failure, balancesupdate, and other state changes with RSA-SHA256 signature verification. Transfer creation follows a four-step sequence: create a quote, add a recipient, order the transfer, and fund it. Rate limits are 100 requests per second, and Idempotency is supported via customerTransactionId or X-idempotence-uuid header. Wise does not expose invoices, purchase orders, or GL accounts.

What moves between them

Payment data flows from Sage 50 into Wise. When a vendor invoice in Sage 50 is marked for payment, ml-connector reads the vendor record and invoice details, creates or reuses the recipient in Wise, quotes the transfer, orders it, and funds it. Balance statements flow back from Wise into Sage 50 to reconcile the bank account, keyed by the Wise BalanceStatement and reconciled against Sage 50's bank transactions. Transfers are recorded as payment records in Sage 50 with the Wise transfer ID as the external reference.

How ml-connector handles it

ml-connector runs on a Windows machine or reachable via network with direct SDK access to Sage 50, logging in with the company data path and Windows credentials against Sage 50's user database. It polls Sage 50 on a 15-minute or hourly cadence and reads vendors, purchase invoices, and bank accounts using the .NET SDK or SDO layer depending on edition. For Wise, it authenticates using either OAuth2 client credentials or a Personal API Token, handles the 12-hour token refresh, and caches the Profile ID to reduce API calls. When a payment is triggered, ml-connector creates a Wise quote with the vendor's currency and amount, checks the quote expiry, creates or reuses the recipient in Wise, orders the transfer using the same quote, and funds it. Because Wise transfers require this four-step sequence and quotes expire, ml-connector must create a fresh quote if the recipient is not found or the previous quote has lapsed. Wise rate limits return HTTP 429 per second, so ml-connector implements exponential backoff. Wise webhooks can push payment state changes back to ml-connector if configured, but reconciliation with Sage 50's bank accounts relies on reading Wise balance statements and matching them against Sage 50's bank transaction log on each poll cycle. Every record carries a full audit trail.

A real-world example

A mid-sized services firm with UK headquarters and US operations uses Sage 50 for accounting and Wise for international payments between offices and to vendors in multiple currencies. Before the integration, the finance team exported vendor invoices from Sage 50, manually created Wise transfer requests each week, and then logged back into Sage 50 to record the transfer in the payment register and manually update bank balances from Wise statements, a process that surfaced currency conversion errors and created timing mismatches in the reconciliation. With Sage 50 and Wise connected, weekly vendor invoices marked for payment in Sage 50 automatically trigger Wise transfers to the correct recipients, and Wise balance statements flow back into Sage 50 so the bank account is automatically reconciled without re-keying. The finance team can now see all cross-border payments in one place and month-end bank reconciliation is complete in hours instead of days.

What you can do

  • Read vendor and customer records from Sage 50 and execute international transfers through Wise on a 15-minute or hourly schedule.
  • Create Wise transfer orders with quotes and recipients mapped from Sage 50 vendor data, handling quote expiry and recipient reuse.
  • Reconcile Wise balance statements back into Sage 50 bank accounts to keep cash position accurate across local and international accounts.
  • Authenticate Sage 50 via local Windows SDK with company path and credentials, and Wise via OAuth2 or Personal API Token with automatic token refresh.
  • Store all transfer records in Sage 50's payment register with Wise transfer IDs as external references and full audit trail.

Questions

How does ml-connector bridge the local SDK of Sage 50 with the REST API of Wise?
ml-connector runs on a Windows machine with direct access to Sage 50's SDK, reading vendors and payment records on a schedule. For Wise, it authenticates using OAuth2 or a Personal API Token, handles token expiry and refresh, and executes transfers via REST. Both authentication systems are kept encrypted and ml-connector maps Sage 50 vendors to Wise recipients so transfers happen automatically without re-keying.
What happens if a Wise quote expires before the transfer is funded?
Wise quotes expire after a certain time window. ml-connector detects this when attempting to order the transfer and creates a new quote with the current exchange rate before proceeding. If the quote has expired, ml-connector retrieves fresh pricing and retries the transfer order, ensuring the payment completes without manual intervention.
How are Wise balance statements reconciled back into Sage 50?
ml-connector reads Wise balance statements on each poll cycle and matches them against Sage 50's bank transaction log by amount, date, and Wise transfer ID where available. Reconciled transactions update Sage 50's bank account balance, and unmatched items are flagged in the audit log so the finance team can investigate timing differences or incomplete records.

Related integrations

Connect Sage 50 and Wise

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

Get started