Medusa v2 Pricing and Promotions
Before writing code
Fetch live docs:
- Web-search
site:docs.medusajs.com pricing module for pricing data model and service methods
- Web-search
site:docs.medusajs.com price list rules for conditional pricing configuration
- Web-search
site:docs.medusajs.com promotion module for promotion types and rules
- Fetch
https://docs.medusajs.com/resources/references/pricing and review the IPricingModuleService interface
- Web-search
medusajs v2 tax module region 2026 for 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
sale price lists for temporary discounts and override for permanent B2B pricing
Promotions
- Use
is_automatic: true for 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_taxes and 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.