Calculate the hidden fees and true spread on your international money transfers.
The amount of money you are sending (e.g., USD, GBP).
The "real" exchange rate found on Google or Xe.com.
The exchange rate your bank or transfer service is giving you.
Markup Percentage:0.00%
Hidden Fee (Target Currency):0.00
Real Value vs. Received:–
function calculateMarkup() {
// 1. Get Inputs
var amount = parseFloat(document.getElementById('transferAmount').value);
var midRate = parseFloat(document.getElementById('midMarketRate').value);
var offeredRate = parseFloat(document.getElementById('providerRate').value);
// 2. Validation
if (isNaN(amount) || amount <= 0) {
alert("Please enter a valid transfer amount.");
return;
}
if (isNaN(midRate) || midRate <= 0) {
alert("Please enter a valid Mid-Market rate.");
return;
}
if (isNaN(offeredRate) || offeredRate Mid rate (unlikely for selling), the math still holds but sign flips.
// Calculate what the recipient gets at mid-market
var realTotal = amount * midRate;
// Calculate what the recipient gets at offered rate
var offeredTotal = amount * offeredRate;
// The difference is the hidden cost
var loss = realTotal – offeredTotal;
// Markup Percentage formula: ((Mid – Offered) / Mid) * 100
// We use Math.abs to handle cases where quotes might be inverted, though usually Mid > Offered.
var markupDecimal = (midRate – offeredRate) / midRate;
var markupPercent = markupDecimal * 100;
// 4. Update UI
var resultsDiv = document.getElementById('resultsArea');
resultsDiv.style.display = 'block';
// Markup Percentage
var markupElem = document.getElementById('markupPercentage');
markupElem.innerText = markupPercent.toFixed(3) + "%";
// Color coding for markup
if(markupPercent > 2) {
markupElem.style.color = "#dc3545"; // Red for high markup
} else if (markupPercent > 0.5) {
markupElem.style.color = "#ffc107"; // Yellow/Orange
} else {
markupElem.style.color = "#28a745"; // Green
}
// Hidden Fee
document.getElementById('hiddenFee').innerText = loss.toFixed(2);
// Comparison Text
document.getElementById('comparisonText').innerText =
"Recipient gets " + offeredTotal.toFixed(2) + " instead of " + realTotal.toFixed(2);
}
Understanding Exchange Rate Markup
When sending money internationally, the "exchange rate" you see on Google (the mid-market rate) is rarely the rate you get from a bank or transfer provider. The difference between the real market rate and the rate you are offered is known as the Exchange Rate Markup or spread.
This markup acts as a hidden fee. While many providers advertise "$0 commission" or "no fees," they profit by offering you a worse exchange rate than the one they trade at. This calculator helps you uncover exactly how much that spread is costing you.
How to Calculate FX Markup
To calculate the markup percentage on a currency transfer, you need two numbers: the Mid-Market Rate (Interbank rate) and the Provider's Rate (Client rate).
Imagine you want to transfer $10,000 USD to Euros (EUR).
Mid-Market Rate: 1 USD = 0.9200 EUR (Real value)
Bank Rate: 1 USD = 0.8900 EUR (What you are offered)
Using the formula:
Difference: 0.9200 – 0.8900 = 0.0300
Markup: (0.0300 / 0.9200) × 100 = 3.26%
In monetary terms, $10,000 × 0.0300 means you are effectively paying a €300 hidden fee on top of any upfront transaction charges.
What is a "Good" Exchange Rate?
Generally, the closer the offered rate is to the mid-market rate, the better the deal.
0% – 0.5%: Excellent (Often found with specialized FX brokers).
0.5% – 1.5%: Good (Competitive digital transfer services).
2.0% – 4.0%: Poor (Standard bank rates).
4.0%+: Very Poor (Airport kiosks and bad banking rates).
Why Do Banks Add a Markup?
Banks and financial institutions add a markup to cover their own trading costs and to generate profit. However, because exchange rates fluctuate constantly, it is difficult for consumers to notice this fee unless they compare the offered rate directly against the real-time interbank rate. Using an exchange rate markup calculator ensures transparency and helps you choose the most cost-effective provider.