Shopify sales across Markets: which currencies follow
How Shopify builds a price for each market, which of those steps your sale actually changes, why fixed per-market prices sit still, and how to read the new pricing audit trail.
By Beacon Wave Studio · · 9 min read
A merchant in Amsterdam put her whole store at 25% off for a weekend. Dutch customers saw it. German customers saw it. Her Swiss customers, who pay in francs, saw the same prices they had seen on Thursday, and one of them wrote in to ask whether the sale was “Europe only”. It was not meant to be. Nothing was broken. The Swiss market simply had its own prices, and a sale that changes the store price has no opinion about prices that were never derived from it.
This post walks through how Shopify assembles the number a shopper in a given country sees, which parts of that chain a sale touches depending on how you run it, and how to check the result without asking a friend abroad. It leans on Shopify’s own documentation for the platform side and on how SafeSale behaves for the app side.
A market price is a chain, not a field
When you sell in one currency, a variant has a price and that is the end of it. Once you add markets, the price a visitor sees is the result of a short sequence of steps, and Shopify’s help centre describes them plainly. If the market takes its prices from the store price, Shopify converts the price by multiplying it by the exchange rate, adds the currency conversion fee, and then applies the rounding rules for that currency if you have turned them on. Somewhere in that sequence sits the optional percentage price adjustment you may have set on the market’s catalog, which by default applies to compare-at prices as well.
The alternative is a fixed price. A catalog can hold an explicit price for a variant in the market’s currency, entered by hand or by CSV. A fixed price is not calculated from anything; it replaces the chain. That single distinction, derived versus fixed, decides whether your sale appears in a market at all.
| Step | Derived price | Fixed price |
|---|---|---|
| Starting point | Store price of the variant | Price you typed for this market |
| Exchange rate and fee | Applied | Not applied |
| Market percentage adjustment | Applied if set | Not applied |
| Rounding rules | Applied if on | Not applied |
| Reacts to a change in the store price | Yes, immediately | No |
What a price rewrite changes, market by market
SafeSale offers two ways to run a sale, and they touch this chain at different points. A price rewrite edits the variant’s stored price and writes the old price into compare-at, keeping a snapshot so it can put everything back at the end. In a market that derives its prices, the new store price flows through the same conversion, adjustment and rounding as before, and the sale appears everywhere at once, in local currency, with a struck-through compare-at that has been converted by the same rules. This is the case the Amsterdam merchant expected, and it is what her Dutch and German customers got.
In a market with fixed prices, the rewrite changes nothing the shopper can see. The store price moved; the fixed price did not, because it was never linked to the store price. SafeSale does not read or edit Markets price lists, on purpose: those prices are yours, typed for a reason, and an app quietly overwriting them would be worse than an app leaving them alone. What you should expect from the app is the preview telling you the store-currency result for each variant, and what you should do yourself is open the market’s catalog and decide whether its fixed prices need a sale of their own.
There is a quieter side effect worth knowing. Rounding to .99 or .95 is a SafeSale rule applied to the store price. Once that price is converted, the ending is whatever the exchange rate produces, unless Shopify’s rounding rules are switched on for the market, in which case Shopify rounds to the common ending for that currency. A tidy 39.99 at home can be a perfectly legitimate 43.17 abroad. If that bothers you, the fix is in Markets, not in the sale.
What an automatic discount changes
The other mechanism leaves prices alone. SafeSale registers an automatic discount backed by a Shopify Function; the function runs on the cart and returns the reduction for each targeted line. The line it sees is already in the shopper’s currency, because the cart is. So the discount applies after every step of the chain, derived or fixed, and the Swiss shopper gets the sale too, priced in francs, with no catalog edits.
This is where the kind of rule matters. A percentage is currency-agnostic: 25% of a price in francs is a number of francs. SafeSale passes a plain percentage to Shopify as exactly that, and the checkout does the arithmetic in the shopper’s currency. A fixed amount off or a fixed sale price is a bare number. The value you type as 10.00 in the sale editor is 10.00 in your store currency, and the function applies that number against the line price in the currency the cart happens to be in. In a market whose currency is far from yours, that is either a much larger or a much smaller discount than you meant. For multi-currency stores, run amount rules only where a market shares your currency, and use percentages for everything else.
One pleasant consequence of the same mechanics: when you attach rounding to a percentage rule, the function computes the rounded sale price from the line’s own price and returns the exact reduction needed. The shopper in Zürich lands on a .99 or .95 in francs, not a converted approximation of a .99 in euros. It is the one place where the discount route gives you neater endings abroad than a rewrite does.
| Market pricing | Price rewrite | Automatic discount, percent | Automatic discount, amount |
|---|---|---|---|
| Derived from store price | Yes, converted with compare-at | Yes, in local currency | Yes, but the amount is not converted |
| Fixed prices in a catalog | No change visible | Yes, in local currency | Yes, but the amount is not converted |
| Shows a struck-through price on the product page | Yes | Only at checkout unless the theme renders it | Only at checkout unless the theme renders it |
Reading the breakdown, in the admin and now in the API
Shopify has for some time let you see how a market price was built: in the market’s catalog, the product list shows prices in the market’s currency and you can click a price to view how it is calculated. Until this month that view was a human-only affair. The 2026-10 API version adds an auditTrail to ProductVariantContextualPricing, returning the ordered list of adjustments Shopify applied, each with a type (addition, multiplication or replacement), the value used, the price after that step and a readable label. If the trail cannot be produced completely, the list comes back empty rather than partial.
The interesting word in that list is “replacement”. A fixed catalog price shows up as a replacement step, which is the machine-readable version of everything in this post: the chain was cut and a typed number was put in its place. If you build reports or feed prices to another channel, that field is the honest source for “what does a shopper in this country actually pay”, and it is what we will use when SafeSale gains per-market previews.
Before you launch a sale into several markets
- List your markets and, for each, note whether the products in the sale have fixed prices or derived prices. The catalog’s product list shows which products a catalog covers; a market with no catalog of its own derives everything.
- If any market has fixed prices for products in the sale, decide now: run the sale as an automatic discount so it reaches that market at checkout, or plan a catalog edit for the sale window and its reversal afterwards. Do not assume a rewrite will get there.
- Choose percentage rules unless every market shares your currency. Check the sale editor’s summary: a rule shown as an amount is the one to reconsider.
- Preview in the sale editor and read the store-currency result per variant, including the compare-at that will be written. SafeSale warns when the result rounds to zero, exceeds your confirmation threshold or would replace an existing compare-at; those warnings are about the store price, and every derived market inherits them.
- After the sale goes live, open one product in the market’s catalog and click its price. If the breakdown starts from your new store price, the market is following. If it shows a fixed price, you are looking at the Swiss case.
- At the end, let the snapshot revert the store price and confirm the derived markets have followed it back. Fixed prices you edited by hand need to be put back by hand, so put the reminder in the same calendar entry as the sale’s end.
None of this is a reason to avoid selling in several currencies. It is a reason to know, before the weekend starts, which of your prices are calculated and which are typed. SafeSale will change the ones it is allowed to change and put them back; the typed ones are a decision only you can make.
Frequently asked questions
Why does my Shopify sale not show in another country?
Most often because that market has fixed prices for the product in a catalog. A fixed price replaces the store price rather than being derived from it, so a sale that rewrites the store price leaves the fixed price untouched. Either update the fixed prices for the sale window or run the sale as an automatic discount, which applies at checkout in every currency.
Does a percentage discount work the same in every currency on Shopify?
Yes. A percentage is applied to whatever the shopper's price is, so 20% off is 20% off in euros, dollars or yen. Fixed amounts are different: a value like 10.00 is a number, not a currency, and it means different things once the cart is in another currency. For stores selling in several currencies, percentage rules are the safe default.
Does a sale price get converted and rounded again for each market?
If the market derives its prices from the store price, yes. Shopify multiplies the store price by the exchange rate, adds its conversion fee, applies any percentage adjustment you set for the market and then applies rounding rules if you switched them on. A sale price of 39.99 in the store currency will not end in .99 abroad unless Shopify's own rounding for that currency makes it so.
How can I see exactly how Shopify calculated a price in a market?
In the admin, open Markets, pick the market's catalog and click a product's price to see the breakdown. From API version 2026-10, apps can also read the same information through the auditTrail field on ProductVariantContextualPricing, which lists each adjustment in the order Shopify applied it.