On-chain payment and invoice amount don't match: where should finance start reconciling?

 / 
2

The on-chain payment shows 98.5 USDT, but the invoice says 100 USDT. The missing 1.5 USDT? The last place finance should look is the “fees” line. In stablecoin payments, gas is a visible cost, but attribution and conversion spreads are what really eat reconciliation time.

Finance reconciliation is not about “is the amount right?” It is about “which invoice does this payment match, who paid, and why is the difference this much?” A small gap usually does not mean a math error. It means one link in the chain did not line up.

First stop: Check if the “payment received” status is being misread

An on-chain transaction showing success does not mean the finance system can mark it as “paid.”

Possible situations:

  • You paid in USDC, but the supplier’s system was expecting USDT. The transfer happened on-chain, but the supplier’s auto-receiving only recognizes USDT. The USDC entered the wallet but did not trigger the “order paid” status update, so it became orphaned funds sitting on the books.

  • You did not fill in Memo or Tag. An exchange or wallet uses one address to receive payments from many customers. The memo is the only identifier that shows who you are. Without it, the money arrives but no one knows whose it is, so finance has to manually search on-chain records to claim it.

How to check:

  • Open a block explorer and check the receiving address. If it looks like an exchange hot wallet address, it likely needs a memo.

  • Ask the supplier: “Does your settlement system recognize this transaction? Did the order status update automatically?”

  • If not, finance needs to manually bind the on-chain transaction hash to the order number.

Done when: The supplier confirms the order status has been updated to “paid”—not “money arrived but we do not know whose it is.”

Second stop: A tiny gap can come from three layers

When an invoice says 100 USD and your wallet receives 98.5 USD, the missing 1.5 USD can come from these three things stacked together:

Cost itemTypical sizeShown on invoice?
Deposit fee (fiat to stablecoin)0.1%–1.0%No, usually not listed
On-chain gas< $0.01 (Solana/L2)No
Conversion slippage/spread0.1%–1.0%No
Withdrawal fee (stablecoin to fiat)10–40 bps (mature markets)No

Key insight: On-chain gas is the smallest item in the whole chain. On Solana or L2 networks, each transfer costs less than $0.01. The real cost is concentrated at the two fiat gates: deposit and withdrawal. If you spend time checking gas, you are probably wasting effort.

How to check:

  • Find the supplier’s off-ramp provider (exchange, payment gateway) and check its withdrawal fee.

  • Check the network and trading pair used for withdrawal—USDC/USD, USDC/EUR, etc. Slippage varies widely.

  • If the supplier uses real-time conversion, the exchange rate is locked at the moment of payment. If the supplier receives first and converts later, exchange-rate movement in between can also cause a difference.

Done when: You can split 1.5 USDT into “0.8 USDT withdrawal fee + 0.5 USDT slippage + 0.01 USDT gas + 0.19 USDT unknown difference.” The unknown difference is the part worth digging into.

Third stop: If every order has a unique address, attribution is automatic

This is the most complete way to solve “money arrived but no one knows whose it is.”

How to do it:

  • Generate a unique receiving address for each invoice. When the supplier sends you an invoice, it includes a dedicated generated address.

  • Pay to that address. Once the on-chain payment arrives, the finance system immediately knows which invoice it matches—no manual matching needed.

Stable’s approach is more aggressive: invoice metadata (invoice number, buyer and seller, amount, due date) is hashed to generate a deterministic unique code (nonce). When the buyer signs the payment, it uses this nonce. The AuthorizationUsed event triggered during on-chain settlement includes the same nonce, binding the on-chain transaction to the invoice without needing an external reconciliation system to guess.

If you do not have that tool:

  • At a minimum, include the invoice number or order number in the on-chain transaction data when paying. Some chains support custom memo fields.

  • Use a reconciliation tool to pull on-chain transaction records and match them by time, amount, and address.

Done when: Finance can answer in one minute: “Which invoice does this 98.5 USDT transaction match?” instead of spending half an hour scrolling through wallet records.

Final checks

If one payment does not match, do not rush to look at gas fees. Check in this order:

  1. Have you checked attribution? Maybe there was no memo, or the money entered the supplier’s system but was not claimed.

  2. Have you checked conversion and withdrawal fees? Withdrawal fee rate, slippage, and exchange-rate timing are the real cost drivers.

  3. Is the receiving address unique? If everyone shares one address, reconciliation will keep hurting.

How to verify: Send the on-chain transaction hash to the supplier and ask three questions:

  • “Has this payment been claimed in your system? Which invoice does it match?”

  • “What channel did you use for off-ramp, what was the fee, and at what moment was the exchange rate locked?”

  • “Can we generate a unique address for each invoice so we no longer need manual reconciliation?”