Markets — multi-currency, FX & margin policy
How per-market margin policy overrides your global floor, where exchange rates come from, and why a stale rate blocks a consolidated roll-up instead of guessing.
Show all sections (17)
- Where exchange rates come from
- Why a roll-up can refuse to answer
- Converted versus native figures
- Market-gap bounds
- Verify it is working
- Troubleshooting
- My per-market policy has no effect
- A consolidated report will not load
- Numbers do not match between the consolidated and single-market views
- FAQ
- How many markets can I track?
- Can I set a different price per market?
- Does changing my base currency rewrite history?
- Related articles
Selling into more than one market means the same product carries different prices, different margins and different competition. Markets lets you set policy per market instead of forcing one global rule onto all of them. It is also the area where we have shipped bugs ourselves more than once — which is a fair signal that the mechanism is worth reading about before configuring it.
Estimated time: 5 minutes
What you'll accomplish
- Understand the two-step cascade that decides which margin policy applies
- Know where exchange rates come from and how fresh they are
- Understand why a consolidated report can refuse to produce a number
- Know which figures are converted and which are shown natively
Requirements
- Plan: Enterprise for unlimited markets. Free, Growth and Pro track 1 market.
- Found at Settings → Markets.
The margin policy cascade
When a discount is evaluated for a product in a specific market, the policy is resolved in strict order:
- A per-market margin policy for that (merchant, market) pair, if one exists and is active → use it.
- Otherwise, your global margin policy → use that.
There is no third step and no blending. An inactive per-market policy is the same as no policy — the global one applies. This is worth stating because "I set a policy for Germany and nothing changed" is almost always an inactive row rather than a broken cascade.
Everything in Margin Protection — the floor, the clamping behaviour, the outcomes — then applies exactly as normal, just against whichever floor the cascade selected.
Where exchange rates come from
Rates are sourced from the European Central Bank's published feed and refreshed on a daily schedule. They are reference rates, not the rate your payment processor gave you on any individual order — a distinction that matters if you reconcile to the cent against your bank.
Why a roll-up can refuse to answer
Consolidated, cross-market figures need a conversion, and a conversion is only as good as the rate behind it. Two freshness rules apply:
- Rates older than 36 hours are flagged as stale in Settings → Data & Sync, so you can see a feed problem before it affects anything.
- A rate more than 7 days stale will not be used for a consolidated roll-up at all. Instead of quietly converting at a week-old rate, the roll-up declines and tells you which currency pair is the problem.
This is deliberate. A report that silently used a stale rate would be wrong in a way nobody could see; one that refuses is wrong in a way you can fix.
Converted versus native figures
- Consolidated views (all markets together) convert to your base currency using the rate stamped at the time of attribution, not today's rate. This is why a closed period's numbers never move afterwards — see ROI Dashboard Methodology.
- Single-market views show that market's own currency, with no conversion at all.
If a number looks different between the two views, that is the expected behaviour, not a discrepancy: one is your base currency, the other is local.
Market-gap bounds
Markets can also carry market-gap bounds — do not undercut the local market by more than X% and do not stay more than X% above it after discounting. These interact with your margin floor, and the resolution is not negotiable: the margin floor always wins. A market ceiling can deepen a discount, but never past the floor.
Verify it is working
- Open Settings → Markets and confirm each market you sell into is present and its policy is marked active.
- Open Settings → Data & Sync and check FX freshness — anything past 36 hours is flagged there.
- Apply a test discount to a product in a market with an override and confirm the preview uses the override's floor, not the global one.
Troubleshooting
My per-market policy has no effect
Check that the policy row is active. An inactive override falls through to the global policy silently by design.
A consolidated report will not load
Read the message — it names the currency pair whose rate is more than 7 days stale. The fix is the FX feed, not the report.
Numbers do not match between the consolidated and single-market views
Expected. The consolidated view is converted to your base currency at attribution-time rates; the single-market view is native.
FAQ
How many markets can I track?
Enterprise is unlimited. Free, Growth and Pro track one market. See Plan Limits & Usage.
Can I set a different price per market?
Pricing is set on your commerce platform. StockSweep applies discounts and enforces margin policy against the price the platform holds for that market.
Does changing my base currency rewrite history?
No. Historical figures keep the base amount stamped when they were attributed.
Related articles
Was this article helpful?
Let us know — your feedback helps us improve our documentation.