DTC Commerce

DTC commerce without limits
Build, launch, and scale
DTC experiences faster
Medusa is the open source ecommerce platform built for direct-to-consumer brands
that demand flexibility, speed, and control. From global expansion to branded storefronts.
Give your teams the power to move fast - without transaction fees.
Powering leading DTC brands




Made for modern DTC brands
Open source power. Shopify Plus alternative.
Medusa gives you the features to launch new markets quickly, streamline operations, and craft on-brand experiences.
With a developer-first approach you can experiment faster, automate workflows, and deliver better customer experiences.
- Sell globally with multiple currencies
- Built-in returns, exchanges, and claims
- Headless and customizable storefronts
- Developer-first and open source
- 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 kits and iterate fast with preview environments, then evolve your experience without limits.

Tech you can trust
Built for reliability and visibility
Medusa lets you integrate every part of your stack - from marketing to fulfillment - into a seamless backend. Ensure data consistency, faster ops, and smooth customer experiences.

Predictable costs
Pay for what you use, not what you sell
When you choose Medusa Cloud, you keep every cent of your sales. We never take a cut. Our compute-based pricing scales with your business, giving you predictable costs and full control over your margins as you grow.

Cloud platform
Open source meets cloud reliability
Get the best of both worlds: Medusa’s open-source flexibility with the scalability of cloud infrastructure. Launch quickly and grow without worrying about infrastructure.

Real-life examples
Trusted by DTC leaders
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.

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

Global personalization at scale
Delivering tailored sleep solutions across 10 regions

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

40+ countries, four currencies
Built a global D2C shop in 6 weeks with Medusa
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 DTC growth?
Book a demo to see how Medusa helps direct-to-consumer brands launch fast, scale globally, and build standout experiences - without the costs of traditional platforms.
