TL;DR

Wise gives you both Source amount and Target amount columns for FX transactions. Xero shows the invoice in its Currency field. Match on Target amount ↔ Xero invoice Total when currencies match, otherwise match on Source amount + the Wise Exchange Rate. Watch for the separate Wise fee row.

What breaks when reconciling Wise with Xero

Three landmines I’ve stepped on more than once:

The Source/Target amount trap. When your client pays a USD invoice in EUR through Wise, the Wise CSV has two amount columns. Source amount = what they sent (EUR), Target amount = what landed in your account (USD). Xero’s invoice is in USD. If you match against Source amount, you’ll see 4250.00 against a 5000.00 USD invoice and conclude it’s a $750 underpayment. It isn’t — it’s an FX-converted full payment.

Wise fee on a separate row. Wise typically charges a percentage-based fee (~0.4%–1% depending on the corridor). On the CSV it shows up as a distinct row with its own ID, sometimes seconds after the main transfer, with a Description like "Wise charges for transfer XXX". If you sum daily inflows naively, the fee row reduces the day’s total below the invoice amount and you mis-bucket as Unlikely Paid.

Xero’s ContactName is whatever the user typed. Xero doesn’t enforce contact uniqueness. We’ve seen the same client as "Acme Industries", "Acme Industries Inc", "Acme Industries Inc.", and "acme industries" across four invoices in the same file. Match by name alone and you’ll over-fragment receivables.

Export the Wise statement

  1. Wise web app → Statements for the balance you care about (USD, EUR, GBP — each one separately).
  2. Date range: pick the full period. Wise allows up to 12 months in one export.
  3. Format: CSV (the “Statement (CSV)” option, not “Statement (PDF)”).
  4. Download. File arrives named like statement_<account_id>_USD_2026-04-01_2026-04-30.csv, UTF-8, comma-delimited with all fields quoted.

Columns: ID, Status, Direction, Created on, Finished on, Source fee amount, Source fee currency, Source name, Source amount (after fees), Source currency, Target name, Target amount (after fees), Target currency, Exchange rate, Reference, Batch, Created by. Dates are in DD-MM-YYYY format — confusing if your locale is US-default.

For inflows to your account, Direction = IN, the Target columns describe what you received, and Source describes what the client sent.

Export the Xero invoice list

  1. Xero → BusinessInvoices.
  2. Filter to the period (Date issued, not Date due — we want what was billed in the window).
  3. Search → ExportExport to CSV. The exported file is named Invoices.csv regardless of filter.

You’ll get: ContactName, EmailAddress, POAddressLine1 (and several more address fields, mostly empty), InvoiceNumber, Reference, InvoiceDate, DueDate, Total, AmountDue, AmountPaid, Status, Currency, plus a long tail of tax columns.

The Status column has values DRAFT, SUBMITTED, AUTHORISED, PAID, VOIDED, DELETED. Filter to AUTHORISED and PAID for reconciliation. Drafts haven’t been issued; voided/deleted aren’t real receivables.

Match algorithm cheats for this combo

  1. Currency-aware amount match. If Wise Target currency = Xero Currency, match Target amount (after fees) against Xero Total with a small tolerance for rounding (±$0.05). If currencies differ, recompute: expected target ≈ Source amount × Exchange rate, and match against Xero Total in the target currency.
  2. Fee row pairing. Any Wise row whose Description contains “charges for transfer” or whose Source fee amount > 0 and Direction = OUT is a fee. Pair it with the closest preceding IN row by timestamp. We use a 60-second window — Wise fees usually arrive within that window of the transfer.
  3. Contact-name normalization. Lowercase, strip "inc", "inc.", "llc", "ltd", "gmbh", collapse whitespace, then match the Wise Source name (sender’s account holder) against the normalized Xero ContactName. Threshold 0.85 Jaro-Winkler.
  4. Reference field exact match. If both Wise Reference and Xero InvoiceNumber are populated, an exact match (case-insensitive) trumps everything. This is the cleanest signal because clients who fill in Reference carefully are also the ones who reconcile easily.

Real example

Wise inflow row:

"TRANSFER-1428832","COMPLETED","IN","15-04-2026","15-04-2026","12.50","EUR","Acme GmbH","4250.00","EUR","Your EUR balance","4237.50","EUR","1.0",,"INV-2026-118",,

Xero invoice line:

"Acme GmbH","contact@acme.de",,"INV-2026-118",,"01-04-2026","30-04-2026","4250.00","0.00","4250.00","PAID","EUR"

Currency match (EUR = EUR), amount match on Source amount (after fees) - Source fee amount = 4237.50 vs Xero Total - AmountPaid = 0 — wait, this is already marked PAID. So the Xero-side reconciliation already happened. Our match here confirms it on the bank side too. Confidence: Exact.

If Xero had still listed it as AUTHORISED with AmountDue = 4250.00, the match would push that into Paid bucket and recommend marking the invoice paid in Xero.

Edge cases this combo hits

Same-currency Wise transfers also have FX-style metadata. If a client pays you USD from their Wise USD balance, the CSV still populates Source amount, Target amount, and Exchange rate = 1.0. The two amounts are equal but the fee may not be zero (Wise still takes a fixed fee on some corridors). Don’t assume Source = Target means no fee.

Xero’s multi-currency invoices. If you raise an invoice in EUR but your base currency is USD, Xero stores both Total (EUR) and a BaseCurrencyTotal (USD) hidden in another export. The default CSV gives you EUR only. Reconcile against the same currency the invoice was raised in.

Reference field truncation. Wise’s UI lets users type up to ~140 characters in the reference. The CSV export truncates at ~100 with no ellipsis. If you use long structured references like "PO-2026-Q1-1042-AcmeProject", the trailing portion may be missing on export. Use the InvoiceNumber field for primary matching instead.

Batch transfers. Wise has a “Batch” feature where one CSV row represents a multi-recipient send. Inbound batches are uncommon but possible if a partner uses Wise’s Batch API. The Batch column holds the batch ID — group these for sum-level matching, not row-level.

When this combo breaks our tool

If you have more than three active Wise balance currencies, our matcher requires you to export and run each currency CSV separately, then merge results in the export step. Multi-currency single-file ingestion isn’t there yet.

Wise’s API export includes some additional columns (Created by, Batch) that we ignore. If your workflow tags transactions in those fields, we won’t surface that metadata in the result view.

When the Xero contact list has been imported from a CRM (HubSpot, Pipedrive), ContactName often includes the contact person rather than the company — “Jane Smith” for invoices that should be billed to “Acme GmbH”. The Wise Source name is always the bank account holder, so this combo silently fails. Fix in Xero by setting the company name as the primary contact field.

Faster way

Drop your Wise CSV and Xero invoice export into the main reconciler — currency detection runs automatically, fee rows are paired, and the normalized contact-name match catches the “Acme Inc / Acme Inc.” case without manual cleanup.

For the foundation, the bank reconciliation glossary entry covers the underlying matching model.

If you’re starting from scratch and prefer a spreadsheet, the bank reconciliation template has the column layout pre-set.