How to stop paying the same invoice twice

A duplicate payment is almost never a mystery after the fact. It arrives by one of five routes: the vendor re-sent the invoice and somebody keyed it again; a colleague forwarded a copy into the same inbox; a statement was treated as an invoice, so the total of bills you already hold was entered as a new one; the invoice number was re-keyed with one character different, so nothing matched it to the original; or the same bill reached two sets of books because two buildings or two owners both claimed it. Stopping it is therefore not one control but a short list, and every one of them is about comparing a bill against the bills you already hold, before it is paid.

The uncomfortable part is that the comparison is harder in property management than anywhere else. A landscaping contract that bills exactly $1,450.00 for the same building on the first of every month produces a pair of invoices from the same vendor for the identical amount, twelve times a year. That pair is the textbook signature of a duplicate, and it is not one. Any check that is not built to tell those apart will either flag a legitimate bill every month until people stop reading it, or be loosened until it catches nothing.

Nobody should quote you a catch rate for this, including us. Published estimates of how often a duplicate payment happens vary by more than an order of magnitude — between 0.1% and 2% of payments, depending on whose study you read — which is itself the point: nobody knows their own rate until somebody checks.

What your ledger already does, and exactly where it stops

Start here, because it costs nothing and it may not be switched on.

QuickBooks Online has a preference under Account and settings, then Expenses: Warn if duplicate bill number is used. Turn it on. When a bill is created through the API, the ledger is stricter still — if a bill with the same document number already exists in the target company, QuickBooks refuses the create.

Xero does not have the equivalent. A supplier bill's invoice number is not unique in Xero, so Xero will create a second bill without complaint. If Xero is your ledger, the number check has to live somewhere before it.

Either way, the ceiling is the same and it is low: this is a check on the invoice number you typed. It does nothing about:

  • the same invoice arriving with a re-keyed number — 44172 entered as 44127, or an O where the vendor printed a 0;
  • the same amount from the same vendor on the same day under two different numbers;
  • a re-generated PDF of a bill you already have, carrying a new number from the vendor's own system;
  • a copy that landed in a different set of books, because the check is per company file;
  • a statement, which carries no invoice number of its own to collide with anything.

The checks that work without buying anything

  1. One door for invoices. A single AP address, forwarded from everywhere else, so two copies land in one place where they can be seen together. Two copies in two inboxes cannot be compared by anybody.
  2. Make the invoice number a required field on entry, and never let an invoice through with N/A in it. A blank number defeats every numeric check downstream.
  3. Compare on three things, not one. Vendor plus amount plus date catches what a number check cannot, and it is the pass to run by eye before payment on anything above a threshold you choose.
  4. Handle statements explicitly. A vendor statement lists invoices you already have and totals them, so it is a duplicate of many bills at once. Keep it out of the approval queue rather than filing it as a bill. The useful part of a statement is the reverse case: an invoice on it that you never received.
  5. Write down the pairs you have cleared. "We checked this in March" is only a control if the next person can see it.

None of that needs software. What it needs is the same person doing it every time, which is the part that fails.

Telling a monthly bill from a copy: the guards that matter more than the rules

If you are evaluating any tool for this — or writing the rule yourself in a spreadsheet — these are the cases that decide whether it is usable. They are where inletAP puts most of its work, and the duplicate detection reference publishes all of them in full.

The caseWhy a naive check calls it a duplicateWhat has to be true instead
The fixed monthly contractSame vendor, same amount, month after monthA vendor and property on a regular cycle at a steady amount, a normal cycle apart, is January and February. The amount-only rules are switched off for that pair — and the guard inverts if the two are only days apart, because a monthly vendor that billed twice inside one cycle is strong evidence.
Period tokens in the numberWM-4471-2025-06 and WM-4471-2025-07 differ by one characterTwo invoices carrying the same base number and different period tokens are never duplicates, whatever else matches.
Progress billingA four-phase job bills the same amount four timesDraws, phases, retainage, deposits and installments named as such are capped at a note. The contract says to bill that way.
Consecutive invoice numbersINV-1001 and INV-1002 are one character apartNear-miss numbers only count when the edit is a real transposition or a known confusion pair, the numeric tails are far apart, and the amount matches to the cent.
A credit noteSame vendor, same amount, weeks laterAn approved credit from that vendor for the same amount within 180 days cancels the match, and negative documents are excluded from every rule.
The statementIts total equals invoices you already holdRecognized on three signals — several invoice-shaped numbers, a header like statement of account or balance forward, and a total equal to invoices already in the workspace — and every duplicate rule is cancelled for it.
A pair you already clearedIt matches again next monthA rejected pair is never raised again, and rejecting the same kind of match twice for a vendor and property demotes that rule to a silent note for them.

The one case that belongs to property management specifically is the last row of the rules rather than the guards: the same figure billed to two buildings within a fortnight. That is a genuine signal — a vendor coding a job to the wrong property, or one invoice entered under two buildings — and no check on invoice numbers can see it, because the two numbers are different.

What inletAP does, stated at its exact size

The check runs after extraction, once there is a vendor, a number, a date and an amount to compare. The invoice is compared against the invoices you already hold that share its vendor or its exact attachment, going back two years, up to the 200 most recent candidates, on nine rules and seven guards.

Three levels come out of it, and only one of them does anything:

  • Hard duplicate. A card naming the document it matched, side by side with this one. This is the one thing in the product that blocks anything: the invoice is held out of the export batch until a person decides. The hold is applied when the batch is built, so a duplicate raised at any point before the export — including after approval — keeps the bill back.
  • Possible duplicate. A card with the two documents side by side and a one-click Mark duplicate. It informs. Approval and export are unaffected.
  • Note. A collapsed line on the invoice. Nothing, and it never interrupts.

Blocking is deliberately reserved for the top level, because a product that stops bills on a weak signal is one whose users learn to click through everything. You will never see a score, a band or a percentile on a card either: one is computed internally to decide whether a finding is worth showing, and showing it to you would replace a fact you can check with a number you cannot.

There is a second, much narrower check at the door: the same message delivered twice — a retrying mail server, a double send from the same sender — is collapsed on a key built from your workspace, the message ID and the raw bytes, and the second delivery creates nothing. That is not an invoice comparison and it never links two documents. A colleague pressing Forward again is a different message, so it arrives as its own document and is compared like any other.

What it does not do

  • It does not stop a payment, because it cannot. inletAP moves no money — there are no ACH or check rails in it at all. What a hard duplicate prevents is the second bill being created in your ledger. A bill already paid twice out of your bank is outside what it can see.
  • It publishes no catch rate and no false-positive rate, and you should be skeptical of anyone in this category who does. No credible published figure exists for any commercial duplicate engine, ours included.
  • It does not compare against other customers. Your own workspace, and nothing outside it.
  • It does not contact the vendor about a possible copy, and it does not delete anything. A document ruled a duplicate stays visible, linked to its original, with the decision in the audit trail.
  • It does not price-check a brand-new vendor. The price comparisons that sit beside duplicate detection in Second Look need about five invoices from a vendor for a property before they can compare anything, and they say so on the card rather than staying silent.
  • Contract upload, escalation caps against an inflation index, weather normalization for utility bills and comparison against other firms are not in the product. They are on the list; do not buy on them.

A pass you can run this week, with no software

  1. Turn on the duplicate bill number warning in QuickBooks, or accept that on Xero the check has to sit in front of the ledger.
  2. Pull every bill from your three largest vendors for the last quarter into a sheet, sorted by amount.
  3. Look at every pair with the same amount. For each, ask the three questions in order: same invoice number, same invoice date, same property? Two yes answers is worth opening the documents.
  4. Check the pairs a cycle apart against the vendor's contract before calling anything. That is the monthly bill, and it is the answer most of the time.
  5. Write down what you cleared, next to the vendor, where the next person will see it.

That pass is also the honest way to find out whether you need anything else. If it turns up nothing across three vendors and a quarter, the manual control you have is working.

Common questions

How do most duplicate invoice payments actually happen?

Five routes cover nearly all of them: the vendor re-sends an invoice that was already entered, a colleague forwards a second copy into the same inbox, a vendor statement is keyed as though it were an invoice, an invoice number is re-keyed with one character different so nothing matches it, or the same bill is entered in two sets of books for two buildings or two owners.

Does QuickBooks Online warn about duplicate bills?

It can, on the bill number. Under Account and settings, then Expenses, switch on Warn if duplicate bill number is used, and when a bill is created through the API QuickBooks refuses a create that carries a document number the company already holds.

Does Xero stop a duplicate bill?

No. A supplier bill invoice number is not unique in Xero, so Xero will create a second bill with the same number without complaint, which means the number check has to live in whatever puts bills into Xero rather than in Xero itself.

The same vendor bills the same amount every month. How is that not a duplicate?

Because it is a contract, and a check that cannot tell a monthly cycle from a copy is a check people stop reading. A vendor and property on a regular cycle at a steady amount, billing a normal cycle apart, has the amount-only rules switched off for that pair — while two invoices only days apart from the same monthly vendor are treated as stronger evidence rather than weaker.

Is a vendor statement a duplicate invoice?

Not in the useful sense, although it looks like one to software: a statement lists invoices you already hold and totals them. Keep it out of the approval queue rather than filing it as a bill, and read it for the opposite signal, which is an invoice on the statement that you never received.

Does inletAP stop the payment?

No, and it could not: inletAP has no ACH or check rails and moves no money. What a top-tier duplicate does is hold the bill out of the export batch so it never reaches your ledger until a person answers the card.

What percentage of duplicates does it catch?

We do not publish one, and no credible published figure exists for any commercial duplicate engine. What we will state is what is compared: your own invoices from the same vendor, or carrying the same file, over the last two years, on nine rules and seven guards, before the bill can leave for your ledger.

Where to go next

More guides