June 3, 2026
10 min read
Catalog Modeling in Medusa.js: Variants, Regions, and Prices That Scale
How to structure products, variants, and prices in Medusa to handle multiple sizes, colors, regions, and currencies without overcomplicating the data model.
Leer en espanolThe data structure of a catalog in Medusa
In Medusa, a catalog is organized in three layers: Product, ProductVariant, and PriceList. A Product is the root concept — a t-shirt, a course, a service. ProductVariants are the specific purchasable versions — t-shirt size M color black, t-shirt size L color white. PriceLists allow assigning different prices by region, currency, or customer segment.
Variants are the inventory unit: each variant has its own SKU, its own stock, and its own base price. The frontend displays the product; the cart adds variants. This separation allows a product with 20 size-and-color combinations to be a single object in the catalog without duplicating product information.
Products and variants: options, values, and SKUs
A product options define the dimensions of variation: Size, Color, Material. Values are the concrete choices: S, M, L for Size; Black, White for Color. Medusa generates the full option set; the catalog stores them as individual variants, not as combinations of nested objects.
Each variant needs a unique SKU. The SKU is the operational identifier: it appears on shipping labels, in inventory, and in reports. A well-formed SKU includes the product code plus the option values — for example, TEE-M-BLK for a medium black t-shirt. That convention makes reconciliation between Medusa and external systems straightforward.
Creating a product with variants and multi-currency prices via the Medusa Admin API.
const product = await medusaAdmin.products.create({
title: 'Classic T-shirt',
status: 'published',
options: [
{ title: 'Size' },
{ title: 'Color' },
],
variants: [
{
title: 'S / Black',
sku: 'TEE-S-BLK',
inventory_quantity: 50,
options: [{ value: 'S' }, { value: 'Black' }],
prices: [
{ currency_code: 'mxn', amount: 45000 },
{ currency_code: 'usd', amount: 2500 },
],
},
{
title: 'M / Black',
sku: 'TEE-M-BLK',
inventory_quantity: 80,
options: [{ value: 'M' }, { value: 'Black' }],
prices: [
{ currency_code: 'mxn', amount: 45000 },
{ currency_code: 'usd', amount: 2500 },
],
},
],
}); Prices by region and price lists
Medusa manages prices through two mechanisms: the base price of each variant (associated with a currency) and PriceLists (which allow alternative prices under specific conditions). A PriceList can represent a temporary promotion, a wholesale customer price, or a region-differentiated price.
The price Medusa returns to the frontend is already calculated considering the cart region and active PriceLists. There is no need to calculate prices on the frontend or make extra API calls. If a variant price in MXN differs from another region, model it with a PriceList for that region — do not duplicate the variant.
- The variant base price is per currency, not per region.
- Use PriceLists for segmented prices, not for base prices.
- A region can have multiple currencies; Medusa applies the one on the cart.
Categories, collections, and search that scale
Medusa has two ways to group products: ProductCategory and ProductCollection. Categories are hierarchical (Clothing > T-Shirts > Basics) and used for structured navigation. Collections are flat and editorial (Summer 2026 Collection, Featured) and used for campaign pages or special filters.
For search, Medusa integrates natively with MeiliSearch and Algolia through plugins. The plugin indexes products automatically when they are created or updated. For large catalogs — more than 10,000 variants — an external search engine is essential; relying on the basic Medusa search endpoint has performance limits that appear earlier than expected.
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