---
title: "How to show a cross-border payment quote to users: rate, fees, and expiry"
seoTitle: "Cross-border quote screen: rate, fees, expiry, disclosure"
description: "What a cross-border quote screen must show: amount sent, rate, fees, amount received, expiry, and delivery date, plus the CFPB and EU disclosure rules."
date: "2026-10-07"
updated: "2026-10-07"
category: "payments"
author: "BlindPay Team"
howto:
  name: "How to build a cross-border payment quote screen"
  steps:
    - name: "Ask which side is fixed"
      text: "Let the user choose between a fixed amount to send and a fixed amount to receive, and request the quote in that mode."
    - name: "Request a firm quote"
      text: "Call the quote endpoint with the amount, the recipient's bank account, and who pays the fees. Store the quote ID and its expiry."
    - name: "Render every line"
      text: "Show amount sent, each fee, total charged, exchange rate, amount received, and the estimated delivery date, all from the quote response."
    - name: "Run a countdown from the expiry"
      text: "Count down to the quote's expiry time. When it reaches zero, disable the confirm button and offer a new quote."
    - name: "Requote visibly"
      text: "Fetch a fresh quote and show the new numbers. Never swap in a different rate without the user seeing it before confirming."
    - name: "Confirm and issue a receipt"
      text: "Execute the payment against the quote ID, then show a receipt with the same figures, the payment reference, the status, and how to get help."
faq:
  - q: "What must a cross-border payment quote show?"
    a: "At minimum: the amount sent, every fee, the total charged, the exchange rate, the amount the recipient gets in their currency, when the quote expires, and when the money should arrive. For US consumer remittances the CFPB's Remittance Transfer Rule makes most of these mandatory before the sender pays, with the delivery date on the receipt."
  - q: "Does the CFPB Remittance Transfer Rule apply to business payments?"
    a: "The rule protects a sender who is a consumer sending money mainly for personal, family, or household purposes, so payments a company makes for business purposes generally fall outside it. Providers that made 500 or fewer remittance transfers in both the previous and current calendar year are also outside the provider definition. Confirm your own case with counsel."
  - q: "How many decimal places should the exchange rate show?"
    a: "For US consumer remittances, Regulation E requires the disclosed exchange rate to be rounded consistently for each currency to no fewer than two and no more than four decimal places. Outside that rule, four decimal places is a sensible default for most pairs, and the rate should always say which direction it runs, such as 1 USD = 5.3730 BRL."
  - q: "What should happen when a quote expires on screen?"
    a: "Disable the confirm button the moment the countdown hits zero, explain that rates move, and offer a one-click new quote. Show the refreshed numbers and make the user confirm again. Silently replacing an expired quote with a new rate at the moment of confirmation is the fastest way to lose trust."
  - q: "Should a quote screen show the mid-market rate?"
    a: "It helps. Showing the market rate next to your rate lets users see the margin, and EU rules already push card currency conversion toward a percentage markup over the ECB reference rate. At BlindPay, every quote returns commercial_quotation and blindpay_quotation, so you can display both without a separate data feed."
---

A cross-border quote screen should show six things before the user confirms: amount sent, every fee, the exchange rate, the amount the recipient gets, when the quote expires, and when the money arrives. US consumer remittances must show most of these by law. BlindPay quotes return each figure as a field, with a 5-minute expiry, so the screen can render straight from the response.

Most quote screens fail in the same three places. They hide the margin in the rate, they let an expired rate through, and they promise "instant" for a rail that takes days.

**Key takeaways**

- Show amount sent, fees, total, rate, amount received, expiry, and delivery estimate. Leave nothing for the user to compute.
- US consumer remittances fall under the CFPB Remittance Transfer Rule: pre-payment disclosure, receipt, 30-minute cancellation, and error resolution.
- The EU requires online credit transfers with currency conversion to show estimated conversion charges and the estimated total before the payment starts.
- Drive the countdown from the quote's expiry, disable confirm at zero, and requote visibly.
- Delivery estimates depend on the rail. Pix and SPEI land in minutes; ACH, SEPA, and SWIFT take business days.

## What should a cross-border quote screen show?

It should show every number the user needs to judge the payment, taken from one firm quote, so the user never has to calculate anything. Here is the full list and where each line comes from in a BlindPay payout quote ([payout quotes](/docs/payout-quotes)).

| Line on screen | Why it matters | BlindPay quote field |
| --- | --- | --- |
| You send | The amount debited or funded | `sender_amount` (minor units) |
| Fees, itemized | Separates your fees from provider fees | `flat_fee`, `partner_fee_amount`, `billing_fee_amount` |
| Total charged | What actually leaves the user's balance | Derived from the amounts above and `cover_fees` |
| Exchange rate, with direction | Shows the price of the currency | `blindpay_quotation` |
| Market rate (optional) | Makes the margin visible | `commercial_quotation` |
| Recipient gets | The number the recipient checks | `receiver_amount` (minor units) |
| Quote expires in | Tells the user the numbers are firm, but not forever | `expires_at` (epoch milliseconds) |
| Estimated arrival | Sets expectations per rail | From the rail; see [cut-off times](/docs/kb/cut-off-times) |
| Recipient | Name and masked account, so the user can spot a mistake | From the saved bank account |

Two formatting rules. Amounts come back as integers in minor units, so divide by 100 for USD, BRL, and MXN before display. And write the rate with its direction, such as "1 USD = 5.3730 BRL", because a bare "5.373" means nothing to someone comparing two apps.

[Stablecoin API quotes explained](/resources/more/stablecoin-api-quotes-explained) covers the API side of these fields: what a quote locks, fee direction, and minor units. This page is about what the user sees.

## What does the CFPB Remittance Transfer Rule require?

For consumer remittances sent from the US, the CFPB's Remittance Transfer Rule (Regulation E, subpart B, 12 CFR 1005.30 to 1005.36) requires a disclosure before payment, a receipt after it, a 30-minute cancellation right, and an error resolution process.

**Who it covers.** A remittance transfer is an electronic transfer requested by a consumer to a recipient abroad, excluding transfers of $15 or less. The sender must be a consumer acting mainly for personal, family, or household purposes, so business-purpose payments generally fall outside it. A provider that made 500 or fewer remittance transfers in the previous calendar year and makes 500 or fewer in the current one is not treated as providing them in the normal course of business ([12 CFR 1005.30](https://www.law.cornell.edu/cfr/text/12/1005.30)).

**Pre-payment disclosure.** Before the sender pays, [12 CFR 1005.31](https://www.law.cornell.edu/cfr/text/12/1005.31) requires:

1. The transfer amount, in the currency the sender funds it with.
2. Fees and taxes the provider charges.
3. The total, the sum of the two.
4. The exchange rate, rounded consistently to between two and four decimal places.
5. Covered third-party fees, and the amount in the recipient's currency.
6. The total to recipient, in the recipient's currency.
7. A statement that fees or taxes charged by others may reduce what the recipient gets, where they may apply.

**Receipt.** Everything above, plus the date funds will be available, the recipient's name, a statement of error and cancellation rights, and contact details for the provider, the state regulator, and the CFPB.

**Cancellation.** The sender can cancel if the request arrives no later than 30 minutes after payment and the funds haven't been picked up or deposited. The provider refunds the full amount, fees included, within three business days ([12 CFR 1005.34](https://www.law.cornell.edu/cfr/text/12/1005.34)).

**Errors.** The sender has 180 days after the disclosed availability date to report an error, such as a wrong amount or funds that arrive late. The provider has 90 days to investigate ([12 CFR 1005.33](https://www.law.cornell.edu/cfr/text/12/1005.33)).

What this means for the screen: if you serve US consumers, the 30-minute window and the "date available" line belong in your product spec from day one. Adding them later means redesigning confirmation and receipt flows.

This is for information only and is not legal advice. Whether your product is a remittance transfer provider depends on your facts.

## What do EU rules require on a quote screen?

For online credit transfers that include a currency conversion, EU rules require the payer's provider to show the estimated conversion charges and the estimated total amount before the payment starts.

The requirement is Article 3b of Regulation (EC) No 924/2009, inserted by [Regulation (EU) 2019/518](https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32019R0518) and applied from 19 April 2020. The information has to be "clear, neutral and comprehensible". For card-based payments, the same regulation goes further and expresses conversion charges as a percentage markup over the latest [ECB euro reference rates](https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html).

Even outside the EU, that percentage-over-reference format is a good pattern. Users understand "0.5% above the market rate" faster than two rates with four decimals each. [How to calculate FX spread](/resources/more/how-to-calculate-fx-spread) shows how to compute that number from a quote.

## How should the screen handle who pays the fee?

Decide which side of the payment is fixed, then show fees in a way that matches it. Two choices drive this: which amount the user types, and who absorbs the fees.

**Which amount is fixed.** A business paying a supplier invoice usually knows the amount the supplier must receive. A user sending money home usually knows how much they want to spend. Offer both modes. In BlindPay quotes, `currency_type: "sender"` fixes the stablecoin amount sent, and `currency_type: "receiver"` fixes the fiat amount the bank account receives.

**Who pays fees.** With `cover_fees: false`, fees are deducted from the fiat the recipient receives. With `cover_fees: true`, they are added on top of the amount sent, so the recipient gets the full figure. On screen:

| Mode | User types | Fees appear as | Recipient sees |
| --- | --- | --- | --- |
| Fixed receive, sender covers fees | R$10,000 to receive | Added to the amount sent | Exactly R$10,000 |
| Fixed send, recipient absorbs fees | $2,000 to send | Deducted before conversion | Less than $2,000 x rate |

For invoices, fixed receive with the sender covering fees is almost always right. A supplier who gets R$9,940 against a R$10,000 invoice will chase the gap, and your user pays for the follow-up. [Hidden fees in international wires](/resources/more/hidden-fees-international-wires-our-sha-ben) explains why the same problem shows up with SWIFT SHA and BEN charges.

## How should you handle quote expiry in the UI?

Run a visible countdown from the quote's expiry time, block confirmation when it reaches zero, and fetch a new quote that the user must confirm again. Never let an expired price through.

BlindPay payout and payin quotes expire after 5 minutes by default, and some rails can return less, such as SEPA payout quotes. `expires_at` is in epoch milliseconds, so compare it to `Date.now()` directly. Read it from every response instead of hardcoding 5 minutes.

A pattern that works:

1. **Start the timer from `expires_at`,** not from when the screen rendered. Network latency eats seconds.
2. **Leave a buffer.** Stop accepting confirmation a few seconds before expiry so the execute call lands while the quote is still valid.
3. **Disable, then explain.** "This rate expired. Rates change every few seconds. Get a new quote?"
4. **Show the new numbers.** If the rate moved, show what changed before the user confirms again.
5. **Requote on return.** If the user leaves the tab and comes back, check expiry immediately.

Short expiries are a feature. A provider that locks a rate for an hour has priced an hour of market risk into that rate. [Stablecoin FX slippage](/resources/more/stablecoin-fx-slippage-live-quotes) explains the trade-off.

## What delivery estimate should the screen show?

Show an estimate per rail, adjusted for cut-offs and weekends, and never "instant" for a rail that runs on business days. The rail is the biggest driver of arrival time.

| Rail | Typical BlindPay payout timing |
| --- | --- |
| Pix (Brazil), SPEI (Mexico), Transfers 3.0 (Argentina) | Minutes; Pix and SPEI run 24/7 |
| RTP (US) | Instant |
| ACH, wire (US) | ACH about 2 business days; wire about 1 business day |
| TED (Brazil), ACH Colombia, SEPA | About 1 business day |
| SWIFT (POBO/COBO) | About 5 business days, after compliance documents are approved |

Source: [bank accounts](/docs/bank-accounts), [payment methods](/docs/kb/payment-methods), and [cut-off times](/docs/kb/cut-off-times). High volume can stretch any estimate, and payouts can be held for compliance review, so phrase it as "usually arrives by" rather than a promise. [Do stablecoin payouts work on weekends?](/resources/more/stablecoin-payout-cut-off-times-weekends-holidays) covers the calendar side.

## What should the receipt and status screen show?

The receipt should repeat the exact quote figures, add a payment reference and status, and tell the user how to get help. It is the screen users come back to when something looks wrong.

- **The same numbers as the quote.** Amount sent, fees, rate, amount received. If they differ, you have a bug.
- **Status in plain words.** BlindPay payouts move through `processing`, `on_hold`, `completed`, `failed`, or `refunded`. Map each to a sentence. [Stablecoin payout statuses explained](/resources/more/stablecoin-payout-statuses-explained) has suggested wording.
- **A reference the recipient's bank understands.** For SWIFT payouts, show the UETR once it is populated; every bank in the chain uses it. BlindPay sends SWIFT payments on behalf of the customer (POBO/COBO) with UETR tracking and MT103 confirmations ([POBO and COBO](/docs/kb/pobo-cobo)).
- **A help path.** For US consumer remittances, the receipt must include error and cancellation rights and contact details.

## How does BlindPay help you build the quote screen?

Every line on the screen maps to a field in one BlindPay quote, so the UI renders from a single response and executes against the same quote ID.

- **One quote, every figure.** `sender_amount`, `receiver_amount`, `commercial_quotation`, `blindpay_quotation`, `flat_fee`, `partner_fee_amount`, and `expires_at` in one response.
- **Both fee modes.** `cover_fees` and `currency_type` support fixed-send and fixed-receive screens without extra math on your side.
- **Your margin, itemized.** A [partner fee](/docs/learn/partner-fees) adds your markup to the quote as its own line, so you can show it separately from BlindPay's fee.
- **Rails behind one call.** Pix, SPEI, ACH, RTP, SEPA, Transfers 3.0, ACH Colombia, and SWIFT (POBO/COBO), funded from stablecoins at send time with no pre-funding.

The disclosure duties themselves sit with whoever is the provider to the end user. BlindPay gives you the numbers; your product decides how to present them and which rules apply.

## What to do next

Sketch your quote screen against the table at the top of this page and mark any line you can't fill from a single quote. Then create a test quote from the [payout quickstart](/docs/quickstart-payout) and render it: amount sent, fees, rate with direction, amount received, and a countdown from `expires_at`. For the bigger picture, read [what real-time cross-border settlement is](/resources/more/what-is-real-time-cross-border-settlement).
