TL;DR

The freelancer / small-business stack. Mercury for the bank, Wave for free invoicing. Match Mercury inflows against Wave invoices by amount + Jaro-Winkler on Customer Name, exclude Mercury Treasury yield rows, and accept that ~10% of payments need manual review because Wave’s free tier doesn’t track payment metadata.

What breaks when reconciling Mercury with Wave

Two big things, one small:

Wave doesn’t record payments cleanly on the free tier. Wave is free, which is why we use it. The trade-off: the invoice CSV gives you Status and Amount Due, but no Date Paid or Payment Method. If a Wave invoice shows Status = Paid, you can’t tell from the export which Mercury inflow cleared it. You have to reconstruct the link manually based on amount + customer + date proximity.

Mercury memo truncation hits hardest with Wave. Wave auto-generates invoice numbers like INV-0001 through INV-9999. Clients usually include this in their wire memo. But Mercury truncates Description at 80 chars — long memos like “Payment for invoice INV-1042 — March project work plus expenses reimbursement” lose the trailing characters. If the truncation point is before INV-1042, your primary match signal is gone.

Mercury Treasury yield credits. Mercury Treasury (their MMF feature) pays monthly yield. The credit shows up as a Mercury row with Description = "Treasury Yield" or similar. It’s not an invoice payment. Exclude before running the matcher.

Export the Mercury statement

Same as the Mercury + QuickBooks guide:

  1. Mercury web app → Accounts → pick account → Statements.
  2. Date range: full month.
  3. Format: CSV.
  4. Download.

Columns: Date, Description, Amount, Running Balance, Reference.

For this combo specifically, watch for: Description = "Treasury Yield" rows (skip), and Description starting with "Wire Transfer " / "ACH " (strip prefix before matching).

Export the Wave invoice list

  1. Wave → Sales & PaymentsInvoices.
  2. Filter: Date Range to match the Mercury statement period. Extend start by ~30 days to catch March-issued invoices paid in April.
  3. Export (top-right) → CSV.

Columns: Customer Name, Customer Email, Invoice Number, Issue Date, Due Date, Status, Total, Amount Due, Currency, Memo.

Status values: Draft, Sent, Viewed, Partial, Paid, Overpaid, Overdue. For reconciliation:

For payment-level detail, pull Reports → Account Transactions filtered to your Mercury account in Wave. This shows the individual payment records Wave knows about.

Match algorithm cheats for this combo

  1. Exclude Mercury system rows. Drop rows where Description contains "Treasury Yield", "Mercury IO Yield", or "Fee". Also drop internal transfers (Description = "Transfer" between Mercury sub-accounts).
  2. Amount-first match. Mercury Amount ↔ Wave Total exact. For partial payments: Mercury.AmountWave.Amount Due (the remaining balance on a partially-paid invoice).
  3. Strip transfer prefix. Replace "Wire Transfer " and "ACH " from start of Mercury Description before fuzzy matching. The remaining string is what Mercury knows about the sender + their reference.
  4. Customer name fuzzy. Match against Wave Customer Name with normalization (lowercase, strip LLC, Inc, Inc., Ltd, suffix . removal). Threshold 0.85.
  5. Invoice number extraction. Run regex INV[- ]?\d{1,5} against Mercury Description. If matched and substring matches Wave Invoice Number, confidence boost.
  6. Wave Status overlay. After matching, cross-check: if Wave shows Status = Paid for an invoice and you matched a Mercury inflow against it, confirmed. If Wave shows Status = Paid but no Mercury match found, flag for review (likely manually-marked-paid without cash event, or paid via a different account).

Real example

Mercury inflow row:

2026-04-12,"ACH Zeta Consulting LLC PAY INV-0418",2850.00,87432.50,"mer_tx_ab2..."

Wave invoice:

Zeta Consulting,billing@zeta.io,INV-0418,03/28/2026,04/27/2026,Paid,2850.00,0.00,USD,

Strip "ACH " from Mercury → "Zeta Consulting LLC PAY INV-0418". Extract INV-0418 via regex. Normalize customer name → "zeta consulting" matches Wave’s "Zeta Consulting" at 0.93. Amount exact. Invoice number exact match. Wave already shows Status = Paid — our match confirms.

Confidence: Exact.

Edge cases this combo hits

Wave’s Customer Name has typos. Wave’s free tier doesn’t enforce customer-name uniqueness. We’ve seen "Acme LLC", "acme LLC", "Acme L.L.C.", and "Acme" for the same customer across four invoices. Lowercase normalization helps; if you have a clean customer list, run a one-time pass to consolidate.

Mercury sub-accounts. Mercury lets you create “Vaults” (sub-accounts under one main account). Inflows can land in any vault depending on how the sender’s transfer is routed. If you only export the main account’s CSV, transfers to vaults appear as "Transfer to Vault" debits + a separate credit in the vault. Export each vault separately and combine.

Partial payments without Wave update. If a customer pays $1,500 against a $3,000 Wave invoice, Wave’s UI lets you record the partial. The exported Status = Partial, Amount Due = 1500. If the customer pays the rest a week later via a second Mercury wire, that’s a second inflow row. Match each Mercury row separately, watch for the cumulative Amount Due matching.

Stripe payouts to Mercury. If you’ve connected Stripe to Mercury (some freelancers do), Stripe payouts arrive as Mercury credits. The credit Description is "Stripe Inc", the amount is net of Stripe fees, and one Mercury row = a batch of Stripe charges. Cross-reference Stripe Balance Transactions for per-invoice attribution.

Refund debits. If you’ve refunded a customer via Wave (rare; usually refunds happen on the payment processor side), and the refund hit your Mercury account as a debit, exclude it from the invoice-match pass and handle as a contra-AR entry in your books.

When this combo breaks our tool

We auto-skip Mercury Treasury Yield rows by description string. If Mercury changes the wording in a future release, the auto-skip may miss them — manually filter if you see “yield” or “interest” rows getting matched as invoice payments.

Wave’s free-tier export lacks payment metadata. We can match Mercury rows to invoices, but we can’t tell you “Wave already considers this paid” beyond the Status column. For audit, you may need to manually update Wave’s invoice records based on our match output.

For volume above ~100 invoices/month with frequent partial payments, the manual-review burden gets non-trivial. At that point, consider upgrading to Wave’s Pro tier (which adds payment date tracking) or moving to FreshBooks/QuickBooks for richer payment metadata.

Faster way

Drop your Mercury CSV + Wave invoice export into the reconciler on the homepage — Treasury Yield filtering, ACH-prefix stripping, customer-name normalization, and Wave-Status overlay all happen automatically. ~10 seconds for a typical month.

If you’re evaluating whether Wave is the right invoicing tool to keep, the free bank reconciliation software audit covers the alternatives that genuinely stay free.

For the conceptual frame of bank reconciliation when you’re new to it, the bank reconciliation glossary entry covers the basics.