How to Reconcile USDC Stablecoin Payments in SME Accounting: A Step-by-Step Guide
Reconciling USDC payments comes down to three things: recording every inflow and outflow, locking in the day's exchange rate, and matching the on-chain statement against your general ledger. Here's how to do it, step by step.
Getting paid by a customer or paying a supplier in USDC poses a very practical question for the finance team: how do you record it in the books without throwing your general ledger out of balance? The money lands in a wallet, not a bank account, and your company's functional currency is still the peso, the sol or the real. At its core, reconciling stablecoin payments means turning an on-chain movement into a journal entry in local currency and leaving behind a trail anyone can verify.
At Soulbit Academy we walk through this with a worked example and numbered steps any CFO can follow today. We're not here to sell you a tool. We want you to grasp the whole flow: recording inflows and outflows, locking in the day's exchange rate, posting the journal entries, matching the network statement against the general ledger, and handling the fees. If you'd first like a refresher on what sets a stablecoin apart from a volatile cryptocurrency, we cover that in this note on the difference between a stablecoin and a cryptocurrency.
What USDC is and why it changes reconciliation
USDC is a stablecoin issued by Circle, pegged one-to-one to the US dollar and backed by cash reserves and short-term Treasury bonds. Each token is meant to be worth exactly one dollar. You can dig into the specifics in Circle's official USDC documentation.
That dollar peg is what makes the accounting tractable. Unlike a volatile crypto asset, USDC doesn't swing meaningfully against the dollar from one day to the next. So for a Latin American SME, the question was never how to value the token. It's the same question you face on any dollar transaction: what exchange rate do I use to convert that dollar into my local currency?
The second difference is operational. The money doesn't show up on a traditional bank statement. It lands in a wallet and gets recorded on a public blockchain, which is actually a bookkeeping advantage: every movement is traceable. Each transfer carries a unique identifier, called a hash, plus a timestamp you can verify on the network explorer. Chainalysis lays out how this traceability of on-chain transactions works. Your job is to tie that hash back to your internal voucher.
The case: Distribuidora Andina pays a supplier in USDC
Let's ground this in a concrete example. Distribuidora Andina, an importing SME with 40 employees, receives 5,000 USDC from an overseas customer on May 12. Ten days later, on May 22, it pays 2,000 USDC to a software vendor.
Andina's functional currency is its local currency. Say the rate is 4,000 local units per dollar on May 12, and 4,050 on May 22. These numbers are for illustration; at your own company, use the actual rate for each date. The aim is that, come month-end, the wallet's USDC balance and its local-currency equivalent both tie out to the general ledger, fees and all.
Why does the exact date of each movement matter?
Because the rate moves between May 12 and May 22. Andina took in dollars at one value and spent them at another. That gap creates a foreign exchange gain or loss that has to be recorded. Use a single rate for the whole month and your closing balance won't match reality, and the reconciliation falls apart.
Steps 1 and 2: set the exchange rate and record the inflow
Before you post a single entry, set an exchange rate policy and put it in writing. The whole point is consistency: you don't get to pick the rate transaction by transaction.
- Pick one verifiable source. Most companies use the reference rate published by their central bank, or one from an FX provider they already work with. Stick with the same source every time.
- Decide which time of day or which rate you'll take, say, the closing rate on the business day of the transaction, and write it down.
- For every movement, capture three things: the date, the USDC amount and the rate applied. That's what lets you reconstruct any entry later.
- Save proof of the rate. A screenshot or an export from the source, filed next to the transaction voucher.
For Andina: 4,000 on May 12 and 4,050 on May 22, both filed with their source. With the policy in place, let's record the May 12 inflow: 5,000 USDC arrive. The company recognizes an asset in its wallet and, typically, either clears an account receivable or books revenue. We're treating USDC as a financial asset denominated in dollars; confirm the exact account with your accountant under your country's standards.
The math: 5,000 USDC times 4,000 = 20,000,000 in local currency. The entry, broadly:
| Account | Debit | Credit |
|---|---|---|
| USDC wallet (asset) | 20,000,000 | |
| Accounts receivable / Revenue | 20,000,000 |
The critical piece is the reference. In the memo or document field, jot down the transaction hash and the timestamp. This ledger line now points straight to a transaction anyone can verify on the network explorer. It's the equivalent of the voucher number on a bank deposit, except the verification is public.
Step 3: treat the network fees
Now a line item shows up that you won't find on a typical domestic bank transfer: the network fee, or gas. It's what the blockchain charges to process the transfer.
Say that paying the 2,000 USDC to the supplier costs 1.5 USDC in network fees. The total leaving the wallet is 2,001.5 USDC, not 2,000.
Do I just record the net that goes out, or do I split out the fee?
Always split out the fee. Book the supplier payment at its face amount and the network fee in a separate expense account, much like a bank charge. Record only the net and you lose visibility into what fees are costing you, which is worth tracking, since it shifts with the network and with congestion.
The outflow, at the May 22 rate (4,050):
- Supplier payment: 2,000 USDC times 4,050 = 8,100,000.
- Network fee: 1.5 USDC times 4,050 = 6,075.
The entry:
| Account | Debit | Credit |
|---|---|---|
| Expense / Supplier payable | 8,100,000 | |
| Network fee expense | 6,075 | |
| USDC wallet (asset) | 8,106,075 |
How the fee is classified for tax (financial versus operating expense, and whether it's deductible) comes down to your country's rules, so check with your advisor. What's sound and traceable either way is to book it on its own line.
| Process | Before: international bank wire | After: USDC payment |
|---|---|---|
| Settlement time | 1 to 5 business days, depending on correspondent banks | Minutes to hours, depending on the network |
| Reconciliation reference | Voucher number and monthly bank statement | Transaction hash, verifiable on the explorer in real time |
| Traceability | Trail through intermediary banks, sometimes murky | Every step recorded and public on the blockchain |
| Transaction costs | Sending bank, correspondent and FX fees, not always broken out | Network fee (gas), explicit and easy to book separately |
| Exchange rate applied | The bank's rate on the crediting date | Your own policy-defined rate, on the movement date |
| Availability | Limited to banking hours and business days | 24/7, weekends included |
Steps 4 and 5: match the on-chain statement and file the close
Month-end is where the reconciliation really happens. The goal: the wallet balance lines up with what the general ledger says.
- Export the wallet or platform history to CSV. You'll get a list of movements with date, amount, fee and hash.
- Pull the month's entries that hit the USDC wallet account.
- Match line by line, using the hash as the key. Every movement in the export should have an entry, and every entry a movement. Because the hash is unique, the match is exact.
- Check the USDC balance. Andina took in 5,000 and sent out 2,001.5, so the expected balance is 2,998.5 USDC. Confirm that against what the wallet actually shows.
- Check the local-currency balance and isolate the FX difference. The token balance ties out, but its local-currency value depends on the rates you used. The gap between the inflow value and the outflow value is your foreign exchange gain or loss, and it belongs in its own account.
What if the USDC balance is off by a few tokens?
Nine times out of ten it's an unrecorded network fee or a small movement that slipped through. Scan the export for lines with no matching entry. Since every transaction has a hash, finding the missing one is easy: filter for hashes in the export that don't appear in the ledger.
Reconciliation isn't done when it balances. It's done when you've left audit-ready evidence behind. File the month's CSV export with the reconciliation working paper. For each movement, keep the hash and a screenshot from the network explorer. Hold on to the rate evidence for every date, and document the policy you applied: rate source, fee treatment and the FX difference account. With that, an auditor can trace every figure from the on-chain transaction down to the local-currency balance, a level of traceability that often beats traditional bank flows, where the detail behind an international transfer can be hard to pin down. For more on how this fits into managing cash, see our treasury section, and for more guides, the Soulbit Academy blog index.
Where the stablecoin is not the best option
To be straight with you: the USDC flow isn't always worth it. If your company runs entirely in local currency, with domestic customers and suppliers, adding a stablecoin wallet just piles on operational complexity for no clear payoff. Your ERP already handles traditional bank reconciliation.
Where it earns its keep is cross-border payments, multi-day delays on international transfers, or steep FX costs and bank fees. There, fast settlement and on-chain traceability more than cover the extra reconciliation work. Run the numbers on your own case before you adopt it. It's one more tool in the CFO's kit, not a one-size-fits-all answer.
Frequently asked questions
What exchange rate should I use to record a USDC payment in my books?
Use the local-currency-to-dollar rate on the transaction date, pulled from a verifiable source you stick with consistently (your central bank or an FX provider). USDC is pegged to the dollar, so the rate that matters is USD to your local currency, not some volatile crypto market price.
Are network fees (gas) a deductible expense?
The network fee is a cost you have to pay to push the transfer through, much like a bank charge. In most jurisdictions it's booked as a financial or operating expense. Check the exact treatment with your local tax advisor, since the classification comes down to each country's rules.
How do I match the on-chain statement with my general ledger?
Every blockchain transfer carries a unique identifier (the hash) and a timestamp. Drop that hash into the reference field of the journal entry, the same way you'd cite a bank voucher number. Each line of your general ledger then points to a transaction anyone can verify on the network explorer.
What happens if I receive 1,000 USDC but only 999.5 reach the wallet?
That gap is almost always a network fee taken out by the platform or by the transfer itself. Book the gross amount the customer sent, then book the fee as a separate expense. Never record only the net, or you lose the trail behind the fee and your reconciliation won't balance.
Want your company to add stablecoins to its operations?
Join the Soulbit waitlist and start paying payroll, collecting and managing treasury without SWIFT.
Join the waitlist