← Back to articles

June 3, 2026

9 min read

Multi-Region Ecommerce with Medusa: Zones, Currencies, and Taxes from Day One

How to configure regions, shipping zones, currencies, and taxes in Medusa to sell in multiple countries without refactoring later.

Leer en espanol

Why regions are the axis of the multi-country model

In Medusa, a region groups everything that varies by country or geographic zone: the currency, taxes, available payment providers, and fulfillment providers. A cart always belongs to a region, and that region determines which price is shown, which tax applies, and which shipping options appear at checkout.

Designing regions from the start of the project avoids the most painful refactor in ecommerce: adding multi-country support to a system that assumed a single currency and a single tax scheme. It is not just adding a country field — it means redefining how prices, totals, and inventory are calculated.

Configuring shipping zones and options per region

Shipping zones in Medusa define which countries can receive orders from a given region. A zone can have multiple countries and multiple shipping options — standard, express, pickup point. Each option has its own pricing logic: flat rate, weight-based, or managed by an external fulfillment provider.

The recommended pattern is to create one region per group of countries with the same tax scheme and currency. Mexico and Colombia can be separate regions even if both use Stripe, because their taxes and currencies differ. Grouping countries by cultural affinity alone, without fiscal justification, creates problems later.

Create a region with currency, tax, and first shipping option via Admin API.

const { region } = await medusaAdmin.regions.create({
  name: 'Mexico',
  currency_code: 'mxn',
  tax_rate: 16,
  payment_providers: ['stripe'],
  fulfillment_providers: ['manual'],
  countries: ['mx'],
});

await medusaAdmin.shippingOptions.create({
  name: 'Standard Shipping',
  region_id: region.id,
  provider_id: 'manual',
  data: {},
  price_type: 'flat_rate',
  amount: 9900,
});

Currencies, taxes, and region-differentiated prices

Each region has a base currency and a general tax rate. The tax can be overridden per product category or through an external tax provider like TaxJar for the US, where each state has its own rules.

Variant prices are defined per currency, not per region. If a variant costs 450 MXN and 25 USD, those are two separate price entries. Medusa selects the correct price based on the cart region currency. If no price exists in the region currency, Medusa indicates this in the response and checkout cannot proceed.

  • Define prices in all currencies used by your regions before publishing a product.
  • Use PriceLists for regional promotions without modifying the base price.
  • The tax_inclusive field controls whether the displayed price includes VAT.

Common mistakes when setting up multi-region

The most common mistake is creating one global region to skip initial configuration and then trying to split it as the business grows. When that happens, historical orders stay in the original region and prices must be migrated manually.

Another frequent mistake is assuming inventory is global. Medusa manages inventory at the variant level. If you sell from different warehouses, you need the Inventory module with multiple stock locations to reserve stock per warehouse and per region.

More articles

Back to articles