B2C

B2C commerce without limits
Build, launch, and scale
complex B2C experiences
Medusa is the open source commerce platform built for non-conventional B2C cases that demand customizations, speed, and control. Support global expansions to specialized workflows.
Powering leading B2C brands




Handle complexity
Support non-conventional and complex B2C projects
Medusa lets you create custom experiences for complex workflows and unique business models that do not fit standard templates.
- Sell globally with multiple currencies
- Product bundling and unlimited variants
- Dynamic promotions, gift cards and credits
- Built-in returns, exchanges and claims
- Easily support subscriptions
- Custom checkout and unlimited payment options
- Headless and customizable storefronts
- Integrates with all your tools
- Transparent, usage-based pricing
Go global, fast
Scale to new markets in clicks
Open new markets directly from the Medusa Admin. Enable multi-currency, region-based shipping, local payment providers, and tax compliance. No plugins or workarounds needed.

Smarter post-purchase
Returns that drive loyalty
Automate returns, exchanges, and claims with self-serve customer portals and smart workflows. Turn friction into upsell moments, and data into insights. No extra apps and fees.

Branded experiences
Total control over your storefront
Medusa is fully headless and built for customization. Launch with a Starter kit and iterate fast with preview environments, then evolve your experience without limits.

Integrations without limits
Build your stack your way
With 100+ integrations, Medusa makes it easy to connect the tools you already use. From marketing to fulfillment, everything flows through a seamless backend for faster operations and better customer experiences.

Predictable costs
Pay for what you use, not what you sell
With Medusa Cloud, you pay only for resources used, never for revenue. That means no hidden fees, predictable costs, and full control over your growth.


Recipes
Build any commerce application.
Don’t find the Starter your are looking for? Don’t worry, you can use some of our recipes to help build your own custom use case.

Marketplace
Multi-vendor marketplace.

B2B
Business-to-business commerce.

Ticketing
Ticket booking system.

Digital Products
Downloadable products.

Ecommerce
Traditional ecommerce store.

ERP Integration
ERP system integration.

Multi-Region Store
Global currencies, taxes and more.

Omnichannel Store
Multiple sales channels.

OMS
Order Management System.

Personalized Products
Custom product configurations.

POS
Backend for Point-of-Sales.

Subscriptions
Recurring product purchases.
Real-life examples
Trusted by B2C leaders
Discover how leading B2C brands are using Medusa to build custom ecommerce experiences without platform limitations.

From 2 to 50+ markets
Improving conversion by 70% at record speed

Unique, localized storefront experiences
Powering one of Europe’s fastest-growing D2C shops

Seamless omnichannel setup across 100+ stores
Orchestrating 5,000+ omnichannel orders daily

Commerce at enterprise scale
Powering quick commerce across 500 retail locations
Framework for customizations
Faster time to market with our framework
Our developer-first framework makes it easy to build custom integrations and features: from data models and workflows to UI extensions and APIs.
No hacks, no workarounds - just clean, scalable customization.
store.medusajs.com
create-order-in-erp.ts
sync-order-to-erp.ts
A workflow step performs a query or action in a system. Steps can receive inputs from previous steps and return data to be used in subsequent steps. You can resolve services in your steps, allowing you to build business logic involving Medusa’s core commerce modules, third-party systems, or custom systems.
To connect multiple steps together you create a Workflow. Creating a Workflow is like writing any other function. Behind the scenes Medusa generates a representation of your workflow that enables automatic retries of steps if they fail.
If step retries don't succeed, Medusa will rollback previous steps. A rollback will call a step's compensation method, ensuring your data is kept consistent across systems.
You can trigger your workflows anywhere in Medusa. Use your workflows in Subscribers to start them in response to an event. Start them in response to requests with API Routes. Or have them run on a defined schedule with Scheduled Jobs.
src > workflows > steps > create-order-in-erp.ts
1
A workflow step performs a query or action in a system. Steps can receive inputs from previous steps and return data to be used in subsequent steps. You can resolve services in your steps, allowing you to build business logic involving Medusa’s core commerce modules, third-party systems, or custom systems.
create-order-in-erp.ts
sync-order-to-erp.ts
src > workflows > steps > create-order-in-erp.ts
123456789101112import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"export const createOrderInERP = createStep("create-order-in-erp"async (order: StepInput, { container }) => {const erpService = container.resolve("erp")const createdOrder = await erpService.createOrder(order)return new StepResponse(createdOrder)})
To connect multiple steps together you create a Workflow. Creating a Workflow is like writing any other function. Behind the scenes Medusa generates a representation of your workflow that enables automatic retries of steps if they fail.
create-order-in-erp.ts
sync-order-to-erp.ts
src > workflows > sync-order-to-erp.ts
1234567891011121314151617181920import { createWorkflow, WorkflowResponse } from "@medusajs/framework/workflows-sdk"import { createOrderInERP, transformOrder } from "./steps"export const syncOrderToERP = createWorkflow("sync-order-to-erp",(input: WorkflowInput, { container }) => {const medusaOrder = retrieveOrder(input.order_id)const createdOrder = when({ medusaOrder }, ({ medusaOrder }) => {return medusaOrder.status === "completed"}).then(() => {const preparedOrder = transformOrder(medusaOrder)return createOrderInERP(preparedOrder)})return new WorkflowResponse(createdOrder)})
If step retries don't succeed, Medusa will rollback previous steps. A rollback will call a step's compensation method, ensuring your data is kept consistent across systems.
create-order-in-erp.ts
sync-order-to-erp.ts
src > workflows > accept-quote.ts
123456789101112131415161718import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"export const createOrderInERP = createStep("create-order-in-erp"async (order: StepInput, { container }) => {const erpService = container.resolve("erp")const createdOrder = await erpService.createOrder(order)return new StepResponse(createdOrder, createdOrder)},// In the face of errors, we roll back and delete the orderasync (createdOrder, { container }) => {const erpService = container.resolve("erp")await erpService.deleteOrder(createdOrder)})
You can trigger your workflows anywhere in Medusa. Use your workflows in Subscribers to start them in response to an event. Start them in response to requests with API Routes. Or have them run on a defined schedule with Scheduled Jobs.
create-order-in-erp.ts
sync-order-to-erp.ts
src > subscribers > sync-order-to-erp.ts
123456789101112131415161718192021222324import {type SubscriberConfig,} from "@medusajs/framework"import syncOrderToErp from "../workflows/sync-order-to-erp"export default async function handleOrderPlaced({event: { data },container,}) {const orderService = container.resolve("order")const order = await orderService.retrieve(id)await syncOrderToErp(container).run({input: {order},})}export const config: SubscriberConfig = {event: "order.placed",}
Let's talk
Ready to power your B2C growth?
Book a demo to see how Medusa helps business-to-consumer brands launch fast, scale globally, and build standout experiences - without the costs of traditional platforms.
