---
title: "How to book a stablecoin payout: quote fields, journal entries, and FX differences"
seoTitle: "How to book a stablecoin payout in your ledger"
description: "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."
date: "2026-10-07"
updated: "2026-10-07"
category: "payments"
author: "BlindPay Team"
faq:
  - q: "Which exchange rate should I use to book a stablecoin payout?"
    a: "Use the rate at the date of the transaction. For a payout executed against a live quote, the quote itself is the best evidence of that rate, because it records the market rate and the rate you actually got at the moment you paid. Store both. The gap between them is a cost of conversion, and the gap between the quote and your invoice rate is an FX difference."
  - q: "Where does the difference between the invoice rate and the payout rate go?"
    a: "Under IAS 21, exchange differences that arise when a foreign currency monetary item is settled are generally recognized in profit or loss. In practice that is a realized FX gain or loss line. Book the supplier invoice at the rate on the invoice date, settle it at the quote rate, and post the difference to that line. Confirm the treatment with your auditor."
  - q: "Are payout fees an FX loss or an expense?"
    a: "Keep them separate. The difference between the market rate and the rate you received, plus any flat fee, is the price of the conversion service, so most teams post it to a payment processing or bank charges expense. An FX loss is market movement between the invoice date and the payment date. Mixing the two hides what your payout provider actually costs you."
  - q: "What should I export from each BlindPay quote for the ledger?"
    a: "The quote id, expires_at, commercial_quotation, blindpay_quotation, sender_amount, receiver_amount, flat_fee, partner_fee_amount, and billing_fee_amount, plus the payout or payin id it backed and the final status. Amounts are integers in minor units, so divide by 100 before posting. Pull them from the API or the webhook payload, not from a screenshot."
  - q: "How long should I keep quote and payout records?"
    a: "At least as long as your auditor and regulators require. US rules under the Bank Secrecy Act set five years for records that chapter requires financial institutions to keep, and many finance teams use five years as their floor for payment evidence too. Keep the raw API response, not only the ledger entry, so you can show the rate you were offered."
---

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](/docs/payout-quotes)). That one-to-one link is what makes reconciliation clean.

| Field | Where it comes from | Why finance needs it |
| --- | --- | --- |
| `id` (`qu_...`) | Quote | Joins the quote to the payout or payin |
| `expires_at` | Quote | Timestamp of the rate, in epoch milliseconds |
| `commercial_quotation` | Quote | Raw market rate at that moment |
| `blindpay_quotation` | Quote | Rate net of BlindPay's fee, the rate you actually got |
| `sender_amount` | Quote | What left the funding wallet or the payer, in minor units |
| `receiver_amount` | Quote | What the bank account or wallet received, in minor units |
| `flat_fee` | Quote | Flat-fee component |
| `partner_fee_amount` | Quote | Your own markup, if you passed a `partner_fee_id` |
| `billing_fee_amount` | Quote | Fee invoiced at month end instead of charged now |
| `id` (`po_...` or payin id), `status` | Payout or payin | Proves it executed, and how it ended |

Payin quotes return the same pricing fields plus `is_otc` ([payin quotes docs](/docs/payin-quotes)). 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](/resources/more/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](/resources/more/stablecoin-api-webhooks-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](https://www.ifrs.org/issued-standards/list-of-standards/ias-21-the-effects-of-changes-in-foreign-exchange-rates/)). 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?](/resources/more/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.

| Account | Debit (USD) | Credit (USD) |
| --- | --- | --- |
| Accounts payable, supplier | 10,000.00 | |
| Realized FX loss | 93.46 | |
| Payment processing fees | 39.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](/docs/learn/billing)).

## 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.

| Account | Debit (USD) | Credit (USD) |
| --- | --- | --- |
| Stablecoin holdings (USDC) | 5,065.65 | |
| Payment processing fees | 28.69 | |
| Accounts receivable, customer | | 5,000.00 |
| Realized FX gain | | 94.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](/resources/more/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](/resources/more/who-carries-fx-risk-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](https://www.law.cornell.edu/cfr/text/31/1010.430)). 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](/resources/more/how-onramp-offramp-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](/docs/payout-quotes) list every field.
