ml-connector
Sage 100Wise

Sage 100 and Wise integration

Sage 100 manages your accounts payable; Wise moves your money across borders. Connecting the two automates the cash outflow step for international vendors. Unpaid AP invoices in Sage 100 are read on your schedule, converted into Wise transfer orders, and the resulting payout status flows back into Sage 100 so you know which invoices have been funded, which are pending funding, and which failed.

How Sage 100 works

Sage 100 is an on-premises ERP with no native cloud API. It exposes vendors, AP invoices, and GL accounts through SOAP (eBusiness Web Services at a customer-hosted endpoint) for read-only queries, or through BOI (a COM layer wrapped by a local Windows service agent) for deeper access. Authentication is stateless username and password per SOAP call or Windows service account plus agent-layer credentials. Sage 100 publishes no webhooks, so AP invoices are read by polling the DateLastUpdated field on a schedule you control. Every call requires a 3-character company code. Concurrent writes are limited due to COM record-locking, so high-frequency updates need retry logic with exponential backoff.

How Wise works

Wise exposes profiles, balances, recipients, and transfers through a REST API at api.wise.com, authenticated via OAuth 2.0 (with 12-hour token expiry and refresh tokens) or a long-lived personal API token. Wise pushes transfer state changes, payout failures, and balance updates via webhooks with RSA-SHA256 signature verification. Transfer creation follows a strict 4-step flow: create a quote, register a recipient, create a transfer order, then fund the payment. Transfers and recipients have immutable fields, and quotes expire if not funded within a window. Wise enforces rate limits of 100 requests per second and up to 1500 requests per minute depending on the auth grant type. Pagination uses offset and limit parameters with a 100-record maximum per page.

What moves between them

The flow runs from Sage 100 AP into Wise. ml-connector polls Sage 100 at a schedule you set (commonly every 4 hours for batch payouts) and reads AP invoices with status unpaid or ready-for-payment. Each unpaid invoice is transformed into a Wise transfer order: the vendor is looked up or registered as a Wise recipient, a quote is fetched for the invoice amount and currency, the transfer is created, and payment is initiated. Once the Wise transfer launches, ml-connector records the transfer ID in Sage 100 AP and polls Wise webhook events for state changes. When a payout succeeds, ml-connector marks the invoice as paid and posts a GL journal entry crediting AP and debiting cash. If a payout fails, ml-connector flags the invoice as failed-payout and surfaces the Wise error reason in Sage 100 audit.

How ml-connector handles it

ml-connector stores Sage 100 username-password and Wise OAuth credentials encrypted and bridges the authentication gap: it refreshes the Wise bearer token every 12 hours (before expiry) and presents Sage 100 credentials on each SOAP or BOI call. Because Wise requires a 4-step sequence for each transfer, ml-connector caches active Wise recipients so it does not re-register the same vendor on every poll. When Sage 100 SOAP reports no AP data (due to the limited eBusiness Web Services surface), ml-connector falls back to the local agent endpoint for full AP/GL access. Wise webhooks push state changes, but ml-connector also polls for resilience: if a webhook is missed or delayed, the next scheduled poll catches up. When Wise returns a 429 rate-limit, ml-connector backs off exponentially and retries. Sage 100 GL accounts use multi-segment format (e.g., 4000-01-00) that varies by customer config, so ml-connector requires a one-time mapping of Sage 100 GL codes to Wise transfer source accounts before the first payout. Quotes expire within Wise's window, so ml-connector fetches a fresh quote on each poll rather than reusing one. Transfer recipients in Wise are immutable, so if a vendor's bank account changes, ml-connector flags it for manual recipient deletion and re-registration via Wise's UI.

A real-world example

A mid-sized import distributor runs Sage 100 for AP and inventory. They source goods from vendors across Europe and Asia and need to pay invoices in foreign currencies every week. Before Wise integration, the AP team exported unpaid invoices from Sage 100, manually entered each into Wise, tracked payout status in a spreadsheet, and re-entered paid invoices back into Sage 100 at month-end to close the AP subledger. With Sage 100 and Wise connected, the weekly poll automatically finds all unpaid invoices in Sage 100, initiates transfers in Wise at the latest exchange rate, and marks invoices paid once Wise confirms the payout. The AP team no longer needs to re-key; they review the audit log in ml-connector to spot failed transfers and follow up with vendors or banks.

What you can do

  • Poll Sage 100 AP invoices on a schedule and automatically initiate Wise transfers for international vendors.
  • Execute Wise's 4-step transfer flow (quote, recipient, transfer order, fund) without manual intervention.
  • Reconcile Wise payout status back into Sage 100 AP records so you always know which invoices are paid, pending, or failed.
  • Handle Sage 100's local-agent and SOAP authentication, and bridge to Wise OAuth 2.0 with automatic token refresh.
  • Retry on Wise rate limits and webhook delays, with full audit trail and error replay on failed payouts.

Questions

How does ml-connector handle Sage 100's on-premises architecture and lack of cloud API?
ml-connector deploys a local Windows service agent on the customer's Sage 100 server that wraps the BOI COM layer and exposes AP, GL, and vendor data over a secure internal endpoint. ml-connector polls this agent on your schedule to read unpaid invoices. For queries that eBusiness Web Services SOAP can handle (AR and sales orders), ml-connector calls the SOAP endpoint directly; for AP and GL, it uses the agent.
What happens if a Wise payout fails or is delayed?
ml-connector receives the failure via Wise webhooks (transferspayout-failure or transfersstate-change) and marks the AP invoice as failed-payout with the Wise error reason logged in audit. If a webhook is delayed or missed, the next scheduled poll re-queries Wise and catches up. You can then review the failed transfer in ml-connector, adjust the Wise recipient or amount if needed, and trigger a manual retry.
How are Sage 100 GL accounts mapped to Wise transfer source accounts?
Sage 100 GL accounts use a multi-segment format (e.g., 4000-01-00) that varies by customer, so ml-connector requires a one-time config mapping your GL codes to Wise source account IDs before the first payout. This ensures cash debits land on the correct GL account for each currency or cost center.

Related integrations

Connect Sage 100 and Wise

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

Get started