Marketplace Platform
Markeptlaces
Build scaleable multi-vendor
marketplace experiences
Medusa provides an optimal foundation for custom marketplaces. Build from scratch
or use the marketplace starter with pre-built multi-vendor marketplace features.
Trusted by leading marketplaces
Marketplace Recipe
A marketplace tailored to your needs
Use our recipe to set up a marketplace with multiple vendors with own products and orders. Adapt our logic to fit your business.

MercurJS
Go live fast with the Marketplace Starter
Mercur is a prebuilt marketplace starter by our Expert partners at RigbyJS. It comes with vendor dashboards, marketplace-ready admin features, and a B2C storefront. All ready to deploy.
- Unified multi-vendor checkout
- Automatic split payments & payouts
- Vendor dashboard for products & orders
- Vendor verification & commissions
- Vendor profiles & reviews
- Customizable B2C storefront
- Advanced product search & filtering
- Real-time buyer–seller messaging
- Region-based product filtering
Flexibility at the core
Seamless multi-vendor shopping experience
Give customers a smooth experience with unified checkout, fast search, vendor profiles, reviews, messaging, and more.

Vendor dashboard
Let vendors manage their commerce with ease
Vendors get a full dashboard to manage products, orders, and earnings. Product listing is streamlined and payouts are automated through Stripe Connect.

Medusa Cloud
Infrastructure for your MercurJS project
MercurJS projects can be easily deployed on Medusa Cloud, so you can benefit from features like push-to-deploy workflows, auto-scaling, instant preview environments, and more.

Oversee vendors and set marketplace rules
Mercur extends Medusa’s Admin with vendor verification, commission handling, vendor requests, and more.
Order splitting and vendor payment handling
Automatically splits orders and payments when customers purchase from multiple vendors.
Customizable storefront to fit your needs
Easily customize the Mercur storefront to match your brand and create a customized user experience.
Some real-life examples
Marketplaces at all scales
Learn why Medusa is one of the most popular solutions on the market for building custom marketplace projects.
We looked at all the other major platforms, but none fulfilled our needs. Medusa stood out as it offered the flexibility to build our own unique business logic and user experience.

Jordan Lunetta
Service owner, Viessmann
Medusa was a saving grace really. There was no other alternative that would give us the control and customization options needed for our marketplace.

Andy Conner
Co-founder & Head of Product, Foraged
The developer experience is awesome. From managing vast product listings to handling intricate vendor details, Medusa provided a robust and scalable solution.

Jakub Zbąski
Co-founder & co-CEO, Rigby
Framework for customizations
Faster time to market with our framework
Our framework tooling lets you build custom integrations and features in no time. Easily add custom data models, modules, workflows, UI extensions, and API endpoints.
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 build 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.

