Auto conversion vs manual per-currency pricing
Shopify Markets auto-converts base variant prices using the previous-day spot FX rate, then applies your configured rounding rule. This works acceptably for base products where a $19.99 shirt becoming €18.51 is easily rounded to €18.99 or €19.99. It falls apart for option fees where a $5 add-on becomes €4.63, £3.94, ¥750, or ₹416 — none of which read as intentional prices. Manual per-currency option fees let you set the exact price point per currency.
Recommended price points per currency
| Option (USD) | EUR | GBP | JPY | AUD | CAD | INR |
|---|---|---|---|---|---|---|
| $3.99 | €3.99 | £3.49 | ¥500 | A$5.99 | C$4.99 | ₹299 |
| $4.99 | €4.99 | £4.49 | ¥700 | A$7.49 | C$6.49 | ₹399 |
| $5.99 | €5.99 | £5.49 | ¥900 | A$8.99 | C$7.99 | ₹499 |
| $7.99 | €7.99 | £6.99 | ¥1,200 | A$11.99 | C$10.99 | ₹699 |
| $9.99 | €9.99 | £8.99 | ¥1,500 | A$14.99 | C$13.99 | ₹899 |
These aren't literal FX conversions — they're psychologically anchored price points per currency that align with local purchasing patterns. €4.99 feels the same to a French buyer as $4.99 does to a US buyer, even though the actual FX rate would put them ~15% apart.
Setting per-currency option fees
Use a Cart Transform Function to read the buyer's presentment currency and apply the matching fee:
const OPTION_FEES = {
photo_upload: { USD: 5.99, EUR: 5.99, GBP: 5.49, JPY: 900, AUD: 8.99 },
rush_production: { USD: 7.99, EUR: 7.99, GBP: 6.99, JPY: 1200, AUD: 11.99 },
gift_wrap: { USD: 3.99, EUR: 3.99, GBP: 3.49, JPY: 500, AUD: 5.99 },
};
export function run(input) {
const currency = input.cart.cost.totalAmount.currencyCode;
const operations = [];
input.cart.lines.forEach(line => {
const optionKey = line.attribute?.value;
if (!optionKey || !OPTION_FEES[optionKey]) return;
const fee = OPTION_FEES[optionKey][currency] || OPTION_FEES[optionKey].USD;
operations.push({
update: {
cartLineId: line.id,
price: { adjustment: { fixedPricePerUnit: { amount: fee.toFixed(2) }}}
}
});
});
return { operations };
}
Rounding rules by currency
Shopify Markets' rounding rules apply to base variants only. Set your option fees to match the visual patterns customers expect in each currency:
- USD, CAD, AUD, GBP: end in .99 or .49 (US-style psychological pricing)
- EUR: end in .99 or .95 (mixed — Germany prefers .95, France .99)
- JPY: whole hundreds (¥500, ¥900, ¥1,200) — Japan doesn't use fractional pricing
- INR: end in 99 (₹299, ₹499, ₹899) — three-digit precision
- SEK, NOK, DKK: whole tens or hundreds (Nordic countries phase out small-denomination coins)
Displaying the correct currency symbol
Shopify's {{ money }} Liquid filter respects the current presentment currency and formats it correctly. For personalization option prices rendered client-side (a "Photo upload +$5.99" badge), pass the presentment currency to your JS:
<script>
window.SHOPIFY_CURRENCY = {{ cart.currency.iso_code | json }};
window.SHOPIFY_MONEY_FORMAT = {{ shop.money_format | json }};
</script>
// JS
function formatMoney(amount) {
return new Intl.NumberFormat(navigator.language, {
style: 'currency',
currency: window.SHOPIFY_CURRENCY,
}).format(amount);
}
Tax-inclusive vs tax-exclusive display
EU countries require tax-inclusive pricing display. Your option fee shown on the product page as "+€4.99" must include VAT. If your Cart Transform stores the fee as €4.16 net and Shopify adds 20% VAT at checkout, the price the customer sees changes between product page and cart — which triggers cart abandonment. Store option fees as gross (VAT-inclusive) for EU markets and let Shopify's tax engine reverse-calculate the net for reporting.
FX rate refresh cadence
If you use auto-conversion for option fees (not recommended but supported), Shopify refreshes FX rates once per day at ~5am UTC. Merchants who set price points that only make sense at a specific FX rate get surprised when the daily refresh moves prices by 2-3%. Manual per-currency pricing eliminates this risk entirely.
Frequently asked questions
Does Shopify Markets support per-currency personalization option fees?
Not natively — Markets auto-converts option fees using yesterday's FX rate. To set psychologically anchored prices per currency (€4.99 instead of €4.63), use a Cart Transform Function that reads the presentment currency and applies matching per-currency fees.
Should I use auto FX or manual per-currency pricing for options?
Manual for anything customers see and evaluate — option fees, personalization add-ons, rush surcharges. Auto is fine for wholesale-only prices where FX precision matters more than psychological anchoring.
What rounding rule should I use per currency?
USD/CAD/AUD/GBP: .99 or .49 endings. EUR: .99 or .95 (regional preference). JPY: whole hundreds. INR: end in 99. SEK/NOK/DKK: whole tens. Match the local currency's cultural convention.
How do I display option prices in the correct currency symbol?
In Liquid, use the {{ money }} filter which respects presentment currency automatically. For client-side JS rendering, pass cart.currency.iso_code to the script and format with Intl.NumberFormat.
Does tax-inclusive pricing affect option fees in the EU?
Yes — EU regulations require product page prices to include VAT. Store your EU option fees as VAT-inclusive amounts in Cart Transform. Shopify's tax engine handles the net reverse-calc for reporting.
How often does Shopify refresh FX rates for auto-converted option fees?
Once per day, approximately 5am UTC, using the previous day's mid-market rate. This is why manual per-currency pricing is more predictable — auto-converted prices can shift 2-3% overnight.
Best Shopify app for per-currency option pricing?
Print It My Way — supports per-currency option fees via Cart Transform on all Shopify plans, no code required, VAT-inclusive display for EU markets.
Can I set different option fees for different markets (not just currencies)?
Yes — Cart Transform can read input.cart.buyerIdentity.market.handle and apply market-specific rules independently of currency. Useful when the same currency is used in multiple markets with different pricing (USD in US vs USD in international customers).
Related reading
- Multi-currency variants — variant-level per-currency pricing
- EU tax VAT options — VAT handling in the EU
- Per-market variants — market-specific SKUs
- Cart Transform Functions guide — developer reference
Try it free on Shopify
Print It My Way's permanent Free plan supports per-currency option pricing, VAT-inclusive display for EU markets, and market-aware Cart Transform rules.
Install Print It My Way