SeriesPart 6 of Commerce architecture in practiceView the cluster →
Medusa & ArchitectureArticle

How we added market-specific minimum-spend promotions to Medusa v2

The client needed one campaign to use deliberate minimum-spend rules in every currency and the correct definition of basket value. Standard Medusa behaviour did not cover that exact requirement, so we extended it.

We Are Souk article cover: How we added market-specific minimum-spend promotions to Medusa v2
Souk EngineeringCommerce architectureAug 2026·5 min read
Key takeaways
  • A promotion threshold needs one amount per supported currency.
  • Missing market values must block activation rather than fall back silently.
  • Thresholds should use the same market price and tax rules customers see.
  • Legacy promotions need an explicit migration path.
  • This was project-specific work, not a feature we claim exists in standard Medusa.

The promotion rule the client could not express safely

The client needed campaign managers to decide both which basket amount counts—before or after tax, with or without shipping—and the threshold for every active currency. Copying one numeric threshold across markets would change the commercial offer. Converting it live would make the campaign move without an editorial decision.

We built a project-specific rule layer, backend endpoint and Admin widget around Medusa’s promotion model. Each cart is evaluated against the threshold chosen for its own currency, while the campaign team remains in control of the commercial offer in every market.

The business rule that breaks at the border

A merchant creates a promotion: spend at least €100 and receive 10% off. The shop also sells in pounds and Swiss francs. If the software stores only the number 100, should a British customer qualify at £100? That is not equivalent to €100. Should the checkout convert the cart back to euros using today’s rate? That can make eligibility move from one hour to the next and makes campaign reporting difficult.

The client needed the promotion itself to carry the intended threshold for every active currency: for example €100, £85 and CHF95. These amounts are commercial decisions, not necessarily live mathematical conversions. A campaign manager can choose market-appropriate values and know exactly what customers will see during the campaign.

Why one number creates real commercial risk

A threshold that is too low gives away margin. One that is too high makes a campaign ineffective or misleading. Silent fallback is especially dangerous: a newly opened market may inherit a number that looks valid but has the wrong currency meaning. The promotion appears configured while customers receive a materially different offer.

Taxes also affect the rule. Does ‘spend £85’ refer to the amount including VAT, excluding VAT, before discounts or after eligible discounts? Shipping and gift cards may or may not count. The answer must match the wording shown to customers. A multi-currency data structure cannot rescue an ambiguous promotion policy; it only gives that policy a place to be expressed.

What the campaign manager configures

The Admin interface lists every currency supported by the store and asks for a positive threshold in each one. A promotion cannot be enabled while a currency is missing. When the store adds a new currency, existing multi-currency promotions visibly become incomplete instead of pretending that a threshold exists.

The saved rule uses explicit currency codes and amounts in the smallest currency unit. This avoids decimal ambiguity and makes validation straightforward. The interface can show helpful reference conversions, but it should not silently replace the merchant’s chosen value when rates move. Promotion amounts normally remain stable for the campaign period unless someone deliberately edits them.

How the checkout decides whether the customer qualifies

At checkout, Medusa already knows the cart’s active market and currency. The promotion evaluator selects the threshold for that currency and compares it with the defined eligible cart amount. If the cart uses a currency absent from the rule, the promotion does not apply and the configuration error is reported. It does not borrow the euro number or guess a conversion.

The calculation should use the same price representation that customers see. Tax-inclusive markets, existing discounts, excluded products and returns all affect the meaning of the total. Boundary tests matter: one cent below the threshold, exactly equal and one cent above. A promotion that appears at £84.99 because two parts of the system round differently damages trust even when the monetary difference is tiny.

Keep the extension maintainable

This project-specific capability extended the promotion behaviour available in the Medusa version used for the build. The rule, configuration shape and automated checks were kept explicit so a framework upgrade could not silently change the campaign logic.

Customising a core promotion mechanism creates maintenance ownership. An upgrade test must fail loudly if the extension point changes, the business rule must remain documented and the team needs a migration path when the platform evolves. That turns the customisation into a durable asset rather than a hidden dependency.

How to introduce the rule without breaking old campaigns

Existing promotions may contain one numeric threshold. The importer or evaluator can continue reading that legacy form while new promotions use the currency map, but compatibility must be visible. Before rollout, inventory active campaigns and decide the correct value for each market. Do not generate values silently and call the migration complete.

A safe rollout evaluates representative carts with both old and new rules and reports differences before activation. Campaign owners review those differences, then publish deliberately. Once old promotions have ended or migrated, remove the compatibility path. Otherwise two meanings remain in the system indefinitely, and future teams cannot tell which rule an old campaign follows.

A promotion checklist for multi-market teams

For every campaign, define eligible amount, tax basis, treatment of existing discounts, products included, currency thresholds and rounding. Require a value for every active currency. Show configuration gaps in Admin and reject unknown currencies. Test cart changes, address changes, refunds, stacked promotions and exact threshold boundaries.

Also record whether the behaviour is native, configured or custom code. That helps the business understand maintenance risk. The core lesson is simple: currency is part of the rule, not decoration beside a number. Once that is explicit, campaign managers can make deliberate market decisions and the checkout can apply them consistently.

FAQ

Common questions

Why not convert one euro threshold at checkout?

Live conversion makes campaign eligibility move with exchange rates and may not match market strategy. Explicit amounts keep the offer stable and understandable.

What happens when a new currency is added?

Existing multi-currency promotions should be marked incomplete until a campaign owner supplies and approves the new threshold.

Is this feature built into standard Medusa v2?

This article describes a project-specific extension found in a historical branch. It should not be presented as a native Medusa capability.

Read next
Keep the useful ideas coming

One practical commerce field note at a time.

Join the WeAreSouk journal for grounded stories about Medusa, Shopify, AI, integrations and the systems behind serious commerce.

Working on a similar problem?Bring us the business constraint. We’ll help map the system behind it.Talk to Souk →
Souk AI · online now

Turn the article into an implementation plan.

Ask how this applies to your store, your stack, or your current bottleneck.

01 Describe your current setup.02 Name the workflow or signal that feels unreliable.03 Get a practical first architecture back.
I can help map this article to your stack. Tell me what you sell, what platform you use, and where the medusa & architecture question hurts.
Continue the cluster

Commerce architecture in practice

Start a conversation

Tell us what commerce needs to do for your business.

No scheduling maze. Send the context, the constraint or the idea. We will read it and come back to you directly.