Customers paying in crypto still think in their own currency. A checkout that says "0.00091 BTC" without context makes people hesitate. Showing the local equivalent, for example "≈ €54.20", reduces drop-off. The catch is that rates change constantly and rate APIs have limits. Here is a small Node.js pattern that caches rates and keeps the display honest.

Keep one source of truth

Your payment gateway already quotes a locked amount when it creates an invoice. That locked amount is what the customer must pay. The fiat figure you show is informational. Make that distinction visible in the UI and in the code.

// rates.js const TTL_MS = 60 * 1000; let cache = { at: 0, rates: null }; async function getRates() { if (cache.rates && Date.now() - cache.at < TTL_MS) return cache.rates; const res = await fetch(process.env.RATES_URL, { headers: { Accept: "application/json" } }); if (!res.ok) { if (cache.rates) return cache.rates; // serve stale rather than fail throw new Error("rates unavailable"); } cache = { at: Date.now(), rates: await res.json() }; return cache.rates; } module.exports = { getRates }; 

A sixty-second cache is plenty for display purposes and keeps you far below most free API limits.

Format per locale

Use the built-in Intl API instead of hand-rolled formatting. It handles separators, currency symbols and symbol position for each locale.

function fiatLabel(amountCrypto, coin, fiat, locale, rates) { const rate = rates[coin]?.[fiat]; if (!rate) return ""; const value = amountCrypto * rate; const fmt = new Intl.NumberFormat(locale, { style: "currency", currency: fiat }); return "≈ " + fmt.format(value); } // fiatLabel(0.00091, "BTC", "EUR", "de-DE", rates) -> "≈ 54,20 €" 

Be explicit about approximation

Always prefix with "≈" and add a short note such as "Final amount is locked for 20 minutes on the payment page." If the cached rate is older than a few minutes, hide the fiat label instead of showing a stale figure.

Stablecoins are simpler

For USDT or USDC priced in dollars, the conversion to euros or yen still matters for non-US customers, but volatility is low. Many merchants show the stablecoin amount and the local currency side by side and skip the "rate locked" warning.

Do not forget fees

Customers also want to know whether there are extra costs. Network fees are paid by the sender and depend on the chain; merchant fees are paid by the merchant. A clear fee explanation prevents support tickets. If you want to model what the merchant side costs at different volumes, our crypto payment fee calculator gives a quick estimate.

Published by PandaWM, an overseas marketing team based in Hong Kong.