Medusa v2 Pricing and Promotions
Before writing code
Fetch live docs:
- Web-search
site:docs.medusajs.com pricing modulefor pricing data model and service methods - Web-search
site:docs.medusajs.com price list rulesfor conditional pricing configuration - Web-search
site:docs.medusajs.com promotion modulefor promotion types and rules - Fetch
https://docs.medusajs.com/resources/references/pricingand review theIPricingModuleServiceinterface - Web-search
medusajs v2 tax module region 2026for latest tax calculation and region setup
Pricing Module Architecture
Entity Relationships
PriceSet
├── Prices[]
│ ├── amount (integer, minor units)
│ ├── currency_code
│ ├── min_quantity, max_quantity
│ └── Rules[] (region_id, customer_group_id)
└── MoneyAmounts[]
Module Links
Product Module (variant) ──link──> Pricing Module (price set)
Region Module ──link──> Pricing Module (price context)
Customer Group ──link──> Pricing Module (group pricing)
Fetch live docs for exact link definitions and how price sets connect to product variants.
Price Calculation
Resolution Flow
Customer Request
└─> Context: { region_id, currency_code, customer_group_id }
└─> Pricing Module: find best matching price
├── Check price lists (sale/override) with rules
├── Check variant prices with matching rules
└─> Return lowest applicable price
Pricing Context
| Context Field | Source | Effect | |---------------|--------|--------| | region_id | Cart region | Filters by region-specific prices | | currency_code | Region default | Determines currency | | customer_group_id | Customer profile | Enables group-specific pricing | | quantity | Line item qty | Enables quantity-based tiers |
Price Lists
Types
| Type | Description | Use Case | |------|-------------|----------| | sale | Discounted price (lower than default) | Seasonal sales, flash deals | | override | Replaces default price entirely | B2B/wholesale pricing |
Configuration
| Field | Type | Description | |-------|------|-------------| | title | string | Display name | | status | active/draft | Visibility | | type | sale/override | Price list behavior | | starts_at / ends_at | datetime | Scheduled activation window | | rules | object | Customer group, region conditions |
Key Service Methods
| Operation | Method | |-----------|--------| | Create price set | pricingModuleService.createPriceSets() | | Add prices | pricingModuleService.addPrices() | | Create price list | pricingModuleService.createPriceLists() | | Calculate price | pricingModuleService.calculatePrices() |
Fetch live docs for the full list of rule attributes and how to combine multiple rules.
Regions and Currencies
Region Model
| Field | Type | Description | |-------|------|-------------| | name | string | Display name (e.g., "North America") | | currency_code | string | Default currency (e.g., "usd") | | countries | relation | Countries in this region | | automatic_taxes | boolean | Auto-calculate taxes |
Region-Currency Mapping
| Region | Currency | Countries | |--------|----------|-----------| | North America | usd | US, CA | | Europe | eur | DE, FR, IT, ES... | | United Kingdom | gbp | GB |
- Each region has exactly one default currency
- Prices stored in minor units (cents): $10.00 =
1000
Tax Calculation
| Concept | Description | |---------|-------------| | Tax Region | Geographic area with tax rules | | Tax Rate | Percentage rate for a tax region | | Tax Line | Calculated tax for a line item | | Tax Provider | External service (TaxJar, Avalara) or built-in |
Tax Configuration
| Setting | Options | Description | |---------|---------|-------------| | automatic_taxes | true/false | Auto-calculate vs manual | | Tax-inclusive pricing | region setting | Prices include or exclude tax | | Tax provider | built-in or custom | Calculation engine |
Fetch live docs for tax provider interface and tax-inclusive pricing configuration.
Promotion Module
Promotion Types
| Type | Description | Example | |------|-------------|---------| | standard | Rule-based discounts | 10% off orders over $100 | | buyget | Buy-X-Get-Y promotions | Buy 2 get 1 free |
Promotion Structure
Promotion
├── code (optional coupon), type, is_automatic
├── ApplicationMethod
│ ├── type (percentage, fixed)
│ ├── allocation (each, across)
│ └── target_type (items, shipping, order)
└── Rules[] (attribute, operator, values)
Application Method Types
| Type | Allocation | Description | |------|------------|-------------| | percentage | each | % off each qualifying item | | percentage | across | % off total of qualifying items | | fixed | each | Fixed amount off each item | | fixed | across | Fixed amount off total |
Promotion Rules
| Rule Attribute | Operator | Description | |----------------|----------|-------------| | customer_group_id | in | Customer group membership | | currency_code | eq | Specific currency | | product_id | in | Specific products | | product_collection_id | in | Specific collections |
Fetch live docs for the complete list of rule attributes and how promotions stack.
Key Service Methods
| Operation | Method | |-----------|--------| | Create promotion | promotionModuleService.createPromotions() | | Compute actions | promotionModuleService.computeActions() | | List promotions | promotionModuleService.listPromotions() |
Best Practices
Pricing Strategy
- Store all prices in minor units (cents/pence) — never use decimals
- Create region-specific prices for multi-currency stores
- Use
saleprice lists for temporary discounts andoverridefor permanent B2B pricing
Promotions
- Use
is_automatic: truefor site-wide promotions (no coupon code needed) - Combine rules for targeted promotions (e.g., VIP customers + specific collections)
- Test promotion stacking behavior — multiple promotions may apply to the same cart
Tax and Performance
- Enable
automatic_taxesand configure tax regions for each country - Decide on tax-inclusive vs tax-exclusive pricing per region at setup time
Fetch the Medusa v2 pricing, promotion, and tax module documentation for exact service method signatures, rule configuration, and price resolution logic before implementing.