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 espanolWhy 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 articlesPayment Platforms in Mexico: Stripe, Conekta, Mercado Pago, and OpenPay
A technical and commercial comparison of the four most-used payment platforms for digital projects in Mexico.
June 3, 2026
7 min read
Shipping Platforms in Mexico: Skydropx, EnviosPerros, Pakke, and Enviame
How to choose between the main shipping aggregators for ecommerce in Mexico based on your volume, operations, and technical needs.
June 3, 2026
7 min read
Headless CMS in 2026: PayloadCMS, Strapi, Sanity, and Directus
Which headless CMS to choose based on project type, the level of technical control you need, and how you plan to model your content.
June 3, 2026
8 min read