Commerce for Distributors

icon

Medusa for Distributors

Modern commerce for 
complex distribution 

Medusa gives B2B distributors full control over catalogs, pricing,
and workflows — with fast integrations and no volume-based fees.
Handle complexity at scale, without compromising your margins.

Trusted by leading distributors

logo
logo
logo
logo

Distribution challenges solved

Control costs while managing complexity

Stop paying volume-based fees that eat into your margins. With Medusa, you only pay for the compute you use, while getting enterprise-grade tools to handle customer-specific catalogs, pricing, and automated workflows.

  • Predictable compute-based pricing
  • Handles millions of SKUs
  • Rapid system integration framework
  • Built-in quote negotiation tools
  • Automated vendor compliance
  • Streamlined service workflows

Enterprise integration

Connect your entire technology stack

Build custom integrations at unprecedented speed. Our customers, like Redington, have implemented 15+ integrations including ERP systems in just 6 months.

index engine illustration

Smart negotiations

Automate complex sales workflows

Handle complex negotiations with built-in quote management. Customize approval flows and automate vendor compliance checks to keep operations lean.

Margin protection

Keep costs predictable as you scale

Unlike traditional platforms that charge based on volume, Medusa's compute-based pricing ensures your costs stay proportional to actual usage, protecting your margins.

blueprint framework

Cloud+

Hosted solution with enterprise features

Let Medusa Cloud handle uptime and security. Add premium plugins and unlock direct support for your enterprise needs.

blueprint cloud

Real-life examples

Trusted by industry leaders

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

logo

155 stores, one system

Streamlined omnichannel operations using Medusa’s modular architecture

logo

+10k daily orders

Handles large order volumes across multiple vendor ERPs.

logo

+250k products available

Building Europe's backbone for industrial spare parts trading

logo

+$4bn GMV per year

Built India’s largest B2B platform — on time and under budget.

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",
}

Get in touch

Digitize your distribution with Medusa

Medusa helps distributors modernize operations, improve order flows, and integrate with critical systems. Let's build your future-proof stack.

Project dashboard