ml-connector
Wave AccountingWise

Wave Accounting and Wise integration

Wave Accounting tracks your invoices and cash in one place. Wise moves that cash across borders at the real exchange rate. Connecting the two keeps your Wave transaction ledger in sync with your Wise payout activity. When you pay an invoice via Wise, ml-connector logs it back to Wave. When a transfer completes or fails, it updates your Wave records so month-end reconciliation starts clean.

How Wave Accounting works

Wave Accounting exposes invoices, customers, transactions, vendors, and chart of accounts through a GraphQL API at https://gql.waveapps.com/graphql/public. It uses OAuth 2.0 with access tokens valid for 2 hours and refresh tokens, and requires an active Wave Pro subscription on the connected business. Wave pushes events via webhooks including invoice.created, invoice.updated, invoice.paid, payment.created, customer.created, and transaction.created. Webhook signatures are validated with HMAC-SHA256 over a 5 minute replay window. Invoices are created or deleted but not patched, and bills and payroll are not exposed via the API.

How Wise works

Wise exposes profiles, balances, transfers, recipients, and quotes through a REST JSON API at https://api.wise.com (production) and https://api.sandbox.transferwise.tech (sandbox). It authenticates via OAuth 2.0 with 12-hour token expiry and long-lived refresh tokens, or via a personal API token with no expiry. Wise pushes transfer state changes, payout failures, balance updates, and profile verification events to registered webhook endpoints, with RSA-SHA256 signature verification. Transfers require a 4-step sequence of quote, recipient, transfer order, and fund payment. The API rate limits at 100 requests per second and 1000 per minute, and enforces idempotency via customerTransactionId or X-idempotence-uuid header.

What moves between them

Invoices and transactions flow from Wave into Wise for payment execution. When a Wave invoice is paid via a Wise transfer, ml-connector receives the webhook notification and logs the transfer ID and completion status back to Wave. Wise balance updates and payout failures also flow back to Wave transactions so the ledger reflects your current multi-currency account state. Customers from Wave are synced to Wise recipients when needed for new payouts. The sync is bidirectional for reconciliation: Wave invoices trigger Wise quotes and transfers, and Wise transfer state changes update Wave transactions.

How ml-connector handles it

ml-connector stores Wave OAuth credentials (access token and refresh token) and Wise API token encrypted, refreshing Wave tokens as needed within their 2-hour window. It validates Wave webhook signatures with the HMAC-SHA256 header and Wise webhooks with RSA-SHA256. When a Wave invoice is marked paid and a Wise transfer is initiated, ml-connector executes Wise's 4-step transfer sequence (get or create quote, get or create recipient, create transfer order, fund the payment), using the Wave customer name and bank details to populate Wise recipients. Wise transfer state-change webhooks trigger updates back to Wave transactions, mapping transfer IDs to the original Wave payment record. Because Wave invoices cannot be patched, the sync records Wise transfer status as separate transactions linked by reference ID. Rate limiting on Wise is handled with exponential backoff, and idempotency keys prevent duplicate transfers if a webhook acknowledgment fails. Wave's 5-minute webhook replay window is respected so stale events do not overwrite current state.

A real-world example

A small import-export business uses Wave Accounting to track invoices in USD and local currency. They receive customer invoices in multiple currencies and pay suppliers across five countries via Wise. Before the integration, the finance team issued a Wave payment, manually created a Wise transfer, waited for completion, then logged the result back in Wave as a separate transaction. Reconciliation took days because Wave and Wise states were out of sync. With Wave and Wise connected, paying an invoice via Wise is one action: ml-connector executes the full transfer sequence, watches for completion, and logs the result into Wave automatically. Month-end reconciliation is instant because Wave transactions match Wise transfers by reference ID.

What you can do

  • Execute Wise transfers directly from Wave invoices, with ml-connector handling the 4-step transfer sequence, quote expiry, and recipient creation.
  • Log Wise transfer state changes (pending, completed, failed) back into Wave transactions so your ledger stays current.
  • Validate Wave and Wise webhook signatures and handle replay windows correctly to prevent duplicate or stale updates.
  • Map Wave customers to Wise recipients automatically, and reuse recipients to avoid recreating them on each payout.
  • Reconcile Wave invoices and Wise transfers by transfer ID, so month-end close starts with matched records across both systems.

Questions

Does ml-connector execute all four steps of the Wise transfer sequence automatically?
Yes. When a Wave invoice is paid via Wise, ml-connector retrieves or creates a quote at the current exchange rate, creates or reuses a recipient for the Wave customer, creates the transfer order, and funds the payment in one flow. If any step fails (quote expires, recipient exists but is immutable, rate limit reached), ml-connector backs off and retries, and the error is logged to your audit trail.
How does the integration handle multi-currency transactions and exchange rates?
Wise quotes lock in the exchange rate for 5 to 60 minutes depending on the route. ml-connector retrieves a fresh quote for each transfer, honoring the expiry window so the rate does not shift between the quote and the funded transfer. Wave records the transfer in the target currency once Wise completes it, so your ledger reflects the actual cash sent.
What happens if a Wise transfer fails or is delayed?
Wise webhooks fire for transfer failures and state changes at every step. ml-connector receives those events, validates the signature, and updates the matching Wave transaction with the new status (e.g., pending to failed, or in-progress to completed). The transfer ID and error details are logged so you can contact Wise support or retry with new credentials if needed.

Related integrations

Connect Wave Accounting and Wise

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

Get started