Skip to main content
← All posts

One Approval, One Payment: Stop Paying the Same Invoice Twice

October 13, 2026 · BuyFlow Team

A designer asks in Slack for $3,200 of photography from a freelance studio. The manager approves it in the thread. Two weeks later the studio's invoice shows up three ways: the designer drops the PDF into the Slack thread, the studio emails it to your bills inbox, and a week after that, when nobody has paid yet, the studio sends a "friendly reminder" with the invoice attached again. Each copy is the same bill. If two of them get entered, and the reminder lands in a busy week, you pay $6,400 for $3,200 of work.

Nobody did anything wrong here. Nothing was hidden and nobody tried to game a limit. The money left twice because the invoice came in through more than one door and nothing tied it back to the single approval that authorized it.

This post is about using the Slack approval as that tie: one approval, one amount, paid once. It covers where duplicates actually come from, what QuickBooks Online and Xero will and won't catch for you, and the few fields to add to a Slack request so a second copy gets held before it's paid.

Where duplicates come from

Duplicate payments rarely start with fraud. They start with ordinary gaps. Docsumo's guide to duplicate invoice detection lists the common ones (Docsumo), and every one has a Slack-first version:

  • Two channels, one invoice. The vendor emails the PDF and someone forwards a copy AP already has. At a Slack-first company, the forward is the requester posting the invoice in the approval thread while the vendor emails it to finance.
  • Resent after a late payment. The due date passes and the vendor sends it again as a reminder. A reminder with an attachment looks a lot like a new bill.
  • Replacement invoices. The vendor reissues an invoice to add a late fee or a discount, and the original is never cancelled, so both stay open.
  • Paid outside AP. A rush payment goes out before the invoice arrives and isn't recorded, so the invoice is paid again when it comes in. The everyday version: the requester puts the purchase on a company card, and the vendor still sends a bill.
  • One vendor, two records. "Northeast Kitchen Equipment" and "Northeast Kitchen Equip." are set up as two vendors, so one invoice looks like two suppliers' bills.
  • Period-end rush. Volume spikes at month end, approvals speed up, and checks get skipped.

Docsumo's main point is the one to hold on to: the check has to run before payment approval, because a duplicate found after payment is a recovery job, not a check (Docsumo).

What your accounting system already catches

Both QuickBooks Online and Xero have a duplicate check. Turn it on, and know where it stops.

QuickBooks Online can warn you when a bill number has already been used for the same vendor. It's in Settings > Account and Settings > Advanced > Other preferences, as "Warn if duplicate bill number is used" (QuickBooks Community). AP tools that sync bills into QuickBooks tell customers to switch it on before connecting. Quadient AP's connection guide, for example, lists it as a required setting so bills with the same invoice number and vendor don't import twice (Quadient AP). Notice what it keys on: bill number plus vendor. If one copy goes in as "INV-1042" and the other as "1042", or under a second vendor record, the warning has nothing to match.

Xero automatically flags possible duplicate bills and lets you review them from the Bills page, then void, delete, or keep them (Xero Central). Xero's community team has said detection compares the contact, reference, and amount of bills and credit notes (Xero Product Ideas). Two practical limits:

  • It's a warning, not a block, and it needs all three fields to match. A one-character difference in the reference, a reminder copy that adds a small fee, or the same supplier under two contacts gets past it (Invogi).
  • Bills created from a repeating bill template aren't identified as duplicates, and a bill that's already been paid needs its payment removed before you can void it (AFS).

Both checks compare a bill to other bills. Neither knows what anyone actually agreed to buy. That's the gap the Slack approval fills.

Make the approval the thing a bill has to match

A bill check asks "have we seen this invoice before?" An approval check asks a better question: "how much of what we approved is left to pay?" The second one catches duplicates that look nothing alike on paper, like a card charge and a bill for the same purchase, or a reissued invoice with a new number.

To make that work, a Slack approval needs to carry a little more than an amount and a thumbs-up.

Give every approval an ID and put it in front of the vendor. When a request is approved, the confirmation in Slack should include a short reference (a request or PO number) and the requester should send it to the vendor: "Please put PO-0317 on your invoice." Docsumo recommends asking vendors to put a PO number on every invoice and to mark a resend as a copy (Docsumo). Once invoices carry your reference, a reminder copy and a reissued invoice both point back to the same approval.

Track the approved amount as a balance, not a yes. When a bill is entered against an approval, record it on the approval: approved $3,200, billed $3,200, remaining $0. A second bill against the same approval should be held for a person to look at, whatever its invoice number says. For partial billing (a deposit and a final invoice), the balance tells you the second bill is expected, which keeps legitimate staged work from getting flagged.

Record how it will be paid. Add a payment method field to the request: vendor bill (ACH or check) or company card. If the request says "card" and a bill shows up, that's a likely double pay, and someone should check the card feed before the bill goes into a payment run. This is the "paid outside AP" case, and it's the one bill-to-bill checks can't see, because one side isn't a bill.

Use the existing vendor, not a new one. When the requester picks a vendor in the Slack request, have them pick from your accounting vendor list. Adding a new vendor should be a deliberate step, not a typo. Keeping one record per supplier is what makes both QuickBooks's bill-number warning and Xero's contact match work (Docsumo).

Keep the invoice in one place. Decide where invoices go (one shared bills inbox, or Xero's bill forwarding address if you use it) and say it in the approval message. If the requester posts a PDF in the thread, finance forwards it once, and the thread notes "forwarded to bills, entered as bill #…". Centralizing intake so one system sees every invoice is the first control on AutoPayables' prevention list (AutoPayables).

Then one check before every payment run

Request-time habits stop most duplicates. A short pre-payment check catches the rest. Spotsaas's payment run checklist puts it at the point where money actually moves: confirm every bill in the batch is approved, run a duplicate check on vendor, invoice number, and amount, catch fuzzy variants like INV-001 versus INV001, and hold disputed or credit-memo items so a credit isn't paid as a fresh invoice (Spotsaas).

For a small team, that's five minutes before you release payments:

  1. Every bill links to an approval. A bill with no Slack approval behind it gets asked about, not paid.
  2. No approval is over-billed. Total billed against each approval is at or under the approved amount (plus whatever tolerance your policy allows).
  3. Same vendor, same amount, close dates. Sort the batch by vendor and amount and look for pairs, even with different invoice numbers.
  4. Card-paid requests have no open bill. For approvals marked "card," confirm there's no bill for the same purchase sitting in the batch.
  5. Credits are applied, not paid. If a vendor issued a credit note or a refund, make sure it's applied to the bill, not ignored while the full amount goes out.

When something gets flagged, hold it rather than delete it, and have a named person release or reject it with the earlier bill beside it (Docsumo). If it was a copy, tell the vendor, so the resend doesn't come back a third time.

If you've already paid twice

It happens. Ask the vendor for a refund or a credit against the next invoice, and fix whatever let the copy through (Docsumo). Reconciling vendor statements against your payables monthly is how credit balances and double payments surface quickly instead of a year later (AutoPayables). Then go back to the Slack approval and note what happened, so the trail shows one approval, two payments, one credit, and a zero balance.

A checklist to adopt this week

  • Turn on "Warn if duplicate bill number is used" in QuickBooks Online, or check Xero's Review duplicate bills screen every week.
  • Give every Slack approval a reference and ask vendors to put it on their invoice.
  • Track billed against approved on each approval, and hold any bill that would push it over.
  • Add a payment method field (bill or card) to Slack purchase requests.
  • Have requesters pick vendors from your accounting vendor list instead of typing a new name.
  • Name one place invoices go, and say it in every approval message.
  • Run the five-point check before each payment run.