TL;DR

Export the Mercury statement CSV for the month, export the QuickBooks “Invoices and Received Payments” report for the same window, drop both into the matcher. Mercury truncates memos at 80 characters and resets the running balance every period — work around that with amount-plus-fuzzy-name matching. Total time: ~10 minutes.

What breaks when reconciling Mercury with QuickBooks

I burned two Sundays on this combo before I figured out the patterns. Three things bite:

The Mercury Running Balance column resets to 0 at the start of each statement period. If your matcher trusts running totals to detect missing rows, it will flag every January 1st as a phantom $0 transaction. Ignore that column entirely — only Amount and Date are reliable.

The Mercury Description field is hard-capped at roughly 80 characters. Long memos from your client — “Payment for invoice INV-1042 — March consulting hours plus travel” — get sliced before the invoice number is reached. The truncation is silent, which is what makes it dangerous. If you’re matching on memo text alone, you’ll miss the right invoice.

QuickBooks Online’s “Invoices and Received Payments” report includes two row types for a single invoice: the invoice line itself (Transaction Type = Invoice) and the payment line (Transaction Type = Payment). If you only filter to Invoice, you’ll never see the payment events. If you keep both, the customer’s Name field shows up twice with the same string — easy to double-count.

Export the Mercury statement

  1. Mercury web app → Accounts → pick the account → Statements.
  2. Date range: the full month you’re reconciling (don’t pick “last 30 days” — it cuts mid-period).
  3. Format: CSV. The PDF option exists but you’ll need OCR to use it.
  4. Click Download. File arrives as mercury-statement-YYYY-MM-DD.csv, UTF-8, comma-delimited.

Columns you’ll see in order: Date, Description, Amount, Running Balance, Reference. Amount is signed — positive = inflow, negative = outflow. Reference is the Mercury transaction ID, useful for de-duplication if you import the same file twice.

Export the QuickBooks invoice list

  1. QBO → Reports → search “Invoices and Received Payments”.
  2. Customize the date range to match the Mercury statement period (extend the start date by 30 days if your average payment terms are Net 30 — you want invoices issued before the period that may have been paid during it).
  3. Export → Export to Excel (yes, despite the menu name, it saves as .xlsx). Open it, Save As .csv if you need CSV downstream. Some teams export to Google Sheets first and download from there.

Columns: Date, Transaction Type, Num, Name, Memo/Description, Amount, Balance. The Balance column shows the remaining open balance per invoice — not the invoice total. If Balance = 0, QB already considers it paid. If Balance = Amount, it’s fully open. Anything in between is a partial payment we still need to verify against the bank.

Match algorithm cheats for this combo

For each Mercury inflow row:

  1. Amount-first match. Look for a QB invoice where Amount = Mercury.Amount (exact) OR where Amount = Mercury.Amount + fee for a fee in [15, 20, 25, 30]. This catches the wire-fee pattern: the client wires you $5,000 against a $5,025 invoice because their bank deducted the $25 fee on the sender side, not yours.
  2. Name fuzzy-match. Mercury Description often holds something like "Wire Transfer ACME INC PAYMENT INV-1042". Strip the leading "Wire Transfer " or "ACH " prefix, then run a Jaro-Winkler against QB’s Name column. We use a 0.85 threshold by default — anything lower has too many false positives on common company suffixes (“Acme Inc” vs “Acme LLC”).
  3. Invoice number capture. If the truncated Mercury memo still contains a substring like INV-, #, or a 4–6 digit number, try matching against QB’s Num field. This is the highest-precision signal but lowest recall — only ~40% of clients put the invoice number in the wire memo.
  4. Date window. Invoice Date should be ≤ Mercury Date and within 90 days. Anything older = stale and likely a re-payment of an old invoice, flag for review.

Real example

A Mercury row from a real reconciliation last month:

2026-04-15,"Wire Transfer ACME INDUSTRIES INC PAYMENT INV-1",4975.00,118432.50,"mer_tx_7f3a..."

The matching QB line:

2026-04-01,Invoice,1042,Acme Industries Inc.,"March consulting + travel",5000.00,5000.00

Amount diff = $25 (wire fee deducted on sender side). Name match: “ACME INDUSTRIES INC” vs “Acme Industries Inc.” — Jaro-Winkler 0.97. Date diff = 14 days, within Net-30 terms. The Mercury memo had INV-1 but Mercury truncated the rest — the 1042 never made it through. We still match with high confidence on amount + name.

Edge cases this combo hits

Sub-customers in QB. If you bill a parent company that has sub-customer accounts (“Acme Industries Inc.:US Division”), QB’s Name column shows the full hierarchy. Bank descriptions rarely include the sub-customer suffix. Normalize by splitting on : and matching the leftmost segment.

Voided invoices stay in the export. QB’s report includes Transaction Type = Invoice rows that have been voided (Amount = 0 typically). If your matcher counts them as open, you’ll over-report receivables. Filter Amount > 0 before matching.

International wires arrive in two parts. A €5,000 wire from a European client may show up as one Mercury row with Amount = 5012.30 (Mercury’s USD conversion) and a separate row with Amount = -28.00 and Description = "International Wire Fee". Group both rows by Reference prefix or pair them by date + amount-of-fee heuristic.

QB Bank Feed already imported these transactions. If your QB org has the Mercury bank feed connected, every Mercury transaction is already a QB ledger row. Reconciling against the CSV in addition can create duplicate evidence. Pick one source of truth — we recommend turning off the bank feed before running the matcher and re-enabling after.

When this combo breaks our tool

We test this against statements with up to ~5,000 rows per month. Past that, matching slows noticeably because the fuzzy-name pass is O(n × m) over invoices × bank rows. If you’re doing a Mercury account with high-frequency Stripe-style payouts, batch by week instead of by month.

Multi-currency Mercury accounts (USD + EUR balances on the same login) export each currency as a separate CSV. Our tool treats the file as single-currency; mixing them would mis-match a €5,000 invoice against a $5,000 bank row. Run them separately and merge results.

If you’ve already reconciled inside QB using the bank feed match suggestions, our CSV reconciliation will partially overlap. We don’t detect this — you’ll see invoices flagged as both “Paid (QB)” and “Likely paid (CSV)”. Pick one workflow per period.

Faster way

Drop the Mercury CSV and the QB report into the reconciler on the homepage — both export formats are auto-detected, the wire-fee tolerance is baked in, and the partial-payment + aggregate-balance logic handles the “client paid in three chunks” case without manual sorting.

If you’re also handling Stripe alongside Mercury, the Stripe payout reconciliation tool handles the gross-vs-net trap separately.

For the manual-spreadsheet fallback, the bank reconciliation template has the column layout pre-built.