CurrencyCraft

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

Display-only mode: the switcher, the converted price, and the notice that tells the shopper which currency the charge will actually be in. The illustration shows a storefront header with a currency switcher set to INR, a product priced 10,636.99 rupees, and a dismissible notice reading "You will be charged in USD at checkout". Beside it are the four steps behind that figure: a base price of 128.00 US dollars, an example rate of 1 US dollar to 83.10 rupees, charm99 rounding, and the displayed result of 10,636.99 rupees. The rate is an example, not a live quote.

The question the app asks before it touches a price

Is Shopify Payments activated, and does a Market have local currencies switched on?

Why merchants pick this one

Every line below is something the code does today. Where a capability needs a paid plan, it says so in the same sentence.

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.

See the rest, and what each plan unlocks

The switcher your shoppers touch

Four presets for Mode B display conversion, set in the app. The switcher renders once at least two currencies are enabled, because a switcher with one option is not a switcher.

Read the outcome before you publish it

Live simulator

Country JP · currency any · market any

  • Currency shownJPY (forced by a rule, from Force a currency for country JP, priority 10)
  • Price shown¥19,800, converted from $128.00
  • Rate used154.6900 JPY per 1 USD (the live provider rate)
  • Roundingnearest (your JPY rounding rule)
  • Switchervisible (no rule changed it)
  • Currencies this visitor can chooseUSD, EUR, GBP, JPY
The simulator resolves a visitor through the same engine that answers your storefront, and names the rule that won each field, so you can read the outcome before you publish it. Rules and the simulator are part of the Pro plan. The rate above is an example, not a live quote.

Under the hood

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.

Two steps the app cannot do for you

Wrap your money format, in Mode B only

Under Settings, General, Currency formatting, your price has to be wrapped in a cc-money span, in both HTML fields. Shopify has no Admin API that writes those fields, so no app can do it for you. It is a paste that takes about a minute, the setup guide gives you the exact strings, and the app then reads your live formats back from Shopify and reports each field as done or not. In Mode A the wrapper is not merely unnecessary, it would set up a double conversion, so you are never asked for it there.

Switch on the app embed, in Mode B only

The theme app extension is enabled in the theme editor under App embeds, and the switcher block is placed in a section separately. Installing the app does neither. CurrencyCraft does not request the read_themes scope, so it cannot check this for you or turn it on: the setup guide asks you to confirm it. Skipping it is the most common reason a storefront shows no change at all.

Both are Mode B setup steps. For Mode A, use your theme's native country selector. The setup guide gives you the exact strings and where they go, and the same guide lives inside the app against your live settings.

Simple pricing

Free
$0
Up to 5 currencies, fiat
Growth
$4.99/mo
Unlimited fiat currencies
Pro
$9.99/mo
Rules, scheduling, crypto and metals

Billed through Shopify, on your Shopify invoice. Free is a plan, not a trial. Full comparison.

Try it on the free plan

Free plan, no expiry. The guide gives you the exact strings for the two steps Shopify makes you paste yourself, so you know what you are in for before you install.