Marketplace Platform

icon

Marketplaces on an open-source foundation

Build flexible, scalable  
multi-vendor marketplaces 

Medusa gives you full control to build and scale custom marketplaces.
With support for multiple vendors, custom payouts, and open architecture,
Medusa provides the commerce logic you need to power your marketplace.

Trusted by leading marketplaces

logo
logo
logo
logo

Everything you need to launch a marketplace

Flexible infrastructure for multi-vendor commerce

Medusa is a developer-first platform designed to power custom marketplaces. Add seller roles, automate payouts, and build tailored experiences for every user. All backed by an open, composable architecture that fits your stack.

  • Ready for multi-vendor support
  • Integrates with your stack
  • Automated payouts and platform fees
  • Prebuilt marketplace starter with Mercur
  • Fully headless and API-first
  • Customizable admin and storefront

Built for multi-vendor models

Add seller roles, products, and logic

Use Medusa’s framework to introduce custom user types like vendors and sellers. Associate them with products, orders, and customers to manage your marketplace with complete control and visibility.

Simple, scalable payouts

Automate vendor payments and fees

Medusa’s payment architecture supports Stripe Connect and other providers for automated payouts and fee handling. Control your marketplace’s revenue model without building from scratch.

Launch-ready starter

Go live faster with Mercur

Get started quickly with Mercur, the prebuilt marketplace starter. Includes a vendor dashboard, customized admin panel, and multi-vendor storefront - all ready to customize and deploy.

Core commerce primitives

Headless marketplace software with no limits

Medusa gives you the building blocks for core commerce like carts, products, and orders. Orchestrate them for your unique marketplace business model. Integrate with any service, connect to your existing tools, and own the full user experience across both sides of the marketplace.

blueprint modules

Cloud platform

Open-source flexibility with cloud reliability

Medusa Cloud lets you scale your marketplace with confidence. Get the freedom to customize with the security, uptime, and support of cloud infrastructure - all while avoiding vendor lock-in.

blueprint cloud

Real-world examples

Trusted by leading marketplaces

Medusa is the world’s most popular open-source commerce platform. Learn why leading marketplaces opted for our flexibility.

logo

Connecting 1000+ sellers

Seamlessly integrated multiple ERPs to handle large order volumes

logo

Custom features in half the time

Aid distribution to 500k individuals through Medusa

logo

TTM -30%, traffic +34%

Boosting performance for Poland's biggest vintage marketplace

logo

Built for Medusa

Open source marketplace starter to build and iterate fast

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.

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

import { 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

import { 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

import { 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 order
async (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

import {
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 launch your marketplace?

Book a demo to see how Medusa powers modern marketplaces. Add vendors, automate payouts, and create flexible commerce experiences with open source technology.

Project dashboard