Food and Beverages

Simplify food ecommerce operations
Manage complex food and
beverage ordering with ease
Food and beverage businesses face unique challenges: from multi-location kitchens to international sales.
Medusa offers a flexible, open source ecommerce framework that helps you sync inventory,
streamline orders, and scale globally without hassle.
Trusted by industry leaders




Designed for food and beverage complexity
Scale operations without losing control
Medusa supports multi-location inventory and order workflows, complex pricing models, and seamless integration with ERPs and logistics.
Whether selling locally or internationally, Medusa helps food brands manage every step with confidence.
- Multi-location inventory management
- Multi-region pricing and tax compliance
- B2B catalogs and ERP integrations
- Auto-scaling for peak order times
- Flexible payment and shipping options
- Open source and developer-first
Sync your kitchens and warehouses
Manage inventory and orders across multiple locations
Medusa’s multi-location support ensures real-time stock sync and smooth workflows across kitchens, warehouses, and delivery points. Coordinate your entire supply chain effortlessly and keep orders moving on time.

Expand globally with confidence
Tailor pricing, taxes, and payments by region
Medusa supports multi-currency, tax compliance, and localized payment methods to help food brands scale internationally. Customize every aspect of the buying experience to meet regional requirements and customer expectations.

Personalize b2b food ecommerce
Partner-specific catalogs and pricing made easy
Deliver tailored product catalogs and pricing for distributors and wholesalers. Integrate smoothly with ERP and warehouse management systems to streamline large-scale food and beverage operations.

See Medusa in action
Explore our food delivery demo: Medusa Eats
Medusa Eats is our food delivery platform demo. Think UberEats, but built with Medusa v2 and Next.js and running on Medusa Cloud. It showcases multi-role dashboards, real-time order tracking, and workflow automation.

Cloud plus open source
Build your food ecommerce stack your way
Combine the reliability of cloud hosting with the flexibility of open source. Customize your food and beverage platform with the integrations you need, paying only for the infrastructure you use.

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",}
Ready to transform food ecommerce?
Let’s build your scalable, flexible ordering system
Discover how Medusa helps you manage complex food and beverage workflows, scale globally, and create seamless customer experiences. All with a developer-first approach.
