How to book a stablecoin payout: quote fields, journal entries, and FX differences

Which quote fields finance should export, illustrative journal entries for a USDC to BRL payout and a Pix payin, and where FX gains and losses land.

Book a stablecoin payout like any foreign currency payment: record it at the rate on the transaction date, split the cost of conversion from market movement, and keep the quote as evidence. Export each quote's market rate, your rate, both amounts, and every fee line. Then post three lines: the payable you settled, the FX difference, and the fee.

This is not accounting advice. Classification of stablecoin holdings and the exact chart of accounts are judgment calls for your controller and auditor. What follows is the data you need to make those calls, and illustrative entries that show where each number goes.

Key takeaways

  • The quote is your rate evidence. It records the market rate and the rate you paid at one moment.
  • Export the fields, not a screenshot: ids, expires_at, both quotations, both amounts, and the fee lines.
  • Market movement since the invoice is an FX difference. The gap between market and quoted rate is a fee.
  • A billing_fee_amount means the fee arrives on a monthly invoice. Accrue it when the quote executes.
  • Keep the raw API response for at least five years.

What should finance export from every quote and payout?

Everything the quote returned, joined to the transaction it backed. A payout quote is created against one bank account and expires 5 minutes after creation, and each quote can back only one payout (payout quotes docs). That one-to-one link is what makes reconciliation clean.

FieldWhere it comes fromWhy finance needs it
id (qu_...)QuoteJoins the quote to the payout or payin
expires_atQuoteTimestamp of the rate, in epoch milliseconds
commercial_quotationQuoteRaw market rate at that moment
blindpay_quotationQuoteRate net of BlindPay's fee, the rate you actually got
sender_amountQuoteWhat left the funding wallet or the payer, in minor units
receiver_amountQuoteWhat the bank account or wallet received, in minor units
flat_feeQuoteFlat-fee component
partner_fee_amountQuoteYour own markup, if you passed a partner_fee_id
billing_fee_amountQuoteFee invoiced at month end instead of charged now
id (po_... or payin id), statusPayout or payinProves it executed, and how it ended

Payin quotes return the same pricing fields plus is_otc (payin quotes docs). Rates read as local currency per unit of stablecoin, so a BRL quote of 5.33 means 5.33 reais per USDC. How to read an FX quote covers the direction if your ERP expects the inverse.

Pull these from payout.complete and payin.complete webhooks or the list endpoints, and write them to a table your close process reads. Webhooks for reconciliation shows the event handling.

Which exchange rate goes in the books?

The spot rate at the date of the transaction. The IFRS Foundation describes IAS 21's principal issues as "which exchange rate(s) to use and how to report the effects of changes in exchange rates in the financial statements" (IFRS Foundation, IAS 21). Under the standard, a foreign currency transaction is recorded first at the spot rate on the transaction date, and exchange differences that arise when a monetary item is settled go to profit or loss, with an exception for net investments in foreign operations. US GAAP has a parallel framework in ASC 830.

For a payout, two rates sit on the quote. commercial_quotation is the market. blindpay_quotation is what you got. Teams generally use the market rate to measure the FX difference and treat the gap to the quoted rate as a fee. That keeps "the market moved" and "the provider charged" on separate lines.

One open question: whether your USDC balance is cash, a financial asset, or something else depends on your framework and your auditor. If USDC is your functional or working currency, a USD payout has no FX difference at all. Is USDC to USD one to one? explains the redemption side.

What do the journal entries look like for a USDC to BRL payout?

Three debits and one credit. Illustrative example, with invented rates and fees:

  1. October 1: a Brazilian supplier invoices R$ 54,000. At 5.40 BRL per USD, you book a payable of USD 10,000.00.
  2. October 20: you request a payout quote with currency_type: receiver for R$ 54,000.00. The quote shows commercial_quotation 5.35 and a sender_amount of 10,133.33 USDC.
  3. At the market rate, R$ 54,000 is worth 54,000 / 5.35 = USD 10,093.46.
AccountDebit (USD)Credit (USD)
Accounts payable, supplier10,000.00
Realized FX loss93.46
Payment processing fees39.87
Stablecoin holdings (USDC)10,133.33

The FX loss is market movement: 10,093.46 minus the 10,000.00 you booked. The fee is the conversion cost: 10,133.33 minus 10,093.46. Debits and credits both total 10,133.33.

If the quote had a billing_fee_amount, that part of the fee is not taken from the USDC. Accrue it on the execution date and clear the accrual when the month-end invoice arrives (billing docs).

What do the entries look like for a Pix payin?

The mirror image. Illustrative example: a Brazilian customer owes you an invoice of R$ 27,000, booked October 1 at 5.40 as a USD 5,000.00 receivable. On October 15 they pay by Pix against a payin quote with a market rate of 5.30. The destination wallet receives 5,065.65 USDC.

At market, R$ 27,000 is worth 27,000 / 5.30 = USD 5,094.34.

AccountDebit (USD)Credit (USD)
Stablecoin holdings (USDC)5,065.65
Payment processing fees28.69
Accounts receivable, customer5,000.00
Realized FX gain94.34

The real strengthened between invoice and payment, so you gained 94.34 on the currency and paid 28.69 for the conversion. Totals match at 5,094.34.

Where do FX differences actually come from?

From the time between booking and settling. A payout executed the same minute you book it has almost no FX difference, only a fee. A payout made 30 days after the invoice carries 30 days of market movement.

Three patterns show up in month-end reviews:

  • Invoice-to-payment gaps. The longer your payment terms, the bigger the FX line. The FX gap between sale and payout covers how to shrink it.
  • Open balances at period end. A BRL payable still open on the 31st is a monetary item that gets remeasured at the closing rate, which creates an unrealized difference before any payout happens.
  • Fees read as FX. If you post the full difference between the invoice and the USDC spent to one line, your FX loss looks worse and your provider looks free. Split them.

Who carries the movement in the first place is a commercial choice, covered in who carries FX risk on a stablecoin payout.

How do you reconcile quotes to payouts each month?

Match every executed quote to exactly one payout or payin, then match those to the ledger. A short routine:

  1. List payouts and payins for the period and keep only terminal statuses: completed, failed, refunded.
  2. Join each to its quote by id and convert minor units to decimals.
  3. Check that sender_amount equals the stablecoin that left the wallet on chain.
  4. Post fees from the quote lines, not from a computed difference.
  5. Reverse or never post entries for failed and refunded payouts. A refunded payout returns stablecoins; it does not settle the payable.
  6. Tie accrued billing_fee_amount totals to the month-end invoice.

Keep the raw responses. Under 31 CFR 1010.430, records that FinCEN's rules require financial institutions to keep "shall be retained for a period of five years" (Cornell LII). Your obligations may differ, but five years is a sensible floor for payment evidence.

Every one of these numbers exists because a provider prices conversions somewhere between market and quote. How on/off-ramp providers make money explains what sits in that gap.

What to do next

Export one week of quotes and payouts from a development instance into your close template, post the entries above, and ask your auditor to sign off on the account mapping before you go live. The payout quotes docs list every field.

FAQ