Shopify multi-currency
Most currency apps convert everything.
This one knows when not to.
CurrencyCraft reads your Shopify setup before it touches a price. Where Shopify Payments and Markets already price and charge locally, it converts nothing, because multiplying an already localised price by a second rate gives a number that matches neither Shopify nor the shopper's card statement. Everywhere else it converts what shoppers see, and names the currency the charge will actually land in.
CurrencyCraft is preparing its public App Store listing. If you already have access, open it from Apps in your Shopify admin.
Free plan with no expiry · 30-day trial on new paid subscriptions · Two setup steps you paste yourself
It knows when not to convert
Applying an app's own exchange rate on top of a Shopify Markets price converts an already converted number.
Detection reads your Shopify Payments account and your Markets first. Where Markets already prices locally, CurrencyCraft converts nothing and hides its picker. Use your theme's native country selector; the app does not change Markets prices or checkout currency.
Targeting, not one global setting
One store-wide rate and one store-wide rounding is fine right up to the point where you want Japan on whole yen and nobody else touched.
Five rule types across four targeting levels, resolved deterministically: market beats country beats currency beats global, then the higher priority, then the lowest rule id. Rules are on Pro and above.
You see the answer before you publish it
The usual way to test a currency rule is to save it, open the storefront in another tab and hope.
The simulator resolves a country, market and currency through the same engine that answers your storefront, prints the converted sample price, and names the rule that won each field. Pro and above.
A free plan, not a countdown
A trial is not a free tier. When it ends, a small store loses the switcher it just taught its customers to use.
Free is a real plan at $0 with no expiry: up to 5 currencies with the Mode B display picker, failover rates and rounding. Paid plans raise the cap and add Mode B conversion targeting.
Failover before the shopper notices
Providers are tried in order, each behind its own circuit breaker: repeated failures open it, it is skipped for a cooldown, then one probe decides whether to close it. If the whole chain is down, the last good rate board is served and flagged stale. If even that is unusable, the price stays in your base currency.
Never 0, never NaN
Zero, null and non-numeric rates are dropped at one choke point before they can reach the cache or the storefront, rather than being coerced. A rate of 0 would display a product as free, so the code refuses it and shows the base-currency figure instead.
Rounding that respects the currency
Nearest, up, down, charm99, charm95 and charm00, applied after conversion. Decimal places come from the ISO 4217 table, so JPY renders with none and KWD with three. Charm endings mean nothing on a zero-decimal currency, so they degrade to nearest whole rather than inventing a .99.
Your rate, if you want it
A markup percentage per currency absorbs payment spread, or pin an exact rate and the app stops following the provider for that currency. Precedence is fixed: a targeted rate override rule beats a manual rate, which beats a markup, which beats the raw provider rate.
No layout shift, by construction
Prices are cloaked before first paint with their layout box kept, converted in place, then revealed together, so nothing jumps under the cursor. A MutationObserver batched on animation frames catches prices added later by a quick view, a cart drawer or infinite scroll.
Guided theme setup
The setup guide covers the currency-format wrapper and theme app embed. In display-only mode, a checkout notice tells shoppers the currency Shopify will actually charge.