When you accept payments in a currency different from your payout bank account currency, Stripe applies currency conversion logic that affects your final payout. Understanding how the "Stripe Exchange Rate" is calculated is crucial for maintaining your profit margins, especially for international businesses.
How the Calculation Works
The process of converting a customer payment to your bank account involves several steps:
Processing Fees: First, Stripe deducts the standard processing fee (e.g., 2.9% + $0.30) from the transaction amount in the source currency.
Currency Conversion: The remaining net amount is then converted. Stripe typically uses the daily mid-market rate.
FX Fee: Stripe adds a fee for the currency conversion. This is usually 1% (or sometimes 2%) on top of the mid-market rate. In our calculator, we subtract this percentage from the exchange rate to show you the "Adjusted Rate."
Example Scenario
Imagine you charge a customer $100 USD, but your bank account is in Euros (EUR).
Gross: $100.00 USD
Processing Fee: $3.20 (2.9% + $0.30)
Net Pending: $96.80 USD
Market Rate: 0.85 EUR/USD
Stripe FX Fee: 1%
Calculation: The $96.80 is converted at a rate of 0.85 * (1 – 0.01) = 0.8415.
Final Payout: €81.46 EUR
Tips for Managing Exchange Rates
To minimize losses due to exchange rates, consider enabling Alternative Currency Payouts if your bank supports holding multiple currencies. This allows you to avoid Stripe's conversion fee by receiving funds in the original currency and converting them later through your bank or a third-party FX service which might offer better rates.
Note: This calculator provides an estimation based on standard Stripe formulas. Actual rates may vary slightly depending on the exact time of settlement and your specific Stripe agreement.
function calculateStripePayout() {
// 1. Get input values
var chargeAmount = document.getElementById("chargeAmount").value;
var marketRate = document.getElementById("marketRate").value;
var fxFee = document.getElementById("fxFee").value;
var stripePercent = document.getElementById("stripePercent").value;
var stripeFixed = document.getElementById("stripeFixed").value;
// 2. Validate inputs
if (chargeAmount === "" || marketRate === "" || isNaN(chargeAmount) || isNaN(marketRate)) {
alert("Please enter both the Charge Amount and the Mid-Market Exchange Rate.");
return;
}
// Parse float values
var amount = parseFloat(chargeAmount);
var rate = parseFloat(marketRate);
var conversionFeePercent = parseFloat(fxFee) || 1.0;
var procPercent = parseFloat(stripePercent) || 2.9;
var procFixed = parseFloat(stripeFixed) || 0.30;
// 3. Logic Implementation
// Step A: Calculate Standard Processing Fees (in Source Currency)
var processingFeeAmount = (amount * (procPercent / 100)) + procFixed;
// Step B: Calculate Net Amount before conversion
var netBeforeConv = amount – processingFeeAmount;
// Handle case where fees exceed amount
if (netBeforeConv < 0) {
netBeforeConv = 0;
}
// Step C: Calculate Adjusted Exchange Rate
// Stripe typically takes the fee off the rate or the amount.
// Mathematically: Net * Rate * (1 – Fee%)
var adjustedRate = rate * (1 – (conversionFeePercent / 100));
// Step D: Calculate Final Payout (Target Currency)
var finalPayout = netBeforeConv * adjustedRate;
// Step E: Calculate Total Cost in Source Currency context
// This is tricky because the payout is in a different currency.
// We calculate cost as: Amount – (FinalPayout / MarketRate)
// This represents the value lost compared to a perfect mid-market exchange.
var valueInSourceIfPerfect = finalPayout / rate;
var totalCost = amount – valueInSourceIfPerfect;
// 4. Update UI
document.getElementById("resGross").innerText = amount.toFixed(2);
document.getElementById("resProcFees").innerText = processingFeeAmount.toFixed(2);
document.getElementById("resNetBefore").innerText = netBeforeConv.toFixed(2);
document.getElementById("resFxFeeDisplay").innerText = conversionFeePercent;
document.getElementById("resAdjRate").innerText = adjustedRate.toFixed(5);
document.getElementById("resFinalPayout").innerText = finalPayout.toFixed(2);
// Show total cost in source currency terms roughly
document.getElementById("resTotalCost").innerText = totalCost.toFixed(2) + " (approx)";
// Show result area
document.getElementById("resultArea").style.display = "block";
}