Selling across borders means selling in your customers' currencies — not yours. A French customer seeing "$10/month" thinks "what's that in euros?" and bounces; a US customer seeing "9€/month" thinks "wait, am I in Europe?" and bounces. WHMCS supports multi-currency natively. Configured right, every customer sees their local price.
This is the working setup.
Step 1 — Pick your base currency
WHMCS tracks all revenue internally in your base currency. Other currencies are derived via exchange rates. The base currency you pick is permanent — don't change it after you have transactions.
Pick based on:
- Where you bank (USD if US banking; EUR for EU; INR for India).
- Your most common customer (operationally easier).
- Your accountant's preference.
Configure: Setup → Payments → Currencies → Default Currency.
Step 2 — Add the currencies you'll accept
For each currency:
- Setup → Payments → Currencies → Create Currency.
- Set:
- Code (USD, EUR, GBP, INR, etc.).
- Prefix / suffix ("$", "€", "₹").
- Format (decimal separator, thousand separator).
- Exchange rate (relative to base).
WHMCS comes with a built-in exchange-rate updater. Enable it: Setup → Automation Settings → Update Currency Exchange Rates → Daily.
Step 3 — Configure pricing per currency
WHMCS can either:
- Convert automatically from base currency using current exchange rate. Simple but exchange-rate fluctuations show in prices.
- Manual per-currency pricing. You set "Pro Plan = $10/mo in USD, €9/mo in EUR, ₹699/mo in INR." Prices stable; cross-currency conversion is your accounting headache.
For each product: Setup → Products/Services → Products → edit → Pricing tab. Check "Override Currency Conversion" and enter per-currency prices.
Manual pricing is what real multi-currency operators do. Customers don't want their hosting price to fluctuate weekly with FX rates.
Step 4 — How customers pick currency
By default, WHMCS shows your base currency until the customer logs in. Three improvements:
- IP-based currency detection. Use GeoIP at first visit to default to a sensible currency. Cloudflare passes
CF-IPCountryheader you can read in a hook. - Currency switcher in the header. Visible flag/code dropdown so customers can change.
- Sticky preference — store the chosen currency in cookie / localStorage, default to it on next visit.
Hook example for IP-based detection:
add_hook('ClientAreaPage', 1, function ($vars) {
if (isset($_SESSION['currency']) || isset($_SESSION['uid'])) return $vars;
$country = $_SERVER['HTTP_CF_IPCOUNTRY'] ?? null;
$currencyMap = [
'IN' => 4, // currency ID for INR
'GB' => 2, // GBP
'FR' => 3, // EUR
'DE' => 3,
// ...
];
if (isset($currencyMap[$country])) {
$_SESSION['currency'] = $currencyMap[$country];
}
return $vars;
});
Step 5 — Gateway per currency
Some gateways only accept specific currencies, or charge less for some. Configure per-currency:
Setup → Payments → Currencies → edit a currency → Available Gateways:
- USD: Stripe + PayPal + NowPayments.
- EUR: Stripe + PayPal (PayPal Europe).
- INR: Razorpay + (Stripe India if you have it).
- GBP: Stripe + PayPal.
This ensures customers don't see "Stripe India" as an option when paying in USD.
Step 6 — Multi-currency invoice display
Customer's invoice should show in their currency. WHMCS handles this automatically when:
- Your invoice PDF template uses
{$currencysymbol}, not hardcoded "$". - Your invoice email uses currency variables:
{$invoice_amount}and{$invoice_currency_symbol}.
Check both: send a test invoice to a EUR-currency customer; the PDF and email should show "€" not "$".
Step 7 — Tax / VAT per region
Currency and tax are related but distinct. A customer paying in EUR may be in Germany (19% VAT), France (20% VAT), or outside the EU (no VAT). Configure:
Setup → Payments → Tax Configuration:
- Add tax rules per country.
- EU VAT MOSS support — WHMCS has built-in.
- India GST handled separately via custom logic (see my GST guide).
How to verify multi-currency works end-to-end
- Visit the order form from a US IP (or VPN). See USD prices, USD payment options.
- Switch to EUR via the currency switcher. Prices update; gateway options change.
- Place a test order in EUR. Pay. Invoice generated in EUR.
- Receive invoice email — currency symbol matches.
- Download invoice PDF — currency consistent.
- Admin sees the invoice in the customer's currency, with conversion to base currency shown for reporting.
Common pitfalls
"Customer chose EUR but paid via a USD-only gateway." Gateway-per-currency isn't configured. Force currency-gateway matching at the order level.
"FX rates drift, prices look weird (€8.74 instead of €9)." You're using auto-conversion. Switch to manual per-currency pricing for stable, round numbers.
"Customer paid in INR but invoice says USD." The invoice template uses base-currency variables. Replace with currency-aware ones: {$invoice_currency_symbol}{$invoice_amount}.
"Refunds in different currency than original payment." Some gateways refund at current FX rates, not the original. Customer may receive less than they paid. Refund through the gateway's UI, not WHMCS's, to ensure exact-amount refund.
My take — currency strategy
For hosting brands selling across borders:
- Pick 3-5 currencies that cover 90% of your customers (typically USD, EUR, GBP, INR + one regional).
- Manual per-currency pricing. Stable, customer-friendly.
- Currency picker prominent in the header.
- IP-based default but customer can override.
- Annual rebase: review per-currency pricing once a year to keep up with FX trends.
Going further
I set up multi-currency + multi-tax WHMCS deployments for hosting brands selling globally. Tell me your target markets and I'll send a quote in 24 hours.