Trusting exact-string matches

The most common mistake is matching on the literal client name. "Acme Co" and "Acme Company" will not match, so a real payment looks unpaid and you chase a client who already paid. Normalize names to one canonical form per client before matching, or use a matcher that tolerates variations. Either way, name drift is the silent source of false "unpaid" flags.

Ignoring partials

A $75 payment on a $150 invoice is easy to lump as "paid" or "unpaid" in a two-state mental model. It is neither — it is PARTIAL with $75 outstanding. If your process only tracks paid vs not, partials leak into the wrong bucket and your AR total is wrong by exactly the unpaid remainder. Always carry the outstanding balance, not just a binary flag.

Missing duplicates

The same payment counted twice inflates your "paid" total and hides a real unpaid invoice. Duplicates slip in from re-imports, double entries, or a payment applied to two invoices. A balance check — does the sum of matched payments per client exceed what they were invoiced? — is a cheap way to catch a stacked duplicate before it distorts the close.

Reconciling only one list

Reconciling invoices against the bank, but not against the actual payment list per client, tells you money arrived without telling you which invoice it paid. You can show "cash in" while still not knowing who is overdue. Reconcile invoice-to-payment, not just statement-to-ledger, if AR clarity is the goal.

Skipping the review

The final mistake is treating the output as gospel. A tool matches deterministically from the data you paste, but it cannot see a refund, a credit note, or a payment booked to the wrong client unless those appear in the lists. A one-pass human review of partials and exceptions is what turns a draft into a number you can trust.