Medusa v2 Cart and Checkout
Before writing code
Fetch live docs:
- Web-search
site:docs.medusajs.com cart module for cart data model and service methods
- Web-search
site:docs.medusajs.com checkout flow for the end-to-end checkout process
- Web-search
site:docs.medusajs.com sales channel for sales channel scoping
- Fetch
https://docs.medusajs.com/resources/references/cart and review the ICartModuleService interface
- Web-search
medusajs v2 cart workflow 2026 for latest cart-related workflow steps
Cart Lifecycle
Flow
Create Cart ──> Add Line Items ──> Set Address
──> Select Shipping ──> Init Payment ──> Complete
Cart States
| State |
Description |
| Active |
Cart is open, items can be added/removed |
| Completing |
Checkout in progress, payment being processed |
| Completed |
Cart converted to order, no further modifications |
Cart Data Model
| Entity |
Key Fields |
| Cart |
region_id, customer_id, sales_channel_id, email |
| LineItems[] |
variant_id, quantity, unit_price, Adjustments[] |
| ShippingMethods[] |
shipping_option_id, amount, data |
| Addresses |
shipping_address, billing_address |
| PaymentCollection |
PaymentSessions[] |
Module Architecture
| Link Target |
Purpose |
| Product Module |
Variant resolution |
| Region Module |
Currency, tax rules |
| Sales Channel Module |
Storefront scoping |
| Promotion Module |
Discount application |
| Payment Module |
Payment sessions |
| Fulfillment Module |
Shipping methods |
Fetch live docs for cross-module link definitions and remoteQuery usage for cart enrichment.
Checkout Steps
Step 1: Create Cart
// Skeleton: create cart in storefront
// Fetch live docs for createCartWorkflow input
const cart = await createCartWorkflow(container)
.run({ input: { region_id, sales_channel_id } })
// Fetch live docs for required vs optional fields
Step 2: Add Line Items
| Workflow |
Purpose |
addToCartWorkflow |
Add variant + quantity to cart |
updateLineItemInCartWorkflow |
Update quantity of existing item |
deleteLineItemsWorkflow |
Remove items from cart |
Step 3: Set Addresses
| Field |
Required |
Notes |
first_name / last_name |
Yes |
|
address_1 |
Yes |
Street address |
city |
Yes |
|
country_code |
Yes |
ISO 2-letter code |
postal_code |
Conditional |
Required by region |
province |
Conditional |
State/province |
Step 4: Select Shipping Option
Available options determined by cart region, shipping address, and shipping profiles.
| Workflow |
Purpose |
listShippingOptionsForCartWorkflow |
Fetch available options |
addShippingMethodToCartWorkflow |
Apply selected shipping option |
Step 5: Initialize Payment
| Workflow |
Purpose |
createPaymentCollectionForCartWorkflow |
Create payment collection |
initializePaymentSessionWorkflow |
Start provider-specific session |
Step 6: Complete Cart
| Workflow |
Purpose |
completeCartWorkflow |
Convert cart to order |
Completion validates: all items in stock, shipping selected, payment authorized, email set.
Fetch live docs for the exact validation checks performed during cart completion.
Sales Channels
| Concept |
Description |
| Sales Channel |
Named storefront scope (e.g., "Web", "Mobile App", "B2B") |
| Publishable API Key |
Associates Store API requests with a sales channel |
| Product-Channel Link |
Products published to specific channels |
- Each cart belongs to one sales channel
- Store API requests must include
x-publishable-api-key header
- Products not linked to the cart's channel are unavailable
Fetch live docs for publishable API key configuration and sales channel management.
Store API Routes
| Route Pattern |
Method |
Purpose |
/store/carts |
POST |
Create cart |
/store/carts/:id |
GET |
Retrieve cart |
/store/carts/:id |
POST |
Update cart (email, address) |
/store/carts/:id/line-items |
POST |
Add line item |
/store/carts/:id/line-items/:item_id |
POST/DELETE |
Update/remove line item |
/store/carts/:id/shipping-methods |
POST |
Add shipping method |
/store/carts/:id/payment-collections |
POST |
Create payment collection |
/store/carts/:id/complete |
POST |
Complete checkout |
Fetch live docs for request body shapes and response formats on each route.
Best Practices
Cart Management
- Always create carts with a
region_id -- it determines currency, tax rules, and shipping
- Use
sales_channel_id to scope product availability per storefront
- Store custom checkout data in cart
metadata (e.g., gift messages, notes)
Checkout Flow
- Validate addresses before shipping option selection -- options depend on the destination
- Re-fetch shipping options after address changes (available options may differ)
- Initialize payment sessions only after shipping is selected (total must include shipping)
- Handle cart completion errors gracefully -- display specific validation failures to the user
Performance
- Use
remoteQuery to enrich cart data (product details, images) in a single query
- Cache shipping options per region + address combination to reduce API calls
Security
- Never expose payment session secrets to the client
- Validate cart ownership (customer or anonymous session) on every mutation
- Use publishable API keys to enforce sales channel scoping
Fetch the Medusa v2 cart module documentation and checkout workflow references for exact service method signatures, workflow inputs, and validation rules before implementing.
1---2name: medusa-cart-checkout3description: Implement Medusa v2 cart and checkout — cart lifecycle, line items, shipping and payment selection, sales channels, and checkout completion flow. Use when building cart and checkout features.4---56# Medusa v2 Cart and Checkout78## Before writing code910**Fetch live docs**:111. Web-search `site:docs.medusajs.com cart module` for cart data model and service methods122. Web-search `site:docs.medusajs.com checkout flow` for the end-to-end checkout process133. Web-search `site:docs.medusajs.com sales channel` for sales channel scoping144. Fetch `https://docs.medusajs.com/resources/references/cart` and review the `ICartModuleService` interface155. Web-search `medusajs v2 cart workflow 2026` for latest cart-related workflow steps1617## Cart Lifecycle1819### Flow2021```22Create Cart ──> Add Line Items ──> Set Address23 ──> Select Shipping ──> Init Payment ──> Complete24```2526### Cart States2728| State | Description |29|-------|-------------|30| Active | Cart is open, items can be added/removed |31| Completing | Checkout in progress, payment being processed |32| Completed | Cart converted to order, no further modifications |3334## Cart Data Model3536| Entity | Key Fields |37|--------|------------|38| **Cart** | region_id, customer_id, sales_channel_id, email |39| **LineItems[]** | variant_id, quantity, unit_price, Adjustments[] |40| **ShippingMethods[]** | shipping_option_id, amount, data |41| **Addresses** | shipping_address, billing_address |42| **PaymentCollection** | PaymentSessions[] |4344### Module Architecture4546| Link Target | Purpose |47|-------------|---------|48| Product Module | Variant resolution |49| Region Module | Currency, tax rules |50| Sales Channel Module | Storefront scoping |51| Promotion Module | Discount application |52| Payment Module | Payment sessions |53| Fulfillment Module | Shipping methods |5455> **Fetch live docs** for cross-module link definitions and `remoteQuery` usage for cart enrichment.5657## Checkout Steps5859### Step 1: Create Cart6061```ts62// Skeleton: create cart in storefront63// Fetch live docs for createCartWorkflow input64const cart = await createCartWorkflow(container)65 .run({ input: { region_id, sales_channel_id } })66// Fetch live docs for required vs optional fields67```6869### Step 2: Add Line Items7071| Workflow | Purpose |72|----------|---------|73| `addToCartWorkflow` | Add variant + quantity to cart |74| `updateLineItemInCartWorkflow` | Update quantity of existing item |75| `deleteLineItemsWorkflow` | Remove items from cart |7677### Step 3: Set Addresses7879| Field | Required | Notes |80|-------|----------|-------|81| `first_name` / `last_name` | Yes | |82| `address_1` | Yes | Street address |83| `city` | Yes | |84| `country_code` | Yes | ISO 2-letter code |85| `postal_code` | Conditional | Required by region |86| `province` | Conditional | State/province |8788### Step 4: Select Shipping Option8990Available options determined by cart **region**, **shipping address**, and **shipping profiles**.9192| Workflow | Purpose |93|----------|---------|94| `listShippingOptionsForCartWorkflow` | Fetch available options |95| `addShippingMethodToCartWorkflow` | Apply selected shipping option |9697### Step 5: Initialize Payment9899| Workflow | Purpose |100|----------|---------|101| `createPaymentCollectionForCartWorkflow` | Create payment collection |102| `initializePaymentSessionWorkflow` | Start provider-specific session |103104### Step 6: Complete Cart105106| Workflow | Purpose |107|----------|---------|108| `completeCartWorkflow` | Convert cart to order |109110Completion validates: all items in stock, shipping selected, payment authorized, email set.111112> **Fetch live docs** for the exact validation checks performed during cart completion.113114## Sales Channels115116| Concept | Description |117|---------|-------------|118| Sales Channel | Named storefront scope (e.g., "Web", "Mobile App", "B2B") |119| Publishable API Key | Associates Store API requests with a sales channel |120| Product-Channel Link | Products published to specific channels |121122- Each cart belongs to one sales channel123- Store API requests must include `x-publishable-api-key` header124- Products not linked to the cart's channel are unavailable125126> **Fetch live docs** for publishable API key configuration and sales channel management.127128## Store API Routes129130| Route Pattern | Method | Purpose |131|---------------|--------|---------|132| `/store/carts` | POST | Create cart |133| `/store/carts/:id` | GET | Retrieve cart |134| `/store/carts/:id` | POST | Update cart (email, address) |135| `/store/carts/:id/line-items` | POST | Add line item |136| `/store/carts/:id/line-items/:item_id` | POST/DELETE | Update/remove line item |137| `/store/carts/:id/shipping-methods` | POST | Add shipping method |138| `/store/carts/:id/payment-collections` | POST | Create payment collection |139| `/store/carts/:id/complete` | POST | Complete checkout |140141> **Fetch live docs** for request body shapes and response formats on each route.142143## Best Practices144145### Cart Management146- Always create carts with a `region_id` -- it determines currency, tax rules, and shipping147- Use `sales_channel_id` to scope product availability per storefront148- Store custom checkout data in cart `metadata` (e.g., gift messages, notes)149150### Checkout Flow151- Validate addresses before shipping option selection -- options depend on the destination152- Re-fetch shipping options after address changes (available options may differ)153- Initialize payment sessions only after shipping is selected (total must include shipping)154- Handle cart completion errors gracefully -- display specific validation failures to the user155156### Performance157- Use `remoteQuery` to enrich cart data (product details, images) in a single query158- Cache shipping options per region + address combination to reduce API calls159160### Security161- Never expose payment session secrets to the client162- Validate cart ownership (customer or anonymous session) on every mutation163- Use publishable API keys to enforce sales channel scoping164165Fetch the Medusa v2 cart module documentation and checkout workflow references for exact service method signatures, workflow inputs, and validation rules before implementing.