--- title: "Configurable products, combination pricing and order approval" description: "How to build configurable products, combination-dependent pricing and manual approval before payment on Medusa, and why a commerce framework beats SaaS here." url: https://medusajs.com/kb/order-management/configurable-products-combination-pricing last_updated: 2026-10-29T11:36:34Z topic: "order-management" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" - "https://medusajs.com/kb/b2b/b2b-quotes-rfq.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/order-management/open-source-oms.md" sources: - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-builder" - "https://docs.medusajs.com/resources/examples/guides/custom-item-price" - "https://docs.medusajs.com/resources/recipes/bundled-products" - "https://docs.medusajs.com/resources/references/medusa-workflows/addToCartWorkflow" - "https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.medusajs.com/user-guide/orders/payments" - "https://docs.medusajs.com/resources/commerce-modules/order/draft-orders" --- # Configurable products, combination pricing and order approval > Use a commerce framework where custom logic runs inside the backend, such as Medusa. In Medusa, you model configurable products with a custom module linked to products, compute combination prices in a workflow that adds items with a custom unit price, and gate payment by authorizing at checkout and capturing only after an approval step. ## Why SaaS platforms struggle with configure-price-approve flows Configurable products, combination pricing and approval gates all change core commerce behavior: what a product is, how a price is calculated, and when an order may be paid. Most SaaS platforms keep those parts closed. Custom logic runs in apps or scripts at fixed extension points, so you end up syncing state between the platform and external services. A commerce framework like Medusa puts that logic in the backend itself. You add data models in custom modules, run business logic in workflows, and inject code into Medusa's own workflows through hooks. The three requirements below each map to documented Medusa patterns. ## How to model configurable products in Medusa Medusa's Product Module supports product options (such as size or material) and variants, one per option combination. This works when combinations are few enough to store as variants, and each variant then has its own prices and inventory. For products assembled from parts, use a custom module. Medusa's [product builder tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-builder) defines data models for builder configurations, custom fields, complementary products and add-ons, links them to products, adds an admin widget to manage them, and carries the chosen configuration into the cart and order. The [bundled products recipe](https://docs.medusajs.com/resources/recipes/bundled-products) uses the same approach with `Bundle` and `BundleItem` models. | Approach | Use when | | --- | --- | | Product options and variants | A limited set of combinations, each with known price and stock | | Inventory kits | One variant consumes stock from several inventory items, at one fixed price | | Custom module linked to products | Open-ended configurations, add-ons, or parts chosen at runtime | ## How to price a combination at add-to-cart time Medusa's Pricing Module handles price lists, customer-group rules and quantity tiers. When a price depends on which parts are combined, you calculate it yourself and pass it to the cart. The documented pattern, from the [custom line item pricing guide](https://docs.medusajs.com/resources/examples/guides/custom-item-price): 1. Create a custom API route that receives the variant and the selected configuration. 2. Run a workflow that loads part prices (from your module, the Pricing Module or an external service) and computes the total. 3. Acquire a lock on the cart, then run `addToCartWorkflow` with the item's `unit_price` set to the computed price. The line item is stored with `is_custom_price: true`, so Medusa keeps your price. For rules that only need extra pricing context, `addToCartWorkflow` also exposes a `setPricingContext` hook. ## How to require manual approval before payment Medusa authorizes the payment session when the cart is completed and the order is created. Capture is a separate step. Medusa's [Stripe provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) has a `capture` option that defaults to `false`, so orders are placed with an authorized payment and captured later from the Medusa Admin or by code. That gives two approval patterns: - **Approve after order, before capture**: let the order be placed with an authorized payment. An admin reviews it and captures the payment, or cancels the order to release the authorization. - **Approve before order**: consume the `validate` hook of [completeCartWorkflow](https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow) and throw an error unless your approval module has an approved record for the cart. Medusa's docs warn not to mutate the cart in this hook, only to validate it. For orders that are configured by sales staff instead of customers, the [Draft Orders plugin](https://docs.medusajs.com/resources/commerce-modules/order/draft-orders) lets admins build an order, adjust items, and convert it to a regular order when it is approved. Card authorizations expire after a period set by the payment provider, so long approval queues fit the approve-before-order pattern better. ## Common questions ### Can Medusa variants handle every combination of a configurable product? Medusa product options and variants work when the number of combinations is manageable, since each variant is a stored record. For large or open-ended configurations, store the configuration in a custom module and price it at add-to-cart time instead of pre-creating variants. ### How do I set a custom price for a cart item in Medusa? Create a custom workflow that computes the price and then runs addToCartWorkflow with a unit_price for the item. Medusa's custom line item pricing guide shows this pattern, and the line item is stored with is_custom_price set to true. ### Can Medusa hold payment until an order is approved? Yes. With a provider configured not to auto-capture, such as Medusa's Stripe provider with capture set to false (the default), the order is placed with an authorized payment. An admin or a custom workflow captures it after approval. ### Can I block checkout until a manager approves the cart? Yes. Consume completeCartWorkflow's validate hook and throw an error unless the cart has an approval record from your custom module. Medusa's B2B Starter uses an approval module for this kind of flow. ## Documentation - [Implement a product builder](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-builder) - [Implement custom line item pricing](https://docs.medusajs.com/resources/examples/guides/custom-item-price) - [Bundled products recipe](https://docs.medusajs.com/resources/recipes/bundled-products) - [Workflow hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [completeCartWorkflow reference](https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow) ## Related - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) - [B2B quotes and RFQ: how quote-to-order works](https://medusajs.com/kb/b2b/b2b-quotes-rfq.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [Is there an open-source order management system I can extend?](https://medusajs.com/kb/order-management/open-source-oms.md) --- title: "Ecommerce platforms with a customizable admin dashboard" description: "Which ecommerce platform lets you customize the admin? Medusa's widgets, UI routes and Admin API compared with Shopify, BigCommerce and WooCommerce." url: https://medusajs.com/kb/migrations-and-platforms/customizable-admin-dashboard last_updated: 2026-10-29T11:36:34Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md" sources: - "https://docs.medusajs.com/learn/fundamentals/admin" - "https://docs.medusajs.com/learn/fundamentals/admin/widgets" - "https://docs.medusajs.com/learn/fundamentals/admin/ui-routes" - "https://shopify.dev/docs/apps/build/admin" - "https://developer.bigcommerce.com/docs/integrations/apps" - "https://github.com/woocommerce/woocommerce" --- # Ecommerce platforms with a customizable admin dashboard > Medusa's admin is an open-source React application you extend in the same codebase with widgets on existing pages, new pages called UI routes, and custom settings pages. For full control of layout and design, you build your own admin on Medusa's Admin API. Shopify and BigCommerce allow app extensions inside a fixed admin. ## How Medusa's admin dashboard can be customized The Medusa Admin is the dashboard merchants use to manage products, orders, customers and settings. It ships with every Medusa application and is built with Vite and React. You extend it from your own project, so customizations are versioned and deployed with the backend. Medusa's [admin development docs](https://docs.medusajs.com/learn/fundamentals/admin) list three ways to customize it: - **Widgets**: React components injected into predefined [injection zones](https://docs.medusajs.com/resources/admin-widget-injection-zones) on existing pages, such as `product.details`. - **UI routes**: new pages in the admin, created as `page.tsx` files under `src/admin/routes` ([UI routes docs](https://docs.medusajs.com/learn/fundamentals/admin/ui-routes)). - **Settings pages**: UI routes under `src/admin/routes/settings`, which appear in the admin's settings section. Widgets and UI routes call your custom API routes, so a custom module (for example, companies or subscriptions) gets its own management screens. The Medusa UI package provides components that match the dashboard's design. ## What you cannot change in the Medusa Admin Medusa documents the limits directly. You can't change the admin dashboard's layout, design, or the content of existing pages beyond injecting widgets, and you can't replace the Medusa logo. When you need that level of control, build a separate admin application on the [Admin API](https://docs.medusajs.com/api/admin). Every action in the Medusa Admin uses the Admin API, so a custom dashboard has access to the same operations. The JS SDK supports admin authentication for this. ## How Medusa compares with Shopify, BigCommerce and WooCommerce | Platform | Admin source | How you customize it | Limits | | --- | --- | --- | --- | | Medusa | Open source, React, in your project | Widgets, UI routes, settings pages; or a custom admin on the Admin API | No layout or theme changes to the built-in admin | | Shopify | Closed, hosted | Apps with admin extensions: action modals, blocks on resource pages, embedded app pages | Core admin pages and navigation are fixed | | BigCommerce | Closed, hosted | Apps loaded inside the control panel from the app's own server | App UI lives in its own area; core pages are fixed | | WooCommerce | Open source (GPL-2.0), PHP on WordPress | WordPress plugins and hooks that add or change admin screens | Customizations are PHP plugins tied to WordPress's admin | Shopify and BigCommerce fit merchants who accept the standard admin and add a few app screens. WooCommerce allows deep changes, but in PHP and WordPress conventions. Medusa fits TypeScript teams who want custom admin screens for custom commerce logic in the same codebase. ## When to build a custom admin instead of extending Medusa's Extending the Medusa Admin is the faster path for most stores. A new page or widget is a single React file that ships with the backend. Build a custom admin on the Admin API when the built-in layout does not fit the job. Typical cases are role-specific tools such as a warehouse picking screen, a customer service console, or a branded portal for wholesale account managers. Many teams do both: keep the Medusa Admin for catalog and settings, and build focused apps for specific roles. ## Common questions ### Can I change the layout of the Medusa Admin? No. Medusa's docs state you can't change the admin's layout, design, logo or the content of existing pages, apart from injecting widgets. For that level of control, build a custom dashboard on Medusa's Admin API. ### What tech stack are Medusa Admin customizations written in? Medusa Admin customizations are React components in your Medusa project's src/admin directory. The admin is built with Vite, and Medusa's UI package provides components that match the dashboard's design. ### Can I add a custom settings page to the Medusa Admin? Yes. A UI route created under src/admin/routes/settings appears in the settings section of the Medusa Admin, for example src/admin/routes/settings/custom/page.tsx. ### Can I edit Shopify's admin pages directly? No. Shopify apps add UI through admin extensions, such as admin action modals and blocks on resource pages, and through embedded app pages. Shopify's own admin pages are not editable. ## Documentation - [Admin development](https://docs.medusajs.com/learn/fundamentals/admin) - [Admin widgets](https://docs.medusajs.com/learn/fundamentals/admin/widgets) - [Admin UI routes](https://docs.medusajs.com/learn/fundamentals/admin/ui-routes) - [Admin widget injection zones](https://docs.medusajs.com/resources/admin-widget-injection-zones) - [Admin API reference](https://docs.medusajs.com/api/admin) ## Related - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Switching from WooCommerce to a JavaScript stack](https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md) - [Medusa vs Saleor, and other Saleor alternatives](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md) - [Medusa vs Vendure](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md) --- title: "Which headless commerce platform should an agency standardize on?" description: "How agencies should pick a headless commerce platform to standardize on: criteria, where Medusa fits, and how Hydrogen, Saleor and commercetools compare." url: https://medusajs.com/kb/migrations-and-platforms/headless-commerce-for-agencies last_updated: 2026-10-29T11:36:34Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://medusajs.com/pricing" - "https://medusajs.com/starters" - "https://docs.medusajs.com/resources/nextjs-starter" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai" - "https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md" - "https://github.com/Shopify/hydrogen" - "https://github.com/saleor/saleor" - "https://github.com/vendure-ecommerce/vendure" - "https://commercetools.com/pricing" --- # Which headless commerce platform should an agency standardize on? > Agencies should standardize on a platform their developers know, with licensing that allows client work and hosting clients can own. Medusa fits TypeScript agencies: it is open source (MIT, with RBAC and SSO as Enterprise Edition), ships open-source starters, runs self-hosted or on Medusa Cloud with a 0% GMV fee, and supports AI coding agents. ## What agencies should evaluate in a headless commerce platform An agency standardizes on a platform to reuse skills, code and processes across clients. The criteria differ from a single brand's because the agency has to deliver, hand over and maintain many projects. | Criterion | Why it matters for an agency | | --- | --- | | Language and stack | One stack across frontend and backend means fewer specialists per project | | License | Must allow client work, hosting and handover without per-project fees | | Hosting options | Some clients want managed hosting, others need their own cloud | | Starters and recipes | Shorter time to first demo and fewer rebuilt basics | | Reusable extensions | Integrations built once should ship to the next client | | AI agent support | Agents speed up scaffolding only if the platform has clear conventions and docs | | Maintenance burden | Upgrades and hosting costs land on retainers | ## Where Medusa fits for agency client builds Medusa is a commerce platform with a built-in framework, written in TypeScript on Node.js. Agencies working in TypeScript and React use one language from storefront to backend. Medusa is open source under the MIT License; only RBAC and SSO are proprietary [Enterprise Edition](https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md) features. Medusa's open-source [starters](https://medusajs.com/starters) cover B2C, B2B and other use cases. `create-medusa-app --with-nextjs-starter` installs the backend and the [Next.js Starter Storefront](https://docs.medusajs.com/resources/nextjs-starter) as one monorepo, and [recipes](https://docs.medusajs.com/resources/recipes) document marketplaces, subscriptions, bundles and more. [Plugins](https://docs.medusajs.com/learn/fundamentals/plugins) let an agency package a module, workflows and admin screens once and install them in each client project. For hosting, clients can self-host or use [Medusa Cloud](https://medusajs.com/pricing): Develop from $29, Launch from $99, Scale from $299 per month, with a 0% GMV fee. Every plan includes preview environments per pull request, which helps client review cycles. ## How AI coding agents work with Medusa Medusa documents its AI tooling in [Build with AI assistants and LLMs](https://docs.medusajs.com/learn/introduction/build-with-llms-ai). It includes a Docs MCP server, Medusa agent skills, AI-friendly docs and a Cloud CLI that agents like Claude Code can use to manage deployments. Because Medusa features follow fixed patterns (a module, a workflow, an API route, an admin widget), agents can scaffold them consistently. The agency still reviews the output, but scaffolding a custom feature takes less time. ## How Medusa compares with other agency platforms | Platform | Stack | License and cost | Best agency fit | | --- | --- | --- | --- | | Medusa | TypeScript, REST, Node.js, PostgreSQL | MIT (RBAC and SSO Enterprise); Cloud from $29/month, 0% GMV | Custom commerce logic for clients with TypeScript teams | | Shopify Hydrogen | React Router storefront on Oxygen, Shopify Storefront API | Hydrogen is MIT; client pays Shopify plan fees | Clients already on Shopify who want a custom storefront | | Saleor | Python, Django, GraphQL | BSD-3-Clause; Saleor Cloud is paid | Python or GraphQL-first agencies | | Vendure | TypeScript, NestJS, GraphQL | GPLv3 core; paid plans include a commercial license | TypeScript agencies that prefer GraphQL | | commercetools | Proprietary SaaS, REST and GraphQL | Quote-based, order-based pricing | Large enterprise clients with SaaS mandates | Hydrogen customizes the storefront, but the backend, checkout and data model stay Shopify's. Medusa and Vendure let agencies change backend behavior, which is where most custom client work sits. ## When an agency client should stay on Shopify Not every client needs a headless backend. A client should usually stay on Shopify when their catalog, checkout and fulfillment fit Shopify's model, they have no budget for ongoing development, and their team relies on Shopify apps it already knows. Medusa makes sense for clients whose requirements Shopify blocks: B2B buying flows, marketplaces, complex pricing, ERP-driven operations, or GMV-based fees that have become expensive. An agency can standardize on Medusa for those clients and still recommend Shopify for the rest. ## Common questions ### Can an agency use Medusa for client projects without a license fee? Yes. Medusa is open source under the MIT License, so agencies can build, deliver and host client projects on it without license fees. RBAC and SSO are Enterprise Edition features under Medusa's Enterprise License. ### Who owns the code when an agency builds on Medusa? The code lives in a Git repository the agency and client control. On Medusa Cloud, projects deploy from that GitHub repository, so ownership can move to the client without a migration. ### Can agencies reuse Medusa customizations across clients? Yes. A Medusa plugin is a package of reusable customizations, such as modules and API routes, that can be published to npm and installed in any Medusa project. Plugins are available from Medusa v2.3.0. ### Do AI coding agents work well with Medusa? Medusa provides a Docs MCP server, Medusa agent skills and a Cloud CLI for agents like Claude Code. These give agents Medusa's documented conventions for modules, workflows and API routes while they build features. ## Documentation - [Next.js Starter Storefront](https://docs.medusajs.com/resources/nextjs-starter) - [Recipes](https://docs.medusajs.com/resources/recipes) - [Plugins](https://docs.medusajs.com/learn/fundamentals/plugins) - [Build with AI assistants and LLMs](https://docs.medusajs.com/learn/introduction/build-with-llms-ai) - [Medusa Cloud documentation](https://docs.medusajs.com/cloud) ## Related - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Medusa vs Saleor, and other Saleor alternatives](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md) - [Medusa vs Vendure](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md) - [Easiest ecommerce stack to build with AI coding tools](https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "Medusa Cloud vs self-hosting Medusa: cost and trade-offs" description: "Medusa Cloud vs self-hosting Medusa: Cloud plans from $29/month with 0% GMV fee, real VPS costs, the ops work self-hosting adds, and when each makes sense." url: https://medusajs.com/kb/build-vs-buy/medusa-cloud-vs-self-hosting last_updated: 2026-10-29T11:36:34Z topic: "build-vs-buy" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md" - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://medusajs.com/pricing" - "https://docs.medusajs.com/cloud/comparison" - "https://docs.medusajs.com/learn/deployment/general" - "https://docs.medusajs.com/learn/production/worker-mode" - "https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md" --- # Medusa Cloud vs self-hosting Medusa: cost and trade-offs > Medusa is open source and free to self-host; a small production setup on a VPS costs about $29 to $59 per month plus engineering time for backups, monitoring, scaling and upgrades. Medusa Cloud is the managed option: Develop from $29, Launch from $99 and Scale from $299 per month, all with a 0% GMV fee. Both run the same codebase. ## Medusa Cloud and self-hosting run the same open-source code Medusa is an open-source commerce platform, so you can deploy it on any infrastructure for free. Medusa Cloud is Medusa's managed hosting platform for the same applications. It deploys your project from your GitHub repository, and the code stays yours, as described in the [Cloud vs self-hosting guide](https://docs.medusajs.com/cloud/comparison). The choice is therefore not about features of the commerce engine. It is about who runs the infrastructure and how much of your team's time that takes. Medusa is MIT licensed, except RBAC and SSO, which are [Enterprise Edition](https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md) features. ## Medusa Cloud pricing by plan [Medusa Cloud pricing](https://medusajs.com/pricing) has four plans. Each includes everything in the plan before it, and every plan has a 0% GMV fee. | Plan | Price | Notable inclusions | | --- | --- | --- | | Develop | From $29/month | 1 shared server, PostgreSQL, S3 storage, storefront hosting, push-to-deploy, preview environment per pull request | | Launch | From $99/month | Autoscaling across 2 shared servers, Redis, custom storefront domains, zero-downtime deploys, point-in-time backups kept 7 days, Medusa Cache | | Scale | From $299/month | 2 servers plus 1 background worker, 14-day backup retention, semantic search, priority support, custom backend domain | | Enterprise | Custom | RBAC, SSO, audit logs, SLA-backed uptime, BYOC, dedicated support engineer | Plans include set amounts of compute hours, data transfer, database storage and build minutes. Usage beyond those amounts is billed at listed rates, such as $0.16 per extra compute hour on Launch and Scale. ## What self-hosting Medusa actually costs Self-hosting Medusa has no license or GMV fee, so the cash cost is infrastructure. A production deployment, per Medusa's [deployment guide](https://docs.medusajs.com/learn/deployment/general), needs PostgreSQL, Redis, and the application deployed in server mode and in [worker mode](https://docs.medusajs.com/learn/production/worker-mode). On DigitalOcean, that is about $29 per month on one server or about $59 per month with managed databases, as of October 2026. The larger cost is engineering time. Medusa's comparison guide lists the work a self-hosting team owns: - Configuring servers, databases, file storage, email and infrastructure modules. - Building deployment pipelines, rollbacks and staging environments. - Setting up autoscaling, load balancing and failover. - Backups and tested restore procedures. - Monitoring, logging and incident response. - Applying Medusa upgrades and security patches. If that work takes even a few engineer-hours a month, it usually costs more than the price gap between a VPS and a Medusa Cloud plan. ## When to choose Medusa Cloud Medusa Cloud fits when your team wants to spend its time on commerce features rather than infrastructure. It also fits when you want preview environments per pull request, managed Redis and caching, automatic backups, and Medusa's agent tooling (Cloud CLI, MCP server, Development Agent) without setting them up. For a live store, Launch is the realistic entry point, because Develop has no custom storefront domains or automatic backups. Enterprise adds SLAs, compliance and data sovereignty options for regulated businesses. ## When to self-host Medusa Self-hosting fits when you already run infrastructure well and have DevOps capacity. It also fits when a policy requires infrastructure Medusa Cloud does not cover below the Enterprise plan (which offers BYOC), or for side projects where downtime is acceptable. Some teams start self-hosted and move to Medusa Cloud as traffic grows, or the reverse. Because both run the same application from your repository, switching is a deployment change, not a rewrite. ## Common questions ### Is Medusa Cloud a different version of Medusa? No. Medusa Cloud deploys your own Medusa application from your GitHub repository. The code is the same open-source Medusa you would self-host, and you keep full ownership of the code and data. ### Does Medusa Cloud charge a percentage of sales? No. Every Medusa Cloud plan has a 0% GMV platform fee and unlimited orders, products, sales channels, regions and Medusa Admin users. Usage beyond included compute, storage and data transfer is billed at the rates on the pricing page. ### Can I move from Medusa Cloud to self-hosting later? Yes. Your code lives in your own repository and Medusa Cloud lets you export data from your database, so you can deploy the same Medusa application on your own infrastructure. ### Which Medusa Cloud plan do I need for a live store? The Develop plan has no custom storefront domains or automatic backups, so Launch at $99 per month is the usual starting point for a live store. Scale at $299 per month adds a background worker and longer backup retention. ## Documentation - [Cloud vs self-hosting](https://docs.medusajs.com/cloud/comparison) - [General Medusa deployment guide](https://docs.medusajs.com/learn/deployment/general) - [Worker mode](https://docs.medusajs.com/learn/production/worker-mode) - [Medusa Cloud documentation](https://docs.medusajs.com/cloud) ## Related - [Cheapest way to run a production ecommerce backend](https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md) - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "Is Medusa a good fit for B2B ecommerce?" description: "Is Medusa good for B2B? Native price lists, customer groups and draft orders, the B2B Starter's companies, approvals and quotes, and what needs custom work." url: https://medusajs.com/kb/b2b/medusa-for-b2b last_updated: 2026-10-29T11:36:34Z topic: "b2b" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" - "https://medusajs.com/kb/b2b/b2b-quotes-rfq.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" - "https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" sources: - "https://docs.medusajs.com/resources/recipes/b2b" - "https://github.com/medusajs/b2b-starter" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules" - "https://docs.medusajs.com/resources/commerce-modules/order/draft-orders" - "https://docs.medusajs.com/resources/examples/guides/quote-management" --- # Is Medusa a good fit for B2B ecommerce? > Yes, for teams that can write TypeScript. Medusa natively supports B2B building blocks: customer groups, price lists, tiered pricing, sales channels, draft orders and multi-currency regions. The official open-source B2B Starter adds companies, employees, spending limits, approvals and quotes. Punchout, credit limits and requisition lists need custom modules or integrations. ## What B2B features Medusa has out of the box Medusa's core Commerce Modules cover the B2B basics without extra code, as the [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b) describes. You configure them in the Medusa Admin or through the Admin API. | B2B need | Medusa capability | | --- | --- | | Separate B2B catalog | Sales channels plus a publishable API key scoped to a B2B channel | | Negotiated prices per account | Customer groups with price lists conditioned on the group | | Volume pricing | Price tiers with min_quantity and max_quantity (price rules) | | Orders placed by sales reps | Draft Orders plugin, included from Medusa v2.10.0 | | International buyers | Regions with their own currency and payment providers, plus per-country tax regions | | Multiple warehouses | Inventory and stock location modules | These features are enough for a wholesale portal where known customers log in and see their own prices. ## What the Medusa B2B Starter adds The [Medusa B2B Starter](https://github.com/medusajs/b2b-starter) is an open-source Medusa v2 application with a Next.js storefront. Its backend adds custom company, quote and approval modules, with API routes, workflows and admin extensions. Its features: - **Company management**: create companies, invite employees, assign roles. - **Spending limits**: per-employee limits with configurable reset frequencies. - **Approval workflows**: require admin or sales manager approval before orders are placed. - **Quote management**: customers and merchants negotiate quotes with messaging. - **Bulk add-to-cart**: add many products to the cart at once. Because the starter is ordinary Medusa code, you change its data models and rules directly. The [quote management guide](https://docs.medusajs.com/resources/examples/guides/quote-management) walks through how a quote module like this is built. ## What B2B features need custom work in Medusa Some B2B requirements are not in core Medusa or the B2B Starter. You build them with Medusa's Framework: custom modules for data, workflows for logic, API routes for endpoints, and admin widgets for UI. - **Punchout (cXML or OCI)**: a custom module and API routes that open a punchout session and return the cart to the buyer's procurement system. - **Credit limits and payment terms**: a module that tracks each company's credit, plus a payment provider or workflow hook that checks it during checkout. - **Requisition lists and reorder lists**: a module linked to customers and products, exposed through custom Store API routes. - **Account hierarchies beyond one level**: an extended company model with parent and child accounts. - ERP sync for prices, stock and invoices: an integration module following the [ERP recipe](https://docs.medusajs.com/resources/recipes/erp). This work is code, not configuration. Teams without TypeScript developers should weigh that against platforms that ship these features as settings. ## When Medusa is a good B2B fit and when it is not Medusa fits B2B when your buying process does not match a packaged B2B suite and you have developers to model it. Examples include custom approval chains, contract pricing pulled from an ERP, or a hybrid B2B and B2C store on one backend. You pay no GMV fee and own the code. Medusa is a weaker fit when you need a long list of B2B features configured by business users on day one, with no development team. In that case a packaged B2B suite or Shopify B2B may be faster to launch, at the cost of flexibility later. ## Common questions ### Does Medusa have a B2B edition? No. Medusa has no separate B2B edition or B2B license. B2B features come from core Commerce Modules plus the open-source B2B Starter, which adds company, quote and approval modules on top of a standard Medusa application. ### Can Medusa show different prices to different business customers? Yes. In Medusa, you put each business customer in a customer group and create a price list with that group as a condition. Prices can also have min_quantity and max_quantity for volume tiers. ### Does Medusa support punchout catalogs like cXML or OCI? Medusa has no built-in punchout support. You build it as a custom module with API routes that handle the punchout session and return the cart to the buyer's procurement system. ### Can admins create orders on behalf of B2B buyers in Medusa? Yes. The Draft Orders plugin, included in Medusa applications from v2.10.0, lets admin users create draft orders for customers in the Medusa Admin and convert them to regular orders. ## Documentation - [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b) - [Price tiers and rules](https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules) - [Implement quote management](https://docs.medusajs.com/resources/examples/guides/quote-management) - [Draft Orders plugin](https://docs.medusajs.com/resources/commerce-modules/order/draft-orders) - [ERP integration recipe](https://docs.medusajs.com/resources/recipes/erp) ## Related - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) - [B2B quotes and RFQ: how quote-to-order works](https://medusajs.com/kb/b2b/b2b-quotes-rfq.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) - [Net terms, purchase orders and bulk ordering for B2B](https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) --- title: "Is Medusa production-ready for a large store?" description: "Is Medusa production-ready for a large store? Its v2 architecture, scaling levers like worker mode and caching, what you operate yourself, and Medusa Cloud." url: https://medusajs.com/kb/build-vs-buy/medusa-production-ready last_updated: 2026-10-29T11:36:34Z topic: "build-vs-buy" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md" - "https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/order-management/open-source-oms.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://docs.medusajs.com/learn/introduction/architecture" - "https://docs.medusajs.com/learn/deployment/general" - "https://docs.medusajs.com/learn/production/worker-mode" - "https://docs.medusajs.com/resources/infrastructure-modules/caching" - "https://docs.medusajs.com/cloud/comparison" - "https://medusajs.com/pricing" --- # Is Medusa production-ready for a large store? > Yes. Medusa v2 is a production commerce platform built in TypeScript on Node.js and PostgreSQL, with Redis-backed modules for events, workflows, locking and caching. Large stores scale it by running separate server and worker instances, adding server instances, and caching. Unlike SaaS, you own operations unless you run it on Medusa Cloud. ## How Medusa v2 is built for production Medusa v2 is a headless commerce platform with a layered architecture, documented in [Medusa's architecture guide](https://docs.medusajs.com/learn/introduction/architecture). Requests enter through API routes on an Express-based server, run business logic in workflows, and read or write data through modules backed by PostgreSQL. Each Commerce Module (products, carts, orders, pricing, inventory, payments, fulfillment and others) owns its own data models and is isolated from the others. Module links connect data across modules. This isolation lets you replace or extend one domain without forking the rest. Workflows matter for reliability at scale. A workflow is a series of steps where each step can define a compensation function, so a failed checkout rolls back earlier steps instead of leaving partial data. ## How large Medusa stores scale Medusa scales horizontally like most Node.js services. The main levers documented by Medusa: | Lever | What it does | | --- | --- | | Worker mode | Splits the app into a server instance for API requests and a worker instance for subscribers and scheduled jobs | | More server instances | Stateless API servers behind a load balancer, with sessions stored in Redis | | Redis infrastructure modules | Redis Event, Workflow Engine, Locking and Caching providers replace in-memory defaults for multi-instance setups | | Caching Module | Caches product data and custom queries, available from Medusa v2.11.0 | | PostgreSQL tuning | Standard database scaling: larger instances, connection pooling, read-heavy query optimization | | File storage on S3 | Moves uploads off the application servers | The [deployment guide](https://docs.medusajs.com/learn/deployment/general) recommends these production modules and at least 2 GB of RAM per instance. Development defaults, like the local file provider and in-memory event bus, are not meant for production traffic. ## What you take on by running Medusa yourself Medusa is open source, so a self-hosted store has no platform vendor running it for you. Your team owns uptime, autoscaling, failover, backups, monitoring, security patches and Medusa upgrades. Medusa's [Cloud vs self-hosting guide](https://docs.medusajs.com/cloud/comparison) lists each of these responsibilities. This is the main difference from SaaS platforms like Shopify, where the vendor handles infrastructure but you accept its data model, checkout and extension limits. With Medusa, you trade operational work for control over the code and no GMV fee. ## Running a large Medusa store on Medusa Cloud Medusa Cloud is Medusa's managed hosting for the same codebase. According to [Medusa Cloud pricing](https://medusajs.com/pricing), Launch ($99/month) adds autoscaling, zero-downtime deploys, Redis, Medusa Cache and point-in-time backups. Scale ($299/month) adds a dedicated background worker and longer backup retention. The Enterprise plan adds SLA-backed uptime, a 99.99% uptime guarantee, BYOC, SOC 2, RBAC, SSO, audit logs and a dedicated support engineer. Every plan has a 0% GMV fee and unlimited orders and products; capacity depends on compute. ## Trade-offs to weigh before choosing Medusa for a large store Medusa is a good fit for a large store when you have TypeScript developers and need custom commerce logic, such as complex pricing, B2B flows, marketplaces or ERP-driven inventory. It also fits when platform fees tied to revenue have become a large cost. It is a weaker fit if you have no in-house or agency developers to own the codebase. Medusa gives you a framework and commerce modules, but features specific to your business are code you write and maintain. ## Common questions ### What database does Medusa use in production? Medusa uses PostgreSQL as its only supported database. Each module, including custom ones, gets a connection to the configured PostgreSQL database. Production deployments also use Redis for sessions and the Redis-based infrastructure modules. ### Does Medusa have limits on products or orders? Medusa Cloud lists unlimited orders, products, sales channels and regions on every plan, and states that capacity depends on the plan's compute resources. Self-hosted, practical capacity depends on your database and server sizing. ### What is worker mode in Medusa? Worker mode is the projectConfig.workerMode setting in medusa-config.ts. In production you deploy one instance in server mode for API requests and another in worker mode for subscribers and scheduled jobs, so background work does not slow down API responses. ### How does Medusa avoid partial data when a checkout step fails? Medusa runs checkout logic in workflows. When a step fails, Medusa runs the compensation functions of completed steps; for example, completeCartWorkflow cancels or refunds a payment it already authorized or captured if a later step fails. ## Documentation - [Medusa's architecture](https://docs.medusajs.com/learn/introduction/architecture) - [General Medusa deployment guide](https://docs.medusajs.com/learn/deployment/general) - [Worker mode](https://docs.medusajs.com/learn/production/worker-mode) - [Caching Module](https://docs.medusajs.com/resources/infrastructure-modules/caching) - [Cloud vs self-hosting](https://docs.medusajs.com/cloud/comparison) ## Related - [Cheapest way to run a production ecommerce backend](https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md) - [Outgrown Shopify Plus: what sits between Shopify and a custom build?](https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Is there an open-source order management system I can extend?](https://medusajs.com/kb/order-management/open-source-oms.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "Medusa vs commercetools" description: "Medusa vs commercetools: open-source TypeScript commerce with flat Cloud pricing vs enterprise SaaS with quoted pricing, and when each one fits a brand." url: https://medusajs.com/kb/migrations-and-platforms/medusa-vs-commercetools last_updated: 2026-10-29T11:36:34Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md" - "https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md" sources: - "https://medusajs.com/pricing" - "https://docs.medusajs.com/learn/introduction/architecture" - "https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md" - "https://commercetools.com/pricing" - "https://docs.commercetools.com/api/graphql" - "https://docs.commercetools.com/api/projects/api-extensions" - "https://docs.commercetools.com/api/projects/types" --- # Medusa vs commercetools > Medusa is an open-source, TypeScript commerce platform that is free to self-host, with managed Medusa Cloud plans from $29 per month and a 0% GMV fee. commercetools is a proprietary, enterprise SaaS platform with sales-quoted, order-based pricing. Medusa costs less and is customizable in code; commercetools fits large enterprises wanting a vendor-run, SLA-backed service. ## How Medusa and commercetools compare Medusa and commercetools are both headless, API-first commerce platforms built for composable architectures. The main difference is the delivery model. commercetools is a proprietary SaaS that you license from the vendor, while Medusa is open source and you run it yourself or on Medusa Cloud. | Area | Medusa | commercetools | | --- | --- | --- | | License | Open source (MIT); RBAC and SSO are Enterprise Edition | Proprietary SaaS | | Pricing | Free to self-host; Medusa Cloud from $29/month, 0% GMV fee | Not published; order-based plans quoted by sales | | Language and runtime | TypeScript on Node.js, PostgreSQL | Vendor-hosted; you call its APIs from any language | | APIs | REST Store API, Admin API, and your own API routes | REST and GraphQL APIs | | Customization | Custom modules, workflows, API routes and admin extensions in the same codebase | Custom types and fields, API extensions and external services | | Hosting | Self-host anywhere, or Medusa Cloud | Vendor-hosted only | | Source access | Full source on GitHub | No source access | ## Why teams look for commercetools alternatives commercetools positions itself for enterprise retailers and brands. Its pricing page asks buyers to contact sales and describes order-based plans instead of published prices. For mid-market brands, that sales cycle and contract size are often the reason to look elsewhere. The second reason is customization. On commercetools, logic that does not fit its data model runs in external services that you deploy and operate next to the platform. On Medusa, the same logic is a custom module or workflow inside your application, written in TypeScript and deployed with the rest of the backend. ## What Medusa offers an enterprise brand Medusa ships Commerce Modules for products, pricing, carts, orders, payments, fulfillment, inventory, promotions, tax, regions and more. Each module owns its data in PostgreSQL, and [module links](https://docs.medusajs.com/learn/fundamentals/module-links) connect them without coupling. Business logic runs in workflows that roll back completed steps when a later step fails. For enterprise operations, Medusa Cloud's Enterprise plan adds RBAC, SSO, audit logs, SLA-backed uptime, BYOC (bring your own cloud), SOC 2 and a dedicated support engineer, according to the [Medusa pricing page](https://medusajs.com/pricing). RBAC and SSO are covered by Medusa's [Enterprise License](https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md); the rest of the codebase is MIT. Every Medusa Cloud plan has a 0% GMV platform fee and unlimited orders, products, sales channels and regions. Capacity depends on the plan's compute, not on revenue. ## When commercetools is still the better fit commercetools is a reasonable choice in these cases: - Your organization requires a fully vendor-operated SaaS and does not want to own the application code. - Procurement prefers one enterprise vendor with an established contract, partner network and analyst coverage. - You already run commercetools and its integrations work; replatforming cost would outweigh licensing savings. - Your team has no Node.js or TypeScript developers and does not plan to hire them. Medusa fits better when you want lower and predictable platform cost, your developers work in TypeScript, and you want custom commerce logic inside the backend instead of in separate services. ## Migrating from commercetools to Medusa A move from commercetools to Medusa is mainly a data and integration project, because both platforms are headless. A typical path: 1. Map commercetools resources (products, variants, prices, customers, orders) to Medusa's Commerce Modules. 2. Export data through the commercetools API and import it with Medusa's [Admin API](https://docs.medusajs.com/api/admin) or a script that calls Medusa workflows. 3. Rebuild custom types and API extensions as Medusa custom modules and workflow hooks. 4. Point the storefront's API layer at Medusa's Store API and run both systems in parallel before switching DNS. Plan for historical order import, URL redirects and payment provider re-configuration. Migration effort depends mostly on how many external services you built around commercetools. ## Common questions ### How much does commercetools cost compared to Medusa? commercetools does not publish prices; its pricing page describes order-based plans quoted by its sales team. Medusa is free to self-host, and Medusa Cloud lists Develop at $29, Launch at $99 and Scale at $299 per month, all with a 0% GMV fee. ### Is Medusa a MACH platform like commercetools? Medusa is headless and API-first, exposes REST Store and Admin APIs, and splits commerce into independent modules, so it covers the same composable ideas. Unlike commercetools, Medusa is open source, so you can self-host it or run it on Medusa Cloud. ### Can Medusa handle enterprise requirements like SSO and RBAC? Yes. RBAC and SSO for Medusa Admin and Medusa Cloud are Enterprise Edition features under Medusa's Enterprise License, available on the Medusa Cloud Enterprise plan with SLAs, audit logs and a dedicated support engineer. ### How hard is it to migrate from commercetools to Medusa? A commercetools to Medusa migration is a data and integration project: export products, customers and orders through the commercetools API, import them through Medusa's Admin API or a migration script, and repoint each integration. Storefronts already built headless only need their API layer swapped. ## Documentation - [Medusa's architecture](https://docs.medusajs.com/learn/introduction/architecture) - [Commerce Modules](https://docs.medusajs.com/resources/commerce-modules) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Medusa Cloud vs self-hosting](https://docs.medusajs.com/cloud/comparison) ## Related - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Cheapest way to run a production ecommerce backend](https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md) - [Outgrown Shopify Plus: what sits between Shopify and a custom build?](https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md) - [Medusa vs Vendure](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md) --- title: "Medusa vs Saleor, and other Saleor alternatives" description: "Medusa vs Saleor compared (TypeScript REST vs Python GraphQL), plus the main Saleor alternatives: Vendure, Hydrogen, commercetools, BigCommerce, WooCommerce." url: https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor last_updated: 2026-10-29T11:36:34Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" sources: - "https://docs.medusajs.com/learn/introduction/architecture" - "https://medusajs.com/pricing" - "https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md" - "https://github.com/medusajs/medusa" - "https://github.com/medusajs/b2b-starter" - "https://github.com/saleor/saleor" - "https://docs.saleor.io/developer/extending/apps/overview" - "https://saleor.io/pricing" - "https://github.com/vendure-ecommerce/vendure" - "https://github.com/Shopify/hydrogen" - "https://github.com/bigcommerce/catalyst" - "https://github.com/woocommerce/woocommerce" - "https://commercetools.com/pricing" --- # Medusa vs Saleor, and other Saleor alternatives > Medusa and Saleor are open-source headless commerce platforms on PostgreSQL. Medusa is TypeScript with REST APIs, extended with modules and workflows inside the app. Saleor is Python and Django with a GraphQL-only API, extended through separate apps. Other Saleor alternatives include Vendure, Shopify Hydrogen, commercetools, BigCommerce with Catalyst, and WooCommerce. ## How Medusa and Saleor differ at a glance Medusa and Saleor are both open-source, headless commerce platforms backed by PostgreSQL. They differ in language, API style and how you extend them. Saleor facts come from Saleor's own repository, docs and pricing page; GitHub stars are as of October 29, 2026. | Area | Medusa | Saleor | | --- | --- | --- | | Language | TypeScript on Node.js | Python on Django | | API style | REST: Store API, Admin API and your own API routes | GraphQL only | | Extension model | Modules, workflows, subscribers and API routes inside the application, packaged as plugins | Apps: separate services using webhooks and the GraphQL API, in any language | | Admin | Medusa Admin, extended with widgets and UI routes | Saleor Dashboard, extended by apps rendered inside it | | License | MIT (RBAC and SSO are Enterprise Edition) | BSD-3-Clause | | Managed hosting | Medusa Cloud: $29, $99 or $299 per month, 0% GMV fee | Saleor Cloud: free Sandboxes, paid plans from $1,599 per month with a GMV allowance | | GitHub stars | 36,991 | 23,487 | ## Architecture: in-process framework versus API-only service Medusa is a TypeScript application framework. Requests go from API routes to workflows to modules to PostgreSQL, and your code runs in the same process as the commerce modules, per [Medusa's architecture docs](https://docs.medusajs.com/learn/introduction/architecture). You add a custom [module](https://docs.medusajs.com/learn/fundamentals/modules), link it to core modules, and orchestrate changes with [workflows](https://docs.medusajs.com/learn/fundamentals/workflows) that roll back across steps. Saleor describes itself as "GraphQL native, API-only". Custom logic lives in [apps](https://docs.saleor.io/developer/extending/apps/overview) deployed separately, which Saleor says reduces downtime and lets extensions scale independently. Saleor's [README](https://github.com/saleor/saleor) also notes that for a single developer on a small store, this service-oriented approach can feel more complex than a framework you extend in place. ## Hosting and cost: Medusa Cloud versus Saleor Cloud Both platforms are free to self-host. [Medusa Cloud](https://medusajs.com/pricing) lists Develop at $29, Launch at $99 and Scale at $299 per month, with a 0% GMV fee on every plan. [Saleor Cloud](https://saleor.io/pricing) lists free Sandboxes, Select at $1,599 per month (up to $200,000 monthly GMV, then 0.8% above that) and Volume at $3,999 per month (up to $1,000,000 monthly GMV, then 0.4%). Enterprise pricing is custom. ## When to choose Saleor and when to choose Medusa Choose Saleor if your team wants a GraphQL-only API as its single contract, prefers extensions as separate services in any language, or works in Python and Django. Choose Medusa if your team works in TypeScript and wants custom data models and business logic inside the commerce backend, prefers REST, or wants flat managed hosting with no GMV fee. For B2B, Medusa's open-source [B2B Starter](https://github.com/medusajs/b2b-starter) adds companies, quotes and approvals. Medusa is not the right fit if your organization has standardized on GraphQL across services or does not want to run a Node.js service. ## What are the alternatives to Saleor? Teams leave or skip Saleor for three main reasons: they want TypeScript instead of Python, they want lower managed-hosting cost, or they want a hosted SaaS instead of running a platform. The main alternatives: | Alternative | Stack and license | When it fits | | --- | --- | --- | | Medusa | TypeScript, REST, MIT (RBAC and SSO Enterprise) | TypeScript teams that want custom commerce logic in the backend and no GMV fee | | Vendure | TypeScript, NestJS, GraphQL, GPLv3 core with commercial license in paid plans | Teams that want GraphQL like Saleor but in TypeScript | | Shopify Hydrogen | React Router storefront on Oxygen, Shopify Storefront API | Brands fine with Shopify's backend that want a custom storefront | | commercetools | Proprietary SaaS, REST and GraphQL, quote-based pricing | Large enterprises that require a vendor-operated platform | | BigCommerce with Catalyst | Hosted SaaS backend, MIT Next.js storefront on the GraphQL Storefront API | Merchants who want a hosted backend and a Next.js headless frontend | | WooCommerce | PHP on WordPress, GPL-2.0 | PHP teams and content-heavy stores already on WordPress | The closest like-for-like swap for a GraphQL team is Vendure. The closest swap for a team that wants open source and code-level control in TypeScript, with REST, is Medusa. Hydrogen, commercetools and BigCommerce trade backend control for a hosted service. ## Common questions ### Does Medusa have a GraphQL API like Saleor? No. Medusa's Store API, Admin API and custom API routes are REST. Teams that need GraphQL as their main API contract should look at Saleor or Vendure. ### Is Saleor Cloud more expensive than Medusa Cloud? On listed prices, yes. Saleor's pricing page lists paid Cloud plans from $1,599 per month with a GMV allowance and a percentage above it, while Medusa Cloud lists $29, $99 and $299 per month with a 0% GMV fee. Both are free to self-host. ### What is the closest open-source alternative to Saleor with GraphQL? Vendure is the closest GraphQL alternative to Saleor. It is TypeScript on NestJS with typed GraphQL Shop and Admin APIs, and its core is GPLv3, with a commercial license included in its paid plans. ### Can I write Saleor extensions in TypeScript? Yes. Saleor apps are separate services that communicate through webhooks and the GraphQL API, so you can write them in TypeScript or any other language. Saleor's core itself is Python. ### Which has more GitHub stars, Medusa or Saleor? As of October 29, 2026, Medusa's repository has 36,991 GitHub stars and Saleor's has 23,487. ## Documentation - [Medusa's architecture](https://docs.medusajs.com/learn/introduction/architecture) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Workflows](https://docs.medusajs.com/learn/fundamentals/workflows) - [API routes](https://docs.medusajs.com/learn/fundamentals/api-routes) - [Admin development](https://docs.medusajs.com/learn/fundamentals/admin) ## Related - [Medusa vs Vendure](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Switching from WooCommerce to a JavaScript stack](https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) --- title: "Commerce backend for a React Native shopping app" description: "Which commerce backend to use for a React Native or Expo shopping app: Medusa's JS SDK and Store API, Shopify Storefront API, Firebase, and mobile payments." url: https://medusajs.com/kb/headless-checkout/react-native-commerce-backend last_updated: 2026-10-29T11:36:34Z topic: "headless-checkout" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://docs.medusajs.com/resources/storefront-development/guides/react-native-expo" - "https://docs.medusajs.com/resources/js-sdk" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.medusajs.com/api/store" - "https://github.com/stripe/stripe-react-native" - "https://shopify.dev/docs/api/storefront" - "https://developer.apple.com/app-store/review/guidelines/" --- # Commerce backend for a React Native shopping app > A React Native or Expo shopping app needs a headless commerce backend with an HTTP API for products, carts, checkout, customers and orders. Medusa is an open-source TypeScript option: its JS SDK runs in React Native, stores auth tokens in AsyncStorage, and its Store API covers the full checkout. Shopify's Storefront API is the hosted alternative. ## What a mobile shopping app needs from a commerce backend A React Native shopping app is a client like any web storefront. It needs a backend that exposes commerce logic over HTTP, because product data, prices, stock and orders must live on a server, not in the app bundle. The backend should provide: - Catalog: products, variants, categories, prices per region and currency. - Carts: server-side carts that survive app restarts and can be recovered by ID. - Checkout: shipping options, tax calculation, promotions and payment sessions. - Customers: registration, login and token-based auth suited to mobile. - Orders: order history, status and returns. - An admin: a dashboard so non-developers manage products and orders without an app release. ## How Medusa works with React Native and Expo Medusa is a headless commerce platform: its [Store API](https://docs.medusajs.com/api/store) serves products, carts, checkout, customers and orders to any client. Medusa maintains a [React Native and Expo guide](https://docs.medusajs.com/resources/storefront-development/guides/react-native-expo) that builds a full app with product listing, region selection, cart and checkout, with the [full code on GitHub](https://github.com/medusajs/examples/tree/main/react-native-expo). The app talks to Medusa through the [JS SDK](https://docs.medusajs.com/resources/js-sdk) (@medusajs/js-sdk). For mobile, the guide sets auth.type to jwt, auth.jwtTokenStorageMethod to custom, and passes AsyncStorage as auth.storage. The auth.storage option is available after Medusa v2.5.1. npm install @medusajs/js-sdk @medusajs/types @react-native-async-storage/async-storage Every request includes a [publishable API key](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys), which scopes the app to one or more sales channels. The app stores the cart ID locally and reloads the cart from the server on launch. ## Taking payments in a React Native app Medusa's Payment Module delegates to payment providers. The React Native guide uses Medusa's built-in manual provider (pp_system_default) for testing; production apps add a real provider such as [Stripe](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe). On the device, Stripe's [React Native SDK](https://github.com/stripe/stripe-react-native) provides PaymentSheet, which accepts cards, Apple Pay and Google Pay and supports Expo. Medusa's Stripe provider has an automatic_payment_methods option, which the docs describe as useful when you integrate wallets like Apple Pay or Google Pay. Apple's [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) require apps that sell physical goods to use payment methods other than in-app purchase. So a commerce app uses a payment provider, not StoreKit. ## Alternatives for a React Native commerce backend | Option | What you get | Trade-offs | | --- | --- | --- | | Medusa | Open-source TypeScript backend, REST Store API, JS SDK, admin dashboard, custom modules | You host it, or use Medusa Cloud from $29/month with a 0% GMV fee | | Shopify Storefront API | Hosted catalog, cart and checkout through a GraphQL API | Checkout and data model are Shopify's; custom logic lives in apps; Shopify plan fees apply | | Firebase or Supabase custom build | Auth, database and functions you assemble yourself | No commerce logic: you build carts, pricing, tax, inventory and order states | | Payment-only (Stripe alone) | Payments and basic product objects | No inventory, fulfillment, promotions or order management | Medusa fits when your team writes TypeScript and wants the backend logic in code it controls. Shopify fits when you want hosted commerce and are comfortable with Shopify's checkout and limits. A custom Firebase build only makes sense for very small catalogs with simple orders. ## Sharing one backend between app and web Medusa serves mobile and web clients from the same Store API. You can run a React Native app and a Next.js storefront against one backend, with sales channels and publishable API keys separating catalogs if needed. Customer accounts, carts and orders are shared, so a customer sees the same order history in both. ## Common questions ### Does the Medusa JS SDK work in React Native? Yes. Medusa's React Native and Expo guide installs @medusajs/js-sdk in an Expo app and configures JWT authentication with a custom storage, using @react-native-async-storage/async-storage to persist the token. ### Do I need a web storefront to use Medusa with a mobile app? No. Medusa is headless, so a React Native app can be the only client of the Store API. You can install Medusa without the Next.js Starter Storefront and add a web storefront later against the same backend. ### Can I use Apple's in-app purchase for physical products in my shopping app? No. Apple's App Store Review Guidelines require apps selling physical goods or services used outside the app to use purchase methods other than in-app purchase, such as Apple Pay or card entry. A payment provider like Stripe handles this. ### Can I use Firebase as the backend for a shopping app? Firebase can store products and orders, but it has no cart, pricing, tax, inventory, promotion or order lifecycle logic. You would build all of that yourself, which a commerce backend like Medusa already provides. ## Documentation - [Implement a mobile app with React Native, Expo, and Medusa](https://docs.medusajs.com/resources/storefront-development/guides/react-native-expo) - [Medusa JS SDK](https://docs.medusajs.com/resources/js-sdk) - [Publishable API keys](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys) - [Stripe Payment Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) ## Related - [How to add a cart and checkout to an existing Next.js site](https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) - [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "How to add a cart and checkout to an existing Next.js site" description: "Add a cart and checkout to a Next.js site: Snipcart, Shopify Buy Button, Stripe Checkout, and Medusa compared, plus the Medusa steps with JS SDK code." url: https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs last_updated: 2026-10-29T06:55:50Z topic: "headless-checkout" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md" sources: - "https://docs.medusajs.com/resources/js-sdk" - "https://docs.medusajs.com/resources/storefront-development/checkout" - "https://docs.medusajs.com/resources/storefront-development/checkout/payment/stripe" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.medusajs.com/resources/storefront-development/publishable-api-keys" - "https://docs.medusajs.com/resources/nextjs-starter" - "https://docs.medusajs.com/learn/introduction/architecture" - "https://docs.medusajs.com/cloud/faq" - "https://docs.medusajs.com/cloud/storefront" - "https://docs.medusajs.com/cloud/projects" - "https://docs.medusajs.com/user-guide/products/import" - "https://docs.medusajs.com/resources/storefront-development/cart/create" - "https://docs.medusajs.com/resources/storefront-development/cart/manage-items" - "https://docs.medusajs.com/resources/storefront-development/guides/express-checkout" - "https://github.com/medusajs/dtc-starter/blob/main/apps/storefront/src/lib/data/cart.ts" - "https://medusajs.com/pricing" - "https://snipcart.com/pricing" - "https://docs.snipcart.com/v3/setup/installation" - "https://docs.snipcart.com/v3/setup/customization" - "https://docs.snipcart.com/v3/setup/products" - "https://help.shopify.com/en/manual/online-sales-channels/buy-button" - "https://shopify.dev/docs/storefronts/headless/building-with-the-storefront-api/cart/manage" - "https://shopify.dev/docs/api/checkout-ui-extensions" - "https://docs.stripe.com/payments/checkout" - "https://stripe.com/pricing" --- # How to add a cart and checkout to an existing Next.js site > To add a cart and checkout to an existing Next.js site and keep your own design, connect it to a commerce backend such as Medusa. Medusa runs as a separate Node.js app with PostgreSQL, which Medusa Cloud hosts from $29/month. Your Next.js app calls it through the @medusajs/js-sdk package for carts, shipping, Stripe payments, and orders. ## Three ways to add a cart and checkout to a Next.js site You have three realistic options when you have a Next.js site for your brand and want to sell about 50 products while keeping your own design: a drop-in cart (Snipcart or the Shopify Buy Button), payments only (Stripe Checkout), or a commerce backend such as Medusa. They differ in who owns the checkout UI and who stores products, stock, and orders. | Option | Design control | Custom checkout | Inventory, orders, tax | Fees | Setup | | --- | --- | --- | --- | --- | --- | | Snipcart | Your pages; the cart is Snipcart's UI, restyled through template and CSS overrides | Override Snipcart's components inside its cart | Check vendor docs | 2% per transaction, or $20/month under $1,000 monthly sales, plus gateway fees | Script tag plus data attributes on buy buttons | | Shopify Buy Button or Storefront API | Your pages; the Storefront API cart redirects to Shopify's web checkout | Extensions on the information, shipping, and payment steps need Shopify Plus | Managed in Shopify | Shopify plan fees, check vendor pricing | Embed code, or a headless cart with the Storefront API | | Stripe Checkout | Hosted page, embedded form, or Elements with full CSS control | Payment page; you build cart, shipping, and order screens | Stripe Tax is available; stock tracking and order management live in your own code | 2.9% + 30¢ per US domestic card payment | Checkout Sessions API plus your own webhooks | | Medusa | Your pages and your checkout UI | Every step through the Store API | Native Medusa modules | Medusa Cloud from $29/month with 0% GMV fee, plus payment provider fees | Medusa backend plus the JS SDK in Next.js | ## Do I need a separate backend to sell from Next.js with Medusa? Yes. Medusa is a separate Node.js application backed by a PostgreSQL database, and your Next.js app talks to it over HTTP through the Store API. Medusa only supports PostgreSQL as its database, according to the [architecture docs](https://docs.medusajs.com/learn/introduction/architecture). You don't have to run that backend yourself. [Medusa Cloud](https://medusajs.com/pricing) hosts the Medusa server, admin dashboard, PostgreSQL, and file storage on every plan, adds managed Redis from the Launch plan, and can also host a Next.js storefront kept in the same monorepo. Plans start at $29/month (Develop), with Launch at $99 and Scale at $299, and every plan has a 0% GMV fee. If your Next.js app stays on another host, it calls the Medusa backend by URL. ## Before you start - A Next.js app (App Router works with server actions). - A Medusa application, created on Medusa Cloud or locally with `npx create-medusa-app@latest`. - A Stripe account with secret and publishable keys. ## 1. Create the Medusa backend and add products Create a project on Medusa Cloud, or install Medusa locally. Then add your products, a region with its currency, and shipping options in the Medusa Admin. For about 50 products, entering them in the admin or importing a CSV is enough. ## 2. Install the JS SDK in your Next.js app The `@medusajs/js-sdk` package wraps Medusa's Store API. Store requests need a publishable API key, which you create in the Medusa Admin and which scopes requests to a sales channel. Add your Next.js origin to the backend's `STORE_CORS` setting. ```ts // lib/sdk.ts (npm install @medusajs/js-sdk @medusajs/types) import Medusa from "@medusajs/js-sdk" export const sdk = new Medusa({ baseUrl: process.env.NEXT_PUBLIC_MEDUSA_BACKEND_URL!, publishableKey: process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY, }) ``` ## 3. Add cart server actions Next.js server actions keep cart logic on the server. Medusa's Next.js Starter Storefront uses the same pattern, storing the cart ID in a cookie. Create the cart with `sdk.store.cart.create({ region_id })`, then add items: ```ts "use server" import { sdk } from "@/lib/sdk" export async function addToCart(cartId: string, variantId: string) { const { cart } = await sdk.store.cart.createLineItem(cartId, { variant_id: variantId, quantity: 1, }) return cart } ``` ## 4. Build the checkout steps Medusa's checkout runs on the cart: set the email and addresses with `sdk.store.cart.update`, list shipping options with `sdk.store.fulfillment.listCartOptions`, and pick one with `sdk.store.cart.addShippingMethod`. Each step is a form in your own design. The [checkout guides](https://docs.medusajs.com/resources/storefront-development/checkout) cover each call. ## 5. Take payment with Stripe and place the order Register the [Stripe Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) in `medusa-config.ts` and enable it in your region. In the storefront, call `sdk.store.payment.initiatePaymentSession(cart, { provider_id: "pp_stripe_stripe" })`, render Stripe's card form with the returned client secret, then call `sdk.store.cart.complete(cart.id)`. A response with `type: "order"` means the order was placed. The [Stripe storefront guide](https://docs.medusajs.com/resources/storefront-development/checkout/payment/stripe) has the full component. ## When Medusa is not the right choice - You have no developer and want to start selling this week: a drop-in cart or the Shopify Buy Button needs no backend. - You sell a few digital products or one subscription: Stripe Checkout alone may cover it. - You want zero hosting cost at very low volume: a Medusa backend is an extra service, even on Medusa Cloud. Medusa fits when you want your own checkout design, plan to grow past a simple catalog, or need inventory, promotions, returns, and multiple regions without per-transaction platform fees. ## Common questions ### Do I need a separate backend to use Medusa with Next.js? Yes. Medusa is a separate Node.js application that uses PostgreSQL as its database, and your Next.js app calls its Store API. Medusa Cloud hosts the backend, admin, and database for you, adds managed Redis from the Launch plan, and can host a Next.js storefront kept in the same monorepo. ### Does Medusa work with the Next.js App Router and server actions? Yes. Medusa's Next.js Starter Storefront calls the JS SDK from server actions in a "use server" file, for example to create carts, add line items, and complete the cart. ### Is Medusa a Snipcart alternative? Medusa covers the same need differently. Snipcart adds its own cart UI through a script tag and charges 2% per transaction, while Medusa is a commerce backend with no transaction fee where you build the cart and checkout UI yourself. ### Can I start from a template instead of my existing Next.js app? Yes. Running npx create-medusa-app@latest --with-nextjs-starter installs a Medusa backend and the Next.js Starter Storefront in one monorepo. Medusa Cloud also offers starters with a Next.js storefront. ## Documentation - [Medusa JS SDK](https://docs.medusajs.com/resources/js-sdk) - [Checkout in Storefront](https://docs.medusajs.com/resources/storefront-development/checkout) - [Stripe in the storefront checkout](https://docs.medusajs.com/resources/storefront-development/checkout/payment/stripe) - [Use a Publishable API Key in the Storefront](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys) - [Next.js Starter Storefront](https://docs.medusajs.com/resources/nextjs-starter) ## Related - [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [Easiest ecommerce stack to build with AI coding tools](https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md) --- title: "ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained" description: "ACP, UCP, AP2, and MCP compared: who backs each agentic commerce protocol, which layer it covers, where it is used, and how Medusa supports it today." url: https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md" - "https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md" - "https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents.md" sources: - "https://agenticcommerce.dev/" - "https://developers.openai.com/commerce/guides/key-concepts" - "https://developers.openai.com/commerce/guides/production" - "https://developers.google.com/merchant/ucp" - "https://ucp.dev/" - "https://ap2-protocol.org/" - "https://modelcontextprotocol.io/docs/getting-started/intro" - "https://shopify.dev/docs/agents" - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce" - "https://docs.medusajs.com/cloud/medusa-mcp" --- # ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained > ACP (OpenAI and Stripe) covers the product feed, checkout, and delegated payment for ChatGPT. UCP (Google, with Shopify and other retailers) covers catalog, checkout, and orders for Google AI Mode and Gemini. AP2 proves payment authorization. MCP connects AI apps to tools. Medusa has an official ACP guide; UCP and AP2 are custom. ## What is an agentic commerce protocol? An agentic commerce protocol is a shared specification that lets an AI agent find products, check out, or pay on a buyer's behalf with a store it has no custom integration with. The four names that come up most are ACP, UCP, AP2, and MCP. They overlap less than they seem: each covers a different layer of the purchase, and some are designed to work together. ## ACP vs UCP vs AP2 vs MCP at a glance | Protocol | Backed by | Layer it covers | Where it is used | License | Medusa status | | --- | --- | --- | --- | --- | --- | | ACP (Agentic Commerce Protocol) | OpenAI and Stripe | Product feed, checkout, delegated payment | ChatGPT Instant Checkout | Apache 2.0 | Official guide | | UCP (Universal Commerce Protocol) | Google, co-developed with retailers and platforms including Shopify, Etsy, Wayfair, Target, and Walmart | Catalog, cart, checkout, identity linking, and orders, with pluggable payment handlers | AI Mode in Google Search and Gemini | Apache 2.0 | Custom | | AP2 (Agent Payments Protocol) | Google; v0.2 donated to the FIDO Alliance | Payment authorization with signed mandates | Extension for A2A and UCP | Open protocol; check the AP2 site | Custom | | MCP (Model Context Protocol) | Open-source standard | Tool and data access for any AI app, not commerce-specific | Claude, ChatGPT, VS Code, Cursor, and others | Open source; check the MCP site | Custom for shoppers | ## What is ACP? The Agentic Commerce Protocol (ACP) is the protocol OpenAI uses for Instant Checkout in ChatGPT. Stripe and OpenAI developed it, and [agenticcommerce.dev](https://agenticcommerce.dev/) publishes it as open source under Apache 2.0. According to [OpenAI's key concepts](https://developers.openai.com/commerce/guides/key-concepts), a merchant implements three flows: - A product feed so ChatGPT can index the catalog. - The Agentic Checkout Spec: REST endpoints such as `POST /checkout_sessions` that ChatGPT calls to create, update, and complete a checkout. - The Delegated Payment Spec, where a payment provider issues a scoped one-time token. Stripe's Shared Payment Token is the first implementation. OpenAI is not the merchant of record. The store charges the payment on its own stack and owns refunds. ## What is UCP? The Universal Commerce Protocol (UCP) is an open standard for agents to discover, buy, and track orders across merchants. Google uses it for agentic checkout in AI Mode in Google Search and Gemini, as its [UCP page](https://developers.google.com/merchant/ucp) describes. [ucp.dev](https://ucp.dev/) lists capabilities for catalog, cart, checkout, identity linking (for example, OAuth 2.0 account linking), and orders. UCP runs over REST and JSON-RPC, with built-in support for AP2, A2A, and MCP. Google's page says the merchant remains the merchant of record and can reuse Merchant Center shopping feeds. ## What is AP2? The Agent Payments Protocol (AP2) is an open protocol for proving that a buyer authorized a payment an agent makes. [ap2-protocol.org](https://ap2-protocol.org/) describes it as an extension for the Agent2Agent (A2A) protocol and UCP. AP2 uses verifiable digital credentials called mandates. A checkout mandate records what the user approved for a purchase. A payment mandate authorizes a specific amount for that checkout, and goes to the credential provider and payment processor. AP2 does not define a catalog or a checkout flow on its own. ## What is MCP? The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro) is an open-source standard for connecting AI applications to external data and tools. A store can expose tools such as product search or cart creation through an MCP server, and any MCP client can call them. MCP has no commerce rules of its own. UCP and ACP both offer MCP as a transport, so MCP is often the wire a commerce protocol travels on rather than an alternative to one. ## How do the protocols fit together? The protocols stack by layer rather than compete one-to-one: - **Discovery**: an ACP product feed, UCP catalog capability, or MCP tools that search the catalog. - **Checkout**: ACP checkout sessions or the UCP checkout capability. - **Payment**: the ACP Delegated Payment Spec, or AP2 mandates under UCP. - **Transport**: REST, MCP, or A2A carries the calls. A store that wants to sell in both ChatGPT and Google AI Mode implements ACP and UCP side by side. Both map onto the same cart, order, and payment logic in the backend. ## Where does Medusa fit for each protocol? Medusa is an open-source commerce platform whose cart, order, and payment modules can sit behind any of these protocols. For ACP, Medusa has an [official guide](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) with example code that builds the feed, the checkout session routes, and order webhooks. The guide's feed upload step is a stub you complete after OpenAI approval. UCP and AP2 have no Medusa guide yet, so you build them as custom API routes and workflows. The [Medusa MCP](https://docs.medusajs.com/cloud/medusa-mcp) server on Medusa Cloud is read-only and serves store operators, not shopping agents. ## When is Medusa not the right choice? - You want agent checkout channels managed for you with no code. Shopify documents UCP-based agent tools for its merchants on [shopify.dev](https://shopify.dev/docs/agents). - You have no developer to implement and maintain protocol endpoints. ## Common questions ### Is ACP open source? Yes. The Agentic Commerce Protocol is open source under the Apache 2.0 license, published at agenticcommerce.dev by Stripe and OpenAI. ### Is UCP the same as AP2? No. UCP defines catalog, cart, checkout, and order capabilities, while AP2 handles proof that the buyer authorized a payment. UCP uses AP2 for secure payment. ### Do I need MCP to sell through AI agents? Not necessarily. ChatGPT Instant Checkout uses ACP's REST endpoints, but UCP and ACP both support MCP as a transport, so an MCP server is one way to expose commerce tools to agents. ### Does Medusa support UCP? Medusa has no UCP guide or plugin today. You can implement UCP endpoints as custom API routes and workflows on top of Medusa's cart and order modules. ## Documentation - [Implement Agentic Commerce (ChatGPT Instant Checkout) Specifications](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) - [Medusa MCP](https://docs.medusajs.com/cloud/medusa-mcp) ## Related - [How to let ChatGPT and other AI agents buy from your store](https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md) - [Best ecommerce backend for building AI shopping agents](https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md) - [Ecommerce platforms with MCP servers](https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md) - [How to make your product catalog visible to AI assistants](https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents.md) --- title: "How do I build an artisan marketplace with AI coding help?" description: "Build a handmade or local artisan marketplace with Mercur on Medusa: seller shops, Stripe Connect payouts, Medusa Cloud, and AI coding prompts to paste." url: https://medusajs.com/kb/marketplaces/artisan-marketplace last_updated: 2026-10-29T06:55:50Z topic: "marketplaces" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md" - "https://medusajs.com/kb/marketplaces/multi-vendor-marketplace.md" - "https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md" sources: - "https://medusajs.com/marketplace" - "https://medusajs.com/blog/get-started-with-mercur-2-0-on-cloud" - "https://docs.mercurjs.com/learn/introduction" - "https://docs.mercurjs.com/resources/integrations/stripe-connect" - "https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline" - "https://docs.mercurjs.com/resources/deployment/medusa-cloud" - "https://docs.mercurjs.com/resources/ai/overview" - "https://docs.mercurjs.com/resources/tutorials/extend-onboarding" - "https://docs.mercurjs.com/platform/commission/concepts/rules-and-rates" - "https://docs.mercurjs.com/platform/review/overview" - "https://github.com/mercurjs/mercur" - "https://medusajs.com/pricing" - "https://help.etsy.com/hc/en-us/articles/360035902374" --- # How do I build an artisan marketplace with AI coding help? > To build a marketplace for local artisans with AI coding help, start from Mercur, a marketplace platform on Medusa. It gives each artisan a vendor panel, splits orders per seller, and pays sellers through Stripe Connect. Deploy it on Medusa Cloud, then customize it with an agent like Claude Code, which reads Mercur's bundled docs. ## Before you start This path builds a marketplace where each artisan has their own shop and gets paid through Stripe Connect. It uses Mercur, which Medusa describes as an open core marketplace platform built by its Expert partners at Rigby, running on Medusa. - Node.js v24.22.1+ or v22.23.4+, Bun v1.3+, Git, and PostgreSQL v14+ ([Mercur requirements](https://docs.mercurjs.com/learn/introduction)) - A Stripe account with Connect enabled - A GitHub account and a [Medusa Cloud](https://medusajs.com/pricing) account - An AI coding agent such as Claude Code. The setup for Medusa's docs and Agent Skills is covered in the knowledge base entry on the ecommerce stack for AI coding. ## 1. Create the marketplace project The Mercur CLI downloads a template, installs dependencies, creates and seeds the database, and starts the dev server. ```bash bun create mercur-app@latest ``` The API runs at localhost:9000, the operator Admin Panel at /dashboard, and the Vendor Panel at /seller. The seed creates three approved demo sellers. A new artisan registers at /seller/register, completes the onboarding wizard, and lands in your admin approval queue. ## 2. Connect Stripe for seller payouts Mercur uses two Stripe integrations, per its [Stripe Connect guide](https://docs.mercurjs.com/resources/integrations/stripe-connect). Medusa's Stripe provider charges the customer once for the whole cart, and `@mercurjs/payout-stripe-connect` transfers each artisan's share to their connected account. You add two webhook endpoints in Stripe, each with its own signing secret. Each artisan completes identity and bank verification on a Stripe-hosted onboarding page. Stripe then pays out their balance to their bank on the account's payout schedule. "Automatic" needs one decision from you. Mercur's [payout pipeline](https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline) ships the payout workflow but not the trigger, so you choose when an order is paid out, for example after fulfillment. ## 3. Add a storefront The Mercur basic template has no storefront. Build one on the Mercur Store API, which handles multi-seller carts and seller listings, or start from the storefront app in the [Mercur monorepo](https://github.com/mercurjs/mercur) repository. ## 4. Deploy on Medusa Cloud Push the project to GitHub and import it in Medusa Cloud with `/packages/api` as the Medusa root directory. Mercur's [Medusa Cloud guide](https://docs.mercurjs.com/resources/deployment/medusa-cloud) says one deployment serves the API and both panels. Set `MERCUR_BACKEND_URL` with the Build toggle on, or the build fails. Medusa Cloud provisions Postgres and file storage on every plan, plus Redis from the Launch plan. Plans start at $29 per month with a 0% GMV fee. ## 5. Customize with your AI coding agent New Mercur projects ship `AGENTS.md` and `CLAUDE.md` files that tell agents to read the version-matched docs bundled in `node_modules/@mercurjs/docs` before coding ([Building with AI](https://docs.mercurjs.com/resources/ai/overview)). Prompts you can paste, each based on a documented Mercur feature: - "Read the Mercur docs index, then add a 'Maker story' field to vendor onboarding with a widget in the seller.setup.before zone, additional_data, and a sellersUpdated workflow hook." - "Create a 10% percentage commission rate with createCommissionRatesWorkflow, and a lower rate scoped to the Ceramics category with a commission rule." - "Write a subscriber on order.fulfillment_created that runs createPayoutWorkflow, and skip orders that are already paid out or whose payment isn't captured." - "Add a store route that returns a seller's published reviews and average rating using the Review module's rating helpers." - "Run bun run build and bun run lint, and fix errors until both pass." ## What you get out of the box with Mercur - Seller registration, onboarding, and operator approval - A Vendor Panel where each artisan manages offers, orders, returns, payouts, and team members - One checkout across sellers, split into one order per seller under an order group - Commission rules by seller, product, type, collection, or category - Product and store reviews with moderation ## Etsy vs your own artisan marketplace As of October 2026, Etsy's [fee page](https://help.etsy.com/hc/en-us/articles/360035902374) lists a $0.20 listing fee and a 6.5% transaction fee, plus payment processing. | Question | Selling on Etsy | Your own marketplace on Mercur and Medusa | | --- | --- | --- | | Who brings buyers | Etsy | You | | Fees per sale | $0.20 per listing, 6.5% transaction fee, plus payment processing | Your own commission; Stripe fees are paid by the platform | | Hosting | Included | Self-hosted, or Medusa Cloud from $29 per month with a 0% GMV fee | | Merchant of record | Check Etsy's seller terms | The marketplace, so VAT, disputes, and chargebacks are yours | | Code to maintain | None | Yours | ## When this is not the right path - **You sell your own work and don't need other sellers.** An Etsy shop or a single-seller store is less work. - **Nobody can run code.** Prompting an agent still means reviewing changes, running builds, and handling deploys. A hosted no-code marketplace builder fits better. - **You can't handle refunds.** Mercur doesn't reverse seller transfers when you refund a customer; you reconcile those yourself. ## Common questions ### Can I build an Etsy alternative without being a full-time developer? Yes, with limits. Mercur gives you a working marketplace on Medusa, and an AI coding agent can make documented changes, but someone still needs to review code, run builds, and handle deploys. ### Do artisans get paid automatically with Mercur? Partly. Mercur transfers each seller's share through Stripe Connect and Stripe pays out to the seller's bank on a schedule, but you write the trigger that decides when an order is paid out, such as after fulfillment. ### Does each artisan get their own shop page? Each artisan gets a seller account and a Vendor Panel to manage their own offers, orders, and payouts. How their shop page looks on the storefront depends on the storefront you build or adopt. ### How much does it cost to run an artisan marketplace on Medusa? Mercur and Medusa are free to self-host. Medusa Cloud plans start at $29 per month with a 0% GMV fee, and Stripe charges its own payment and Connect fees. ## Documentation - [Marketplace recipe](https://docs.medusajs.com/resources/recipes/marketplace) - [Medusa Stripe Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) ## Related - [Easiest ecommerce stack to build with AI coding tools](https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md) - [How do I build a multi-vendor marketplace with open source?](https://medusajs.com/kb/marketplaces/multi-vendor-marketplace.md) - [How do Stripe Connect payouts work for a marketplace?](https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md) --- title: "B2B company accounts, buyer roles and approval workflows" description: "How Medusa handles B2B company accounts, buyer roles, spending limits and purchase approvals, and how to add multi-level approval rules with workflow hooks." url: https://medusajs.com/kb/b2b/b2b-company-accounts-approvals last_updated: 2026-10-29T06:55:50Z topic: "b2b" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-quotes-rfq.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" - "https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md" sources: - "https://github.com/medusajs/b2b-starter" - "https://docs.medusajs.com/resources/recipes/b2b" - "https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/user-guide/price-lists/create" - "https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction" - "https://docs.bigcommerce.com/developer/docs/b2b-edition/getting-started/overview" - "https://doc.oroinc.com/user/storefront/" - "https://help.shopify.com/en/manual/b2b/companies/customer-permissions" --- # B2B company accounts, buyer roles and approval workflows > Medusa handles B2B company accounts through the official B2B Starter. A Company module groups employees, each linked to a customer with a spending limit and an admin flag. An Approval module requires company admin or sales manager approval before checkout. Value-based or multi-level approval rules are custom, built with workflow hooks. ## How company accounts work in the Medusa B2B Starter Company accounts in Medusa come from the official [Medusa B2B Starter](https://github.com/medusajs/b2b-starter), not from Medusa core. The starter adds a Company module with two data models: - **Company**: name, email, phone, address, `currency_code`, and `spending_limit_reset_frequency`. A company has many employees. - **Employee**: belongs to one company, is linked to a Medusa customer, and has a `spending_limit` and an `is_admin` flag. A company can be linked to a customer group. The starter then adds every employee to that group, so [price lists](https://docs.medusajs.com/user-guide/price-lists/create) with a customer group condition give all employees the company's negotiated prices. The [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b) describes the same pattern of linking a custom Company module to customers and groups. ## Buyer roles in Medusa The Medusa B2B Starter has two buyer roles. A company admin (`is_admin` set to true) manages the company and handles approvals in the storefront. An employee places orders within their spending limit. The starter's store approval routes check for the `company_admin` role before letting a customer approve or reject. Finer-grained roles, such as a role that can quote but not order, are Custom. You add them by extending the Employee model and the route middleware. ## How spending limits work Spending limits in the B2B Starter are enforced at checkout. The starter consumes the `validate` hook of Medusa's [completeCartWorkflow](https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow), which runs before the order is created and payment is authorized. If the cart would push the employee past their spending limit for the current period, the hook throws and the order is not placed. Each company sets how often limits reset: never, daily, weekly, monthly, or yearly. The default is monthly. ## How purchase approval workflows work Purchase approvals in the B2B Starter live in an Approval module. Each company has approval settings with two switches: `requires_admin_approval` and `requires_sales_manager_approval`. 1. An employee submits their cart for approval. The starter creates one pending approval per enabled type: `admin`, `sales_manager`, or both. 2. While an approval is pending, `validate` hooks on add-to-cart and cart completion block changes and checkout. 3. A company admin approves or rejects `admin` approvals from the storefront. A merchant user handles `sales_manager` approvals in Medusa Admin. 4. Once every approval is granted, the employee completes checkout. ## How to add multi-level approval rules Approval rules by order value or role, with several approval levels, are Custom in Medusa. The B2B Starter gives you the pieces to build them: 1. Add a rule data model to the Approval module, for example a minimum cart total, the approver role, and a level. 2. When an employee submits a cart, create one approval per matching rule instead of per switch. 3. Block checkout until every required approval is granted, using the same hook the starter uses: ```ts import { completeCartWorkflow } from "@medusajs/medusa/core-flows" import { MedusaError } from "@medusajs/framework/utils" completeCartWorkflow.hooks.validate(async ({ cart }, { container }) => { const approved = await allRequiredApprovalsGranted(cart.id, container) if (!approved) { throw new MedusaError(MedusaError.Types.NOT_ALLOWED, "Cart needs approval") } }) ``` `allRequiredApprovalsGranted` is your own function that reads the cart's approvals with Query and compares them to the rules. Learn more about [workflow hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks). ## Company accounts and approvals: Medusa vs other B2B platforms | Platform | Buyer roles | Approvals | Spending limits | | --- | --- | --- | --- | | Medusa (Starter) | Company admin, employee | Company admin and sales manager, per company | Per employee, periodic reset | | Adobe Commerce B2B | Roles and permissions per company | Purchase order approval rules by role and order | Check vendor docs | | BigCommerce B2B Edition | Company roles and permissions | Check vendor docs | Check vendor docs | | OroCommerce | Storefront roles, business units | Configurable workflows | Check vendor docs | | Shopify B2B | Ordering only, Location admin | Merchant reviews submitted orders | Check vendor docs | ## When Medusa is not the right choice for company accounts and approvals Medusa is a weaker fit if you need many predefined buyer roles or value-based approval rules without writing code. Adobe Commerce B2B and BigCommerce B2B Edition document configurable role and permission systems. Teams without developers should also look at Shopify B2B, which is configured from the admin. ## Common questions ### Are company accounts part of Medusa core? No. Company accounts, employees, and approvals come from the Medusa B2B Starter as custom modules. Medusa core provides customers and customer groups, which the starter links companies to. ### Do company employees get company-specific prices in Medusa? Yes. When you link a company to a customer group in the B2B Starter, its employees are added to that group, and price lists with that customer group condition apply to them. ### Can an employee belong to more than one company? Not in the Medusa B2B Starter. Its Employee model belongs to a single company. Supporting several companies per buyer is custom work. ### Can Medusa approvals depend on the order total? Not out of the box. The B2B Starter's approval settings are per-company switches. You add value-based rules by extending the Approval module and the completeCartWorkflow validate hook. ## Documentation - [B2B Recipe](https://docs.medusajs.com/resources/recipes/b2b) - [completeCartWorkflow reference](https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow) - [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [Create a Price List in Medusa Admin](https://docs.medusajs.com/user-guide/price-lists/create) ## Related - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [B2B quotes and RFQ: how quote-to-order works](https://medusajs.com/kb/b2b/b2b-quotes-rfq.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) - [Net terms, purchase orders and bulk ordering for B2B](https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md) --- title: "How to build a B2B store with custom pricing per customer" description: "Set customer-specific B2B prices in Medusa with customer groups, price lists, price rules, volume tiers and ERP prices, and how it compares to Shopify B2B." url: https://medusajs.com/kb/b2b/b2b-customer-specific-pricing last_updated: 2026-10-29T06:55:50Z topic: "b2b" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" sources: - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules" - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-calculation" - "https://docs.medusajs.com/resources/storefront-development/products/price" - "https://docs.medusajs.com/resources/references/js-sdk/admin/priceList" - "https://docs.medusajs.com/resources/recipes/erp" - "https://github.com/medusajs/b2b-starter" - "https://help.shopify.com/en/manual/b2b/getting-started/plan-features" --- # How to build a B2B store with custom pricing per customer > To build a B2B store with custom pricing per customer in Medusa, put each customer or company in a customer group and attach a price list with a customer.groups.id rule. Add quantity tiers with min_quantity, and fetch live prices from your ERP at add-to-cart when the ERP owns contract prices. All of this runs on Medusa's open-source Pricing Module. ## Before you start - A Medusa v2 application. The [Medusa B2B starter](https://github.com/medusajs/b2b-starter) is a good base: it adds companies and employees, and links each company to a customer group. - Buyers who log in. When the storefront sends the customer's session, Medusa uses the customer and their group to [retrieve customer-specific prices](https://docs.medusajs.com/resources/storefront-development/products/price). Anonymous visitors see default prices. - The Medusa JS SDK or Admin API, if you script price changes. Merchants can do the same in Medusa Admin. ## 1. Put each contract into a customer group Medusa's Customer Module organizes buyers into customer groups, and the Pricing Module uses the group as a price condition. Create one group per pricing agreement, such as "Acme Corp" or "Tier A distributors", and add the buyers to it. In the B2B starter, adding a company to a customer group also adds the company's employees. ## 2. Attach a price list to the group A price list in Medusa is a set of prices that applies only when its rules match. Give it a `customer.groups.id` rule and add the negotiated prices for the variants in the contract: ```ts await sdk.admin.priceList.create({ title: "Acme Corp contract 2026", description: "Negotiated prices for Acme Corp", status: "active", type: "override", rules: { "customer.groups.id": ["cusgrp_acme"] }, prices: [ { variant_id: "variant_123", amount: 42, currency_code: "usd" }, ], }) ``` Use the `override` type for contract prices: Medusa then returns the list price as both the calculated and the original price. The `sale` type keeps the default price as the original price, which suits time-boxed discounts. Price lists also accept `starts_at` and `ends_at`, so a contract can expire on a date. ## 3. Add rules directly to a variant's prices Medusa price rules restrict one price to a context, such as a customer group or region, without a price list. This suits a few group-wide prices that you set when you create the product: ```ts prices: [ { amount: 40, currency_code: "usd" }, { amount: 20, currency_code: "usd", rules: { "customer.groups.id": "cusgrp_wholesale" } }, ] ``` ## 4. Add quantity tiers Tiered pricing in Medusa uses `min_quantity` and `max_quantity` on a price, and the calculation picks the tier that matches the quantity in the cart. Tiers work on default prices and inside price lists, so a contract can carry its own volume breaks: ```ts prices: [ { variant_id: "variant_123", amount: 42, currency_code: "usd" }, { variant_id: "variant_123", amount: 38, currency_code: "usd", min_quantity: 100 }, ] ``` Since Medusa v2.17.2, merchants can also set quantity-based prices in a price list from the Medusa Admin bulk editor. ## 5. Fetch live prices from an ERP at add-to-cart When your ERP is the source of truth for contract prices, you don't have to copy them into Medusa. The [ERP recipe](https://docs.medusajs.com/resources/recipes/erp) builds a custom add-to-cart workflow that calls your ERP module, then passes the result to `addToCartWorkflow` as the item's `unit_price`: ```ts addToCartWorkflow.runAsStep({ input: { cart_id, items: [{ variant_id, quantity, unit_price: erpPrice }] }, }) ``` You expose the workflow through a custom Store API route. The [custom item price guide](https://docs.medusajs.com/resources/examples/guides/custom-item-price) walks through it end to end. ## Which customer pricing pattern should you use? | Situation | Use | Status | | --- | --- | --- | | A few pricing tiers (wholesale, distributor, VIP) | Customer group and price list per tier | Native | | Each company has its own negotiated prices | One customer group and price list per company | Native (company link: Starter) | | A few group prices set with the product | Price rules on the variant's prices | Native | | Volume breaks | min_quantity and max_quantity tiers | Native | | ERP owns prices and changes them often | Custom add-to-cart workflow with the ERP price | Official guide | | Formula prices, such as cost plus margin | Custom workflow or module | Custom | ## How to avoid price list sprawl in Medusa Customer-specific pricing grows fast when every account gets its own list for every period. A few habits keep it manageable: - Start with tier groups, and create per-company lists only for customers with real contracts. - Put only the exceptions in a list. The variant's default price covers everything else. - Use `starts_at` and `ends_at` for contract periods instead of deleting and re-creating lists. - Store the contract or ERP reference in the price list's `metadata` (available since Medusa v2.15.0). - Avoid putting one buyer in several groups that price the same variant, so the expected price stays easy to reason about. - When contracts change daily, let the ERP own them (step 5) instead of syncing price lists. ## How Medusa compares with Shopify B2B for per-customer pricing Shopify B2B sets prices through catalogs. According to [Shopify's plan comparison](https://help.shopify.com/en/manual/b2b/getting-started/plan-features), the Basic, Grow and Advanced plans allow up to 3 active catalogs across all B2B markets. Only Shopify Plus allows unlimited catalogs and assigning a catalog directly to a company or company location. Quantity price breaks are available on all B2B plans. Medusa does not gate price lists, customer groups or tiers by plan. The trade-off is that Medusa needs a developer to set up company accounts, the storefront and any ERP integration. ## When Medusa is not the right choice - You have no developer. Shopify B2B and BigCommerce ship company pricing as configuration, while Medusa expects code for company accounts and storefront changes. - Three catalogs cover all your pricing tiers and you don't need per-company prices. Shopify's non-Plus plans handle that without custom work. ## Common questions ### Can Medusa show different prices to different B2B customers? Yes. Medusa's Pricing Module applies a price list only when the logged-in customer belongs to the customer group in the list's rules, so each group or company sees its own negotiated prices. ### Does Medusa support tiered or volume pricing for wholesale? Yes. Each price in Medusa can set min_quantity and max_quantity, and the price calculation picks the tier that matches the quantity in the cart. Tiers work on default prices and on prices inside a price list. ### Can Medusa use contract prices from an ERP instead of storing them? Yes. Medusa's ERP recipe shows a custom add-to-cart workflow that retrieves the variant's price from the ERP and adds the item to the cart with that price as unit_price. ### Is there a limit on price lists in Medusa? Medusa does not gate price lists or customer groups by plan. They are part of the open-source Pricing and Customer Modules, on self-hosted Medusa and on every Medusa Cloud plan. ## Documentation - [Price Tiers and Rules](https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules) - [Create a Price List in Medusa Admin](https://docs.medusajs.com/user-guide/price-lists/create) - [ERP recipe: retrieve custom prices from ERP](https://docs.medusajs.com/resources/recipes/erp) - [Add items with custom prices to the cart](https://docs.medusajs.com/resources/examples/guides/custom-item-price) - [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b) ## Related - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [Net terms, purchase orders and bulk ordering for B2B](https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) --- title: "B2B ecommerce platform with quotes, company accounts and approval flows" description: "Compare B2B ecommerce platforms for quotes, company accounts and approval flows: Medusa, Adobe Commerce, BigCommerce, OroCommerce and Shopify B2B." url: https://medusajs.com/kb/b2b/b2b-ecommerce-platform last_updated: 2026-10-29T06:55:50Z topic: "b2b" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" - "https://medusajs.com/kb/b2b/b2b-quotes-rfq.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" - "https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" sources: - "https://github.com/medusajs/b2b-starter" - "https://docs.medusajs.com/resources/recipes/b2b" - "https://docs.medusajs.com/resources/examples/guides/quote-management" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules" - "https://docs.medusajs.com/user-guide/price-lists/create" - "https://docs.medusajs.com/resources/recipes/erp" - "https://docs.medusajs.com/user-guide/orders/draft-orders" - "https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction" - "https://docs.bigcommerce.com/developer/docs/b2b-edition/getting-started/overview" - "https://docs.bigcommerce.com/developer/api-reference/rest/b2b/storefront/shopping-list.md" - "https://doc.oroinc.com/user/storefront/" - "https://doc.oroinc.com/user/back-office/sales/price-lists/" - "https://help.shopify.com/en/manual/b2b" - "https://help.shopify.com/en/manual/b2b/catalogs/quantity-pricing" - "https://help.shopify.com/en/manual/b2b/payment-terms" - "https://help.shopify.com/en/manual/b2b/companies/customer-permissions" --- # B2B ecommerce platform with quotes, company accounts and approval flows > Medusa supports B2B ecommerce with quotes, company accounts and approval flows through its official B2B Starter, built on native price lists, tiered pricing, and sales channels. Companies, employees, spending limits, approvals, and quotes ship as open-source modules you can change. Punchout, requisition lists, net terms, and multi-level approval rules are custom work. ## What Medusa provides for B2B ecommerce Medusa covers B2B ecommerce in three layers. The core commerce modules handle B2B pricing and catalog rules. The official [Medusa B2B Starter](https://github.com/medusajs/b2b-starter) adds company accounts, employees, spending limits, approvals, quotes, and bulk add-to-cart as custom modules and workflows. Everything else, such as punchout or net terms, you build with the Medusa Framework. The tables on this page label each capability with one of four statuses: - **Native**: part of Medusa core. - **Starter**: included in the Medusa B2B Starter. - **Official guide**: a Medusa docs recipe or tutorial with example code. - **Custom**: you build it with custom modules, workflows, and API routes. ## B2B feature matrix: Medusa vs Adobe Commerce, BigCommerce, OroCommerce and Shopify This table maps common B2B ecommerce terms to Medusa and four other platforms. Competitor cells come from each vendor's own documentation. "Check vendor docs" means the capability was not confirmed there. | Capability | Medusa | Adobe Commerce B2B | BigCommerce B2B Edition | OroCommerce | Shopify B2B | | --- | --- | --- | --- | --- | --- | | Company accounts | Starter | Yes, with divisions | Yes | Yes, accounts and business units | Yes, companies | | Buyer roles and permissions | Starter (company admin, employee) | Yes | Yes | Yes | Yes (Ordering only, Location admin) | | Spending limits | Starter | Check vendor docs | Check vendor docs | Check vendor docs | Check vendor docs | | Approval workflows | Starter (company admin, sales manager) | Yes, purchase order approval rules | Check vendor docs | Yes, quote approval workflows | Merchant review of submitted orders | | RFQ and negotiable quotes | Starter, Official guide | Yes, negotiable quotes | Yes, sales quotes | Yes, RFQ and quotes | Check vendor docs | | Customer-specific price lists | Native | Yes, shared catalogs | Yes, price lists | Yes, per customer or group | Yes, catalogs (per company on Plus only) | | Tiered and volume pricing | Native | Check vendor docs | Check vendor docs | Check vendor docs | Yes, volume pricing | | Bulk and quick order | Starter (bulk add-to-cart) | Yes, Quick Order | Check vendor docs | Yes, Quick Order Form | Check vendor docs | | Requisition or shopping lists | Custom | Yes, requisition lists | Yes, shopping lists | Yes, shopping lists | Check vendor docs | | Net terms and payment on account | Custom | Yes, Pay on Account | Yes, invoices on net terms | Yes, payment terms | Yes, Net 7 to 90 | | Purchase orders | Custom | Yes | Yes | Check vendor docs | Check vendor docs | | Punchout (cXML, OCI) | Custom | Check vendor docs | Check vendor docs | Check vendor docs | Check vendor docs | | ERP sync | Official guide | Check vendor docs | Check vendor docs | Check vendor docs | Check vendor docs | | B2B-only catalog | Native | Yes, shared catalogs | Check vendor docs | Check vendor docs | Yes, catalogs | ## How Medusa implements quotes, company accounts and approval flows Medusa implements quotes, company accounts and approval flows in the B2B Starter as three custom modules: Company, Quote, and Approval. Their logic runs in workflows, so you change the rules in your own code. - **Company accounts**: a `Company` has many `Employee` records. Each employee is linked to a Medusa customer and has a `spending_limit` and an `is_admin` flag. - **Spending limits**: a validation hook on cart completion rejects an order that exceeds the employee's limit. Limits reset never, daily, weekly, monthly, or yearly per company. - **Approvals**: each company can require company admin approval, sales manager approval, or both before an order is placed. - **Quotes**: a customer requests a quote from the cart, the merchant edits prices and quantities in Medusa Admin, and an accepted quote becomes an order. The [quote management guide](https://docs.medusajs.com/resources/examples/guides/quote-management) walks through the same flow. - **Pricing and catalog**: [price lists](https://docs.medusajs.com/user-guide/price-lists/create) with customer group conditions, [tiered prices](https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules) with `min_quantity` and `max_quantity`, and a B2B sales channel with its own publishable API key, as described in the [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b). - **ERP**: the [ERP recipe](https://docs.medusajs.com/resources/recipes/erp) shows product sync, ERP prices at add-to-cart, and two-way order sync. ## When to choose Medusa for B2B Medusa fits B2B teams that have developers and rules that do not match a fixed feature set. - Your approval chains, pricing sources, or quote rules are specific to your business, and you want them in TypeScript code you control. - You want to own the code. The B2B Starter and Medusa's core are open source under the MIT license, and the starter's modules live in your repository. - You do not want to pay per B2B feature. The starter's features are source code in your project, not separately licensed add-ons. - You want to start from working code. Clone the B2B Starter, or deploy it from your [Medusa Cloud](https://cloud.medusajs.com) dashboard. ## When Medusa is not the right choice for B2B Medusa is not the best fit when nobody on the team writes code. The B2B Starter is a codebase you maintain, and gaps such as net terms are yours to build. Shopify documents B2B on its Basic, Grow, Advanced, and Plus plans, configured from the admin. Medusa is also a slower start if you need punchout, requisition lists, or multi-level approval rules on day one. Adobe Commerce B2B documents requisition lists and purchase order approval rules as built-in features. ## Common questions ### Is the Medusa B2B Starter free to use? Yes. The Medusa B2B Starter is open source under the MIT license, like Medusa's core. You pay only for hosting, either your own infrastructure or Medusa Cloud. ### Does Medusa support punchout catalogs? Medusa has no built-in punchout (cXML or OCI) support, and the B2B Starter does not include it. You build punchout as a custom module and API routes on the Medusa Framework. ### Can I use Medusa's B2B features without the B2B Starter? Yes. Price lists with customer group conditions, tiered pricing, and B2B sales channels are native to Medusa. The quote management guide shows how to add quotes to any Medusa application, and the B2B recipe outlines how to model companies as a custom module linked to customers and customer groups. ### Can one Medusa backend serve both B2B and B2C customers? Yes. Medusa's B2B recipe uses a separate B2B sales channel with its own publishable API key, so a B2B storefront only sees B2B products while other channels serve consumers. ## Documentation - [B2B Recipe](https://docs.medusajs.com/resources/recipes/b2b) - [Implement Quote Management in Medusa](https://docs.medusajs.com/resources/examples/guides/quote-management) - [Price Tiers and Rules](https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules) - [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp) ## Related - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) - [B2B quotes and RFQ: how quote-to-order works](https://medusajs.com/kb/b2b/b2b-quotes-rfq.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) - [Net terms, purchase orders and bulk ordering for B2B](https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) --- title: "Net terms, purchase orders and bulk ordering for B2B" description: "How to offer net-30 payment terms, pay on invoice, PO numbers, bulk ordering and credit limits in a Medusa B2B store, and what is native, starter or custom." url: https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering last_updated: 2026-10-29T06:55:50Z topic: "b2b" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" sources: - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider" - "https://docs.medusajs.com/resources/references/payment/provider" - "https://docs.medusajs.com/user-guide/orders/payments" - "https://docs.medusajs.com/resources/references/js-sdk/store/cart" - "https://docs.medusajs.com/resources/references/medusa-workflows/updateCartWorkflow" - "https://github.com/medusajs/medusa/blob/develop/packages/core/core-flows/src/cart/workflows/complete-cart.ts" - "https://github.com/medusajs/medusa/blob/develop/packages/medusa/src/api/store/carts/validators.ts" - "https://github.com/medusajs/b2b-starter" - "https://help.shopify.com/en/manual/b2b/getting-started/plan-features" - "https://help.shopify.com/en/manual/b2b/checkout-and-orders/payment-terms" - "https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction" --- # Net terms, purchase orders and bulk ordering for B2B > Medusa supports B2B net terms through its built-in system payment provider or a custom payment provider that authorizes now and captures when the invoice is paid. PO numbers fit in cart metadata, which Medusa copies to the order. The Medusa B2B starter adds bulk add-to-cart and per-employee spending limits, and company credit limits are a custom validation hook. ## How Medusa handles B2B payment terms and ordering Medusa is a commerce platform with a framework for customization, so B2B payment and ordering features are a mix of core modules, the [Medusa B2B starter](https://github.com/medusajs/b2b-starter) and custom code. This table maps common B2B terms to what exists today. | B2B term | What it means | How Medusa does it | Status | | --- | --- | --- | --- | | Net terms / pay on invoice | Buyer pays 7 to 90 days after ordering | System payment provider or custom payment provider, captured later in Medusa Admin | Native (provider), Custom (due dates) | | Invoices | PDF invoice per order | Invoice generator tutorial | Official guide | | Purchase order (PO) number | Buyer's reference on the order | Cart metadata, copied to the order | Native | | PO approvals | Manager approves before the order is placed | Approval module in the B2B starter | Starter | | Bulk add-to-cart | Many SKUs in one action | Bulk line-items route and quantity table | Starter | | CSV quick order | Upload a list of SKUs and quantities | Parse the file and call the bulk route | Custom | | Spending limits | Cap per buyer per period | Employee spending limit with reset frequency | Starter | | Company credit limit | Cap on unpaid balance per company | Validate hook on cart completion | Custom | ## How do you offer net-30 or pay on invoice in Medusa? Medusa's Payment Module ships a `system` payment provider (`pp_system`). It doesn't process payments and leaves collection to the merchant, similar to cash on delivery. Enable it in the region your B2B buyers use. Orders then arrive with an authorized payment, and staff click **Capture Payment** in Medusa Admin once the invoice is paid. For more control, build a custom payment provider that extends `AbstractPaymentProvider`. Its `authorizePayment` method can return `pending_authorization`, which still creates the order with an awaiting payment status. Medusa can call the method again later, from a webhook or an admin action, when your accounting system confirms payment. Due dates, reminders and per-company terms (net 30 vs net 60) are custom data you store in a module or in metadata. The [invoice generator tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/invoice-generator) shows how to generate invoices for orders, manage invoice settings in Medusa Admin and let customers access their invoices in the storefront. ## How do you capture purchase order numbers in Medusa? Medusa carts accept a `metadata` object through the Store API, and the complete-cart workflow copies the cart's metadata to the new order. A PO field at checkout needs one call: ```ts await sdk.store.cart.update(cartId, { metadata: { po_number: "PO-4417" }, }) ``` To validate or store the PO number in a custom module instead, pass it as `additional_data` and consume the `updateCartWorkflow` hook. ## How do bulk ordering and quick order work in Medusa? Medusa's Store API accepts an `items` array when you create a cart, so a reorder or quick-order page can create a filled cart in one request. Adding to an existing cart takes one item per request in core. The B2B starter adds a `POST /store/carts/{id}/line-items/bulk` route that runs `addToCartWorkflow` with many items, plus a bulk quantity table on product pages and a cart-to-CSV export. A CSV upload form is custom: parse the file in the storefront, map SKUs to variant IDs, then call the bulk route. ## How do you enforce credit limits in Medusa? The B2B starter stores a `spending_limit` on each employee and a reset frequency (never, daily, weekly, monthly or yearly) on the company. A `completeCartWorkflow.hooks.validate` handler rejects carts that would exceed the limit or that still wait for approval. A company-wide credit limit uses the same hook. Store the limit in a custom module, sum the company's unpaid orders, and throw an error when the new cart would push the balance over the limit. ## How this compares with Shopify B2B and Adobe Commerce Per [Shopify's plan comparison](https://help.shopify.com/en/manual/b2b/getting-started/plan-features), Shopify B2B includes net terms, PO numbers and quick order lists on all B2B plans, and Shopify's payment terms page lists net 7 to net 90 or due on fulfillment. Deposits and partial payments require Shopify Plus. [Adobe Commerce B2B](https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction) offers Pay on Account against a company credit line, purchase orders with approval rules and requisition lists. Medusa ships fewer of these as settings. In exchange, terms, limits and approvals are code you control, which helps when the rules come from an ERP or differ per account. ## When Medusa is not the right choice - You want net terms and PO numbers as admin settings with no development. Shopify B2B includes both on every B2B plan, and Adobe Commerce B2B includes pay on account and purchase orders. - You need requisition lists or punchout (cXML or OCI) on day one. Medusa has neither in core or the starter, so you would build them. ## Common questions ### Does Medusa support net 30 payment terms? Medusa has no built-in net terms setting. You offer pay on invoice with the system payment provider (pp_system) or a custom payment provider, then capture the payment in Medusa Admin when the invoice is paid. ### Can B2B buyers add a purchase order number at checkout in Medusa? Yes. The storefront can save the PO number in the cart's metadata through the Store API, and Medusa copies the cart's metadata to the order when the cart is completed. ### Does Medusa have a quick order or bulk order form? The Medusa B2B starter includes a bulk add-to-cart route and a bulk quantity table on product pages. A CSV upload form for quick orders is custom work on top of that route. ### Can Medusa block orders that exceed a customer's credit limit? Yes, with custom code. The Medusa B2B starter blocks orders over an employee's spending limit in a completeCartWorkflow validate hook, and the same hook can check a company credit limit you store in a custom module. ## Documentation - [Payment Module Provider (system provider)](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider) - [How to create a payment provider](https://docs.medusajs.com/resources/references/payment/provider) - [Manage order payments in Medusa Admin](https://docs.medusajs.com/user-guide/orders/payments) - [Generate invoices for orders](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/invoice-generator) - [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b) ## Related - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) --- title: "B2B quotes and RFQ: how quote-to-order works" description: "How B2B quotes and RFQ work in Medusa: request, merchant counter-offer, accept or reject, and conversion to an order, compared with Adobe and Oro." url: https://medusajs.com/kb/b2b/b2b-quotes-rfq last_updated: 2026-10-29T06:55:50Z topic: "b2b" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/examples/guides/quote-management" - "https://github.com/medusajs/b2b-starter" - "https://docs.medusajs.com/resources/commerce-modules/order/order-change" - "https://docs.medusajs.com/user-guide/orders/draft-orders" - "https://github.com/medusajs/examples/tree/main/quotes-management" - "https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/quotes/quotes" - "https://doc.oroinc.com/user/storefront/" - "https://doc.oroinc.com/user/back-office/sales/rfq/" - "https://doc.oroinc.com/user/back-office/sales/quotes/flows/" --- # B2B quotes and RFQ: how quote-to-order works > In Medusa, B2B quotes work through a Quote module from the official B2B Starter and quote management guide. A customer requests a quote from the cart, the merchant edits prices and quantities on a draft order in Medusa Admin, and the customer accepts or rejects. Accepting converts the draft order into a regular order. ## What RFQ and negotiable quotes mean in B2B ecommerce A request for quote (RFQ) is a buyer asking a seller to price a specific set of products before buying. A negotiable quote is a quote whose prices or quantities change as buyer and seller respond to each other. Quote-to-order is the step where an accepted quote becomes an order without the buyer re-entering the cart. Medusa does not ship quotes in its core commerce modules. The official [Medusa B2B Starter](https://github.com/medusajs/b2b-starter) includes a Quote module, and the [quote management guide](https://docs.medusajs.com/resources/examples/guides/quote-management) shows how to build the same flow step by step. ## How the quote-to-order lifecycle works in Medusa The Medusa quote flow builds on two native Order Module features: draft orders and [order changes](https://docs.medusajs.com/resources/commerce-modules/order/order-change). An order change records edits to an order's items, such as price or quantity updates, before they are applied. 1. **Request.** A logged-in customer requests a quote from their cart. The `createRequestForQuoteWorkflow` creates a draft order from the cart, begins an order edit on it, and creates a quote with status `pending_merchant`. 2. **Counter-offer.** The merchant opens the quote in Medusa Admin and edits item prices and quantities. The edits are staged on the order change, so the original request stays intact. 3. **Send or reject.** The merchant sends the quote back to the customer (`pending_customer`) or rejects it (`merchant_rejected`). 4. **Review.** The customer previews the order with the staged changes, then accepts or rejects it (`customer_rejected`). 5. **Order.** On acceptance, the workflow confirms the order change and converts the draft order into a regular order with status `pending`. In the B2B Starter, buyers and merchants can also exchange messages on a quote. A message can point to a specific line item. ## Medusa quote statuses | Status | Meaning | | --- | --- | | pending_merchant | The customer requested a quote. The merchant has not responded. | | pending_customer | The merchant sent a quote. The customer has not responded. | | accepted | The customer accepted. The draft order is now an order. | | merchant_rejected | The merchant declined the request. | | customer_rejected | The customer declined the merchant's quote. | ## B2B Starter vs the quote management guide Both sources use the same Quote module design. Pick the starter for a full B2B storefront, or the guide to add quotes to an existing Medusa application. | What you get | B2B Starter | Quote management guide | | --- | --- | --- | | Quote module, workflows, API routes | Yes | Yes | | Medusa Admin quote pages | Yes | Yes | | Quote messages | Yes | No, see the starter | | Storefront UI | Yes, Next.js | No, Store API routes only | ## How Medusa quotes compare with Adobe Commerce and OroCommerce The comparison below uses Adobe's and Oro's own documentation. | Aspect | Medusa (Starter, Official guide) | Adobe Commerce negotiable quotes | OroCommerce RFQ and quotes | | --- | --- | --- | --- | | Who starts a quote | Logged-in customer, from the cart | Buyer from the cart, or seller in Admin | Customer in the storefront, guests optional | | Seller counter-offer | Edit prices and quantities, then send | Discounts, quantity and item changes, comments | Sales rep creates a quote from the RFQ | | Buyer edits | Accept or reject in the guide | Change quantities, remove items, add notes | Check vendor docs | | Expiry | Custom | Expired status | Quote can be expired | | Quote approvals | Custom | Check vendor docs | Quote Management with Approvals flow | ## When to use Medusa for quotes Medusa's quote flow fits teams that want quote logic in their own code. You can add statuses, connect quotes to ERP pricing, or change who can send a quote by editing workflows. ## When Medusa is not the right choice for quotes Medusa's quote flow is a weaker fit if you need multi-round buyer edits, quote expiry, or quote approvals without writing code. Adobe Commerce and OroCommerce document those behaviors as configuration. ## Common questions ### Does Medusa have built-in quotes? Medusa core has no Quote module. Quotes come from the Medusa B2B Starter or from the official quote management guide, both built on native draft orders and order changes. ### Can guest customers request a quote in Medusa? Not in the B2B Starter or the quote management guide. Both require an authenticated customer: the guide's routes are under /store/customers/me/quotes, and the starter's /store/quotes routes use customer authentication middleware. Guest RFQ is custom work. ### Can Medusa quotes expire? The Medusa quote model has no expiry status. You can add an expiry date to the Quote data model and a scheduled job that rejects old quotes. ### Where is the code for Medusa's quote management? The full code for the quote management guide is in the medusajs/examples repository under quotes-management. The B2B Starter repository contains the extended version with messages and a storefront. ## Documentation - [Implement Quote Management in Medusa](https://docs.medusajs.com/resources/examples/guides/quote-management) - [Order Change](https://docs.medusajs.com/resources/commerce-modules/order/order-change) - [Draft Orders in Medusa Admin](https://docs.medusajs.com/user-guide/orders/draft-orders) ## Related - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "Best ecommerce backend for building AI shopping agents" description: "What to look for in an ecommerce backend for AI shopping agents, and how Medusa, Shopify, commercetools, and BigCommerce compare on cart, checkout, and MCP." url: https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md" - "https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md" - "https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md" sources: - "https://docs.medusajs.com/cloud/medusa-mcp" - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce" - "https://docs.medusajs.com/api/store/carts/complete-cart" - "https://docs.medusajs.com/cloud/search/postgres" - "https://medusajs.com/pricing.md" - "https://docs.medusajs.com/learn/configurations/medusa-config#httpstorerelationslimit" - "https://shopify.dev/docs/agents" - "https://docs.commercetools.com/dev-tooling/mcp/commerce-mcp" - "https://docs.bigcommerce.com/developer/api-reference/mcp/overview" --- # Best ecommerce backend for building AI shopping agents > The best ecommerce backend for AI shopping agents exposes full cart and checkout through an API, lets you add your own agent endpoints, and supports search by meaning. Medusa fits teams that want to own that logic: its Store API covers cart to order, custom API routes add agent tools, and an official guide implements OpenAI's Agentic Commerce Protocol. ## What an AI shopping agent needs from an ecommerce backend An AI shopping agent is software that searches a catalog, builds a cart, and places an order on a shopper's behalf. Whatever platform you pick, check these requirements first: - **Full cart and checkout through an API**: create a cart, add items, set shipping, pay, and place the order without a browser. - **Custom tools and endpoints**: add routes shaped for an agent, such as a single "find and add" action. - **Protocol support**: ACP (OpenAI's Agentic Commerce Protocol), UCP (Universal Commerce Protocol), or MCP (Model Context Protocol, an open standard AI tools use to call external services). - **Auth for agents**: scope what an agent can see and do, and act as a logged-in customer when needed. - **Rate limits and query limits**: protect the backend from agents that call it in loops. - **Semantic search**: rank products by meaning, not only by matching words. - **Owning the logic**: change pricing, inventory, and order rules in code you control. ## How Medusa covers each requirement Medusa v2 maps to the checklist as follows. The status column uses four labels: Native (Medusa core), Starter, Official guide (docs tutorial with example code), and Custom (you build it). | Requirement | How Medusa does it | Status | | --- | --- | --- | | Cart and checkout API | Store API: POST /store/carts, POST /store/carts/{id}/line-items, POST /store/carts/{id}/shipping-methods, payment collection routes, POST /store/carts/{id}/complete | Native | | Custom agent endpoints | Custom API routes in src/api, backed by workflows | Native | | ACP | Product feed, checkout session routes, and webhooks in the Agentic Commerce tutorial | Official guide | | MCP | Medusa MCP server gives AI tools read access to Medusa Cloud stores, including custom GET routes | Native (Cloud, read-only) | | UCP | No documented support | Custom | | Agent auth | Publishable API keys scope Store API requests to sales channels; customer authentication for logged-in shoppers | Native | | Rate and query limits | http.storeRelationsLimit caps relation expansion (default 3, since v2.20.0); request rate limiting is a middleware you add | Native / Custom | | Semantic search | Medusa Search vector and hybrid search on Medusa Cloud Scale and Enterprise plans | Native (Cloud) | | Own the logic | Open source (MIT core), TypeScript modules and workflows | Native | For ChatGPT checkout specifically, start with the [Agentic Commerce tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce). The tutorial notes that OpenAI's Instant Checkout is available in select regions and for select businesses, and that you may need adjustments when you apply for it. ## How Medusa compares with Shopify, commercetools, and BigCommerce for AI agents Each ecommerce platform exposes a different interface to AI agents. Facts about other platforms come from their own developer docs. | Platform | Agent interface | Cart and checkout by agents | | --- | --- | --- | | Medusa | Store API, custom API routes, Medusa MCP (read-only), ACP guide | The agent calls Store API routes to build the cart and complete the order | | Shopify | Global Catalog and Storefront Catalog for discovery, plus UCP-compliant Cart, Checkout, and Order MCP servers; agents send an agent profile | Cart MCP builds carts; Checkout MCP hands buyers to the merchant, and trusted agents can complete checkouts | | commercetools | Commerce MCP, managed or self-hosted, using an API client you provide | Tools are configurable from read-only to read-and-write, including carts and orders | | BigCommerce | Storefront MCP with B2C and B2B tool sets, enabled by the store owner | Search products, manage a cart, and hand off to checkout | ## Which ecommerce backend fits which AI agent project - **Medusa** fits teams building their own agent, with custom tools, custom checkout rules, or a non-Shopify backend, who want to self-host or run on Medusa Cloud. - **Shopify** fits merchants already on Shopify who want agents to find them through Shopify's catalog and UCP servers without building endpoints. - **commercetools** fits enterprises already on commercetools who want a vendor-hosted MCP server over their existing project. - **BigCommerce** fits BigCommerce stores that want a storefront MCP server they switch on in the control panel. ## When Medusa is not the right choice for an AI agent backend Medusa is not the right choice if you have no developer. Agent tools, protocol endpoints, and search indexes are code you write and maintain. Medusa is also a weaker fit if you need a ready-made UCP integration today, or want agents to discover you in a cross-merchant catalog. Shopify's Global Catalog covers that for Shopify merchants. The Medusa MCP server is read-only, so a Medusa shopping agent that places orders calls the Store API directly. ## Common questions ### Can an AI agent place an order in Medusa? Yes. An AI agent places a Medusa order by calling Store API routes: create a cart, add line items, add a shipping method, initialize payment, then POST /store/carts/{id}/complete. Each request needs a publishable API key. ### Does Medusa support OpenAI's Agentic Commerce Protocol? Medusa has an official tutorial that implements Agentic Commerce Protocol specifications, including a product feed, checkout session routes, and webhooks. It is example code you add to your project, not a packaged plugin. ### Does Medusa support the Universal Commerce Protocol (UCP)? Medusa docs do not document UCP support. You can build UCP endpoints with Medusa custom API routes and workflows. ### Can the Medusa MCP server be used by a shopping agent to check out? No. The Medusa MCP server is read-only and calls Store API routes as a guest. It suits store operators asking about orders, products, and deployments, while a shopping agent should call the Store API directly. ## Documentation - [Implement Agentic Commerce (ChatGPT Instant Checkout) Specifications](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) - [Store API reference](https://docs.medusajs.com/api/store) - [Medusa MCP](https://docs.medusajs.com/cloud/medusa-mcp) - [Semantic Search with Medusa Search](https://docs.medusajs.com/cloud/search/semantic-search) - [Use a Publishable API Key in the Storefront](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys) ## Related - [How to let ChatGPT and other AI agents buy from your store](https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md) - [ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained](https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md) - [How to build an AI shopping assistant on your product catalog](https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant.md) - [Ecommerce platforms with MCP servers](https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md) --- title: "How to build a booking or reservation system on an ecommerce platform" description: "Booking and reservation patterns on Medusa: tickets, rentals, pre-orders and appointments, preventing double bookings, and a WooCommerce Bookings comparison." url: https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations last_updated: 2026-10-29T06:55:50Z topic: "tickets-and-bookings" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/tickets-and-bookings/sell-tickets-and-merch.md" - "https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits.md" - "https://medusajs.com/kb/marketplaces/rental-marketplace.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" sources: - "https://docs.medusajs.com/resources/recipes/ticket-booking/example" - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals" - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/preorder" - "https://docs.medusajs.com/resources/commerce-modules/product/selling-products" - "https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-in-flows" - "https://docs.medusajs.com/resources/commerce-modules/inventory/reservations-lifecycle" - "https://docs.medusajs.com/resources/infrastructure-modules/locking" - "https://woocommerce.com/products/woocommerce-bookings/" --- # How to build a booking or reservation system on an ecommerce platform > To build bookings on Medusa, pick a pattern first: event tickets, date-range rentals, pre-orders, or time-slot appointments. Medusa has official tutorials for tickets, rentals and pre-orders, built as custom modules linked to its products, carts and orders. Double bookings are prevented with add-to-cart checks, inventory reservations and workflow locks. ## Which booking pattern fits your business A booking system sells access to a limited resource at a specific time: a seat at a show, a camera for three days, or a 30-minute appointment. Each pattern tracks availability differently, so pick the pattern before you pick the tool. Medusa has official guides for three of them and the building blocks for the fourth. | Pattern | Example | What availability means | Medusa starting point | Status | | --- | --- | --- | --- | --- | | Event tickets | Concerts, conferences | A seat or a capacity count per show date | Ticket booking tutorial | Official guide | | Date-range rentals | Equipment, formal wear | An item is free for a start and end date | Product rentals tutorial | Official guide | | Pre-orders | Product launches, books | Sell before stock arrives, fulfill later | Pre-orders tutorial | Official guide | | Time-slot appointments | Classes, consultations | A slot with a capacity on a calendar | No guide; build a slot model on Medusa's framework | Custom | ## How Medusa supports bookings Medusa is a commerce platform with a framework for custom modules, workflows, and API routes. A booking feature in Medusa is a custom module that stores the booking data, linked to Medusa's products, carts, and orders, so you reuse its pricing, promotions, payments, and order management. - The [ticket booking tutorial](https://docs.medusajs.com/resources/recipes/ticket-booking/example) adds venues, rows, seats, and show dates. It creates one variant per show date and row type and sets its inventory to the row's seat count. - The [product rentals tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) adds rental configurations (minimum and maximum days) and rental records with start and end dates. It checks for overlapping rentals and prices the rental per day. - The [pre-orders tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/preorder) lets customers buy a variant before it's available and fulfills the order automatically when it is. Services and appointments that need no shipping or stock tracking are a documented product setup: no shipping profile and `manage_inventory` disabled, per [Configure Selling Products](https://docs.medusajs.com/resources/commerce-modules/product/selling-products). ## How to prevent double bookings in Medusa Double booking happens when two customers buy the same slot at the same time. Medusa gives you three layers to stop it. 1. **Availability check on add to cart.** Medusa checks a variant's available inventory when it's added to a cart. The ticket booking tutorial consumes the `validate` hook of `addToCartWorkflow` to reject a taken seat, and the rentals tutorial uses a custom add-to-cart workflow that rejects overlapping dates. 2. **Reservation on order placement.** `completeCartWorkflow` creates an inventory reservation for each item, which lowers the available quantity until the item is fulfilled or the order is canceled. See the [reservations lifecycle](https://docs.medusajs.com/resources/commerce-modules/inventory/reservations-lifecycle). 3. **Locks during checkout.** The tutorials wrap cart completion in `acquireLockStep` and `releaseLockStep` from the [Locking Module](https://docs.medusajs.com/resources/infrastructure-modules/locking). Those locks are keyed on the cart, so key a lock on the slot or variant if two carts can race for it. The default in-memory provider is for development only; use the Redis or PostgreSQL provider in production. Medusa does not hold a slot while it sits in a cart. If you need a timed hold, such as 10 minutes to finish checkout, build it as a custom hold record that a scheduled job expires. ## Medusa compared with WooCommerce Bookings WooCommerce Bookings is a paid WordPress extension, listed at $249 per year as of October 2026. It ships booking rules out of the box. Medusa ships the commerce engine and official example code, and you build the booking rules you need. | Capability | WooCommerce Bookings | Medusa | | --- | --- | --- | | Booking durations | Days, hours, or minutes | Days in the rentals tutorial; hours or minutes are custom | | Fixed time slots | Built in | Custom | | Resources such as staff or rooms | Built in, each with its own availability | Custom module | | Capacity per booking | Minimum and maximum participants | Inventory per variant, native | | Buffers between bookings | Built in | Custom | | Confirmation before payment | Built in | Custom | | Deposits | Separate Deposits extension, $219 per year | Custom | | Seat maps | Not listed | Official guide | | Platform | WordPress plugin | Headless Node.js backend with Store and Admin APIs | ## When Medusa is not the right choice for bookings - You run a salon or studio and want calendar booking working this week without a developer. A scheduling SaaS or WooCommerce Bookings is faster. - Your bookings have no commerce around them: no catalog, no cart, no add-ons. A dedicated scheduling tool is simpler. - Medusa fits when booking is part of a larger store, when you need a booking model the plugins don't support, or when you want to own the code and the data. ## Common questions ### Does Medusa have a built-in booking calendar? No. Medusa has no native booking calendar. The official rentals tutorial adds a date picker and availability checks by day, and time-slot calendars are custom work. ### Can Medusa hold a booking slot while the customer checks out? Not by default. Medusa checks inventory when an item is added to a cart and reserves it when the order is placed, so a timed hold during checkout is a custom record that a scheduled job expires. ### How do I sell appointments or services in Medusa? Create a product with no shipping profile and with inventory management disabled, as the Configure Selling Products guide describes. Slot availability, staff and buffers are custom models you add in a module. ### Is Medusa an alternative to WooCommerce Bookings? Medusa is an alternative when you need a headless backend and custom booking rules. WooCommerce Bookings ships time slots, resources and buffers out of the box, while Medusa gives you the commerce engine and official examples to build them. ## Documentation - [Implement a Ticket Booking System with Medusa](https://docs.medusajs.com/resources/recipes/ticket-booking/example) - [Implement Product Rentals in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) - [Implement Pre-Orders in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/preorder) - [Reservations Lifecycle](https://docs.medusajs.com/resources/commerce-modules/inventory/reservations-lifecycle) - [Locking Module](https://docs.medusajs.com/resources/infrastructure-modules/locking) ## Related - [Sell event tickets and merch on one site without Eventbrite fees](https://medusajs.com/kb/tickets-and-bookings/sell-tickets-and-merch.md) - [Rental pricing, availability and security deposits](https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits.md) - [Build a peer-to-peer rental marketplace: build vs buy](https://medusajs.com/kb/marketplaces/rental-marketplace.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) --- title: "How to build an AI shopping assistant on your product catalog" description: "Build an AI shopping assistant on your catalog with Medusa: semantic search for retrieval, Store API routes as tools, and guardrails against invented products." url: https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "how-to" applies_to: "Medusa v2.21.1+" related: - "https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md" - "https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents.md" - "https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md" sources: - "https://docs.medusajs.com/cloud/search/semantic-search" - "https://docs.medusajs.com/cloud/search/postgres" - "https://docs.medusajs.com/learn/fundamentals/query/search" - "https://medusajs.com/pricing.md" - "https://docs.medusajs.com/resources/storefront-development/publishable-api-keys" - "https://docs.medusajs.com/cloud/medusa-mcp" - "https://www.algolia.com/doc/guides/algolia-ai/agent-studio/" - "https://shopify.dev/docs/apps/build/storefront-mcp" --- # How to build an AI shopping assistant on your product catalog > To build an AI shopping assistant on your product catalog, combine a retrieval layer that searches products by meaning, an LLM that writes the answer, and tools that read products and manage the cart. With Medusa, Medusa Search handles semantic retrieval, Store API routes act as the tools, and a custom API route connects them to your model. ## Before you start An AI shopping assistant is a chat interface that answers shoppers in natural language and only recommends products that exist in your catalog. To build one on Medusa, you need: - A Medusa v2.21.1+ application. Query's search method and the POST /store/search route require it. - A Medusa Cloud project on the Scale or Enterprise plan for [vector and hybrid search with Medusa Search](https://docs.medusajs.com/cloud/search/semantic-search). The self-hosted PostgreSQL search provider rejects vector queries. - An LLM provider of your choice, called from your own code. - A publishable API key, which scopes Store API requests to sales channels. Medusa docs don't include a full customer-facing shopping assistant tutorial. The steps below combine documented building blocks. ## 1. Index your catalog for semantic search This step lets the assistant find products by meaning, such as "something warm for a winter hike". Add a vector field to your product index definition in src/search. On the Enterprise plan, Medusa Search computes embeddings for you with the embed() modifier. On the Scale plan, you compute embeddings with your own model and pass them as search_options.vector.value. Put the defining text first in what you embed, such as title, type, and description. Keep prices, stock, and region out of it. Those are exact constraints, so index them as filterable fields instead. ## 2. Map the assistant's tools to Store API routes This step gives the LLM actions it can call. Each tool wraps a Medusa Store API route, so prices, stock, and promotions come from Medusa, not from the model. | Assistant tool | Medusa route | Status | | --- | --- | --- | | Search products | POST /store/search, or query.search in a custom route | Native | | Product details | GET /store/products/{id} | Native | | Create cart | POST /store/carts | Native | | Add to cart | POST /store/carts/{id}/line-items | Native | | Shipping | POST /store/carts/{id}/shipping-methods | Native | | Pay and place order | Payment collection routes, then POST /store/carts/{id}/complete | Native | | Conversational layer | Your LLM call in a custom API route | Custom | ## 3. Add a custom API route for the assistant This step connects the LLM to retrieval. The [Medusa Search AI search assistant example](https://docs.medusajs.com/cloud/search/semantic-search#example-build-an-ai-search-assistant) defines a POST /store/assistant route. Your own toSearchQuery function asks the LLM to turn the shopper's message into a search string, then query.search ranks products with it: ```ts const query = req.scope.resolve(ContainerRegistrationKeys.QUERY) const searchQuery = await toSearchQuery(req.body.message) const { data } = await query.search({ entity: "product", fields: ["id", "title", "handle", "thumbnail"], filters: { q: searchQuery, status: "published" }, search_options: { vector: { field: "title_embedding", query: searchQuery, semantic_ratio: 0.7, }, }, }) ``` Passing text as vector.query requires a field with embed(), which is Enterprise-only. Keep semantic_ratio below 1 so brand names and model numbers the shopper typed still count. ## 4. Add guardrails so the assistant stays grounded This step stops the assistant from inventing products or prices. A grounded answer is one where every product, price, and stock level comes from a tool result. - Render product cards from the route's response, not from model text. - Read totals from the cart that the Store API returns. - Ask the shopper to confirm before the assistant completes the cart. - Cap relation expansion with http.storeRelationsLimit, and add rate limiting middleware to the assistant route. ## How a Medusa shopping assistant compares with Algolia Agent Studio and Shopify Algolia Agent Studio connects an LLM, such as OpenAI or Gemini models, to Algolia indices for grounded answers. Its docs focus on search and retrieval, so cart and checkout stay in your commerce backend. Shopify removed Storefront MCP's catalog and cart tools in favor of UCP servers, and points merchants who want no-code chat to the Inbox agent in Shopify Inbox. With Medusa, you write the conversational layer yourself and own every tool it calls. ## When Medusa is not the right choice for a shopping assistant Medusa is not the right choice if you want a chat assistant without writing code. A hosted option such as Shopify's Inbox agent is faster to set up. Medusa also needs the Scale plan or higher on Medusa Cloud for semantic search, or your own search provider when you self-host. ## Common questions ### Does Medusa have a built-in AI shopping assistant? No. Medusa provides the building blocks: Medusa Search for semantic retrieval, Store API routes for products and carts, and custom API routes where you call the LLM of your choice. ### Which Medusa Cloud plan do I need for semantic search? Medusa Search supports vector and hybrid search on the Scale and Enterprise plans. On Scale, you compute embeddings yourself; on Enterprise, Medusa Search can compute them for you. ### Can a Medusa shopping assistant add items to the cart? Yes. The assistant's add-to-cart tool calls POST /store/carts/{id}/line-items with a publishable API key, so Medusa applies its own pricing, inventory, and promotion rules. ### Can I use the Medusa MCP server for a customer-facing assistant? The Medusa MCP server is built for store operators. It is read-only, authenticates with a Medusa Cloud account, and calls Store API routes as a guest, so a shopper-facing assistant should call the Store API directly. ## Documentation - [Semantic Search with Medusa Search](https://docs.medusajs.com/cloud/search/semantic-search) - [Query search method](https://docs.medusajs.com/learn/fundamentals/query/search) - [Store API: Search Indexes](https://docs.medusajs.com/api/store/search/search-indexes) - [Store API: Carts](https://docs.medusajs.com/api/store/carts) ## Related - [Best ecommerce backend for building AI shopping agents](https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md) - [How to make your product catalog visible to AI assistants](https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents.md) - [How to let ChatGPT and other AI agents buy from your store](https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md) --- title: "Integrate Microsoft Dynamics 365 Business Central with Medusa" description: "How to integrate Dynamics 365 Business Central with Medusa: API v2.0, webhooks, data mapping, rate limits, a code skeleton, and the Shopify Connector." url: https://medusajs.com/kb/erp-integration/business-central last_updated: 2026-10-29T06:55:50Z topic: "erp-integration" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md" - "https://medusajs.com/kb/erp-integration/netsuite.md" - "https://medusajs.com/kb/erp-integration/sap-business-one.md" - "https://medusajs.com/kb/erp-integration/odoo.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" sources: - "https://docs.medusajs.com/resources/recipes/erp" - "https://docs.medusajs.com/learn/fundamentals/modules" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/learn/fundamentals/scheduled-jobs" - "https://docs.medusajs.com/learn/fundamentals/workflows/retry-failed-steps" - "https://docs.medusajs.com/learn/fundamentals/workflows/long-running-workflow" - "https://docs.medusajs.com/resources/references/medusa-workflows/updateInventoryLevelsWorkflow" - "https://docs.medusajs.com/resources/references/medusa-workflows/createPriceListsWorkflow" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules" - "https://docs.medusajs.com/resources/examples/guides/custom-item-price" - "https://docs.medusajs.com/resources/integrations" - "https://medusajs.com/pricing" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/dynamics-subscriptions" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/api/dynamics_subscriptions_create" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/operational-limits-online" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/resources/dynamics_item" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/resources/dynamics_salesorder" - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/shopify-connector-overview" - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/synchronize-orders" - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/shopify-faq" - "https://shopify.dev/docs/api/functions/latest/cart-and-checkout-validation" --- # Integrate Microsoft Dynamics 365 Business Central with Medusa > Medusa has no first-party Business Central connector, so you build one as a custom Medusa module that calls the Business Central API v2.0. Orders push to Business Central sales orders from an order.placed subscriber with rollback, Business Central webhooks drive order status updates, and scheduled jobs sync stock and customer prices into Medusa. ## How a Business Central integration with Medusa works Medusa has no first-party connector for Microsoft Dynamics 365 Business Central. You build the integration as a custom Medusa [module](https://docs.medusajs.com/learn/fundamentals/modules) that calls the [Business Central API v2.0](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/), a REST API on OData v4. Workflows, subscribers, scheduled jobs and API routes then use that module, following Medusa's [ERP recipe](https://docs.medusajs.com/resources/recipes/erp). Business Central pushes changes through [webhooks](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/dynamics-subscriptions): - You register with `POST /api/v2.0/subscriptions`, and your endpoint must echo the `validationToken` with a `200` response. - Subscriptions expire after three days unless renewed with a `PATCH`. - A notification carries the changed record's URL and a change type, not the record itself, so you `GET` the record afterwards. - Supported entities include `items`, `customers`, `salesOrders` and `salesInvoices`. Item ledger entries, which hold stock movements, are not on the list. - If more than 1,000 records change within 30 seconds, you get one `collection` notification with a filter instead of one per record. ## Mapping Business Central data to Medusa Each Business Central entity maps to a Medusa commerce module. Statuses describe the Medusa side. | Business Central | Medusa | Direction | Mechanism | Status | | --- | --- | --- | --- | --- | | items, itemVariants | Products and variants, with the BC ID in external_id or metadata | BC to Medusa | Scheduled job, plus items webhook | Official guide | | item inventory (read-only field) | Inventory levels via updateInventoryLevelsWorkflow | BC to Medusa | Scheduled job, plus a live check at add-to-cart | Custom (scheduled sync); Official guide (live check at add-to-cart) | | Customer price groups and price lists | Price lists with customer group rules | BC to Medusa | Scheduled job reading a custom BC API page | Custom | | customers | Customers and customer groups | Both | Webhook in, subscriber out | Custom | | salesOrders, salesOrderLines | Orders | Medusa to BC, status back | order.placed subscriber; salesOrders webhook | Official guide | The standard API v2.0 has no price list or customer price group resource; items expose a single `unitPrice`. To sync customer-specific prices, publish a custom API page in AL. Custom API pages can also send webhooks if they meet Business Central's webhook requirements. ## Real-time or scheduled sync for each Business Central flow Pick the trigger per flow, not per integration: - **Orders:** real time. An `order.placed` subscriber runs a workflow that creates the BC sales order. - **Order status:** real time. A `salesOrders` webhook calls a Medusa API route that fetches the order and updates Medusa. A scheduled job renews the subscription before its three days run out. - **Stock:** scheduled, because stock movements don't fire webhooks. For exact stock, check BC in the `validate` hook of `addToCartWorkflow`. - **Prices:** scheduled into Medusa price lists, or fetched per cart with a [custom item price](https://docs.medusajs.com/resources/examples/guides/custom-item-price) workflow. Business Central online allows [6,000 OData requests per user](https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/operational-limits-online) in a 5-minute window, 5 concurrent requests, and 100 operations per `$batch`. Above the limits it returns `429`. Set `maxRetries` and `retryInterval` on steps that call BC; a `retryInterval` makes the workflow [long-running](https://docs.medusajs.com/learn/fundamentals/workflows/long-running-workflow). ## Code skeleton: push a Medusa order to Business Central with rollback This skeleton assumes a custom module registered as `bc` whose service wraps `salesOrders` create and delete calls. The compensation function deletes the BC sales order if the metadata update fails. ```ts // src/workflows/sync-order-to-bc.ts import { createStep, createWorkflow, StepResponse, WorkflowResponse } from "@medusajs/framework/workflows-sdk" import { updateOrderWorkflow, useQueryGraphStep } from "@medusajs/medusa/core-flows" import { OrderDTO } from "@medusajs/framework/types" const createBcSalesOrderStep = createStep( { name: "create-bc-sales-order", maxRetries: 3 }, async ({ order }: { order: OrderDTO }, { container }) => { const bcOrderId = await container.resolve("bc").createSalesOrder(order) return new StepResponse(bcOrderId, bcOrderId) }, async (bcOrderId, { container }) => { if (!bcOrderId) return await container.resolve("bc").deleteSalesOrder(bcOrderId) } ) export const syncOrderToBcWorkflow = createWorkflow( "sync-order-to-bc", ({ order_id }: { order_id: string }) => { const { data: orders } = useQueryGraphStep({ entity: "order", fields: ["*", "items.*", "shipping_address.*", "billing_address.*"], filters: { id: order_id }, }) const bcOrderId = createBcSalesOrderStep({ order: orders[0] as unknown as OrderDTO }) updateOrderWorkflow.runAsStep({ input: { id: order_id, user_id: "", metadata: { bc_order_id: bcOrderId } }, }) return new WorkflowResponse(bcOrderId) } ) ``` ```ts // src/subscribers/order-placed-bc.ts import type { SubscriberArgs, SubscriberConfig } from "@medusajs/framework" import { syncOrderToBcWorkflow } from "../workflows/sync-order-to-bc" export default async function orderPlacedBcHandler({ event: { data }, container }: SubscriberArgs<{ id: string }>) { await syncOrderToBcWorkflow(container).run({ input: { order_id: data.id } }) } export const config: SubscriberConfig = { event: "order.placed" } ``` ## Medusa compared with the Shopify Connector for Business Central | Aspect | Shopify with Microsoft's Shopify Connector | Medusa with a custom Business Central module | | --- | --- | --- | | Who builds it | Microsoft. Preinstalled in new Business Central online environments | You or your agency | | Deployment | Business Central online only, not on-premises | Any environment where the BC APIs are reachable | | Sync trigger | Job queue; Auto Sync Orders starts the order import job when Shopify reports a new order | Medusa events, BC webhooks and scheduled jobs | | Customer prices | Exports prices from selected customer price groups and discounts, plus B2B catalogs | Price lists with customer group rules, or a live BC price at add-to-cart | | ERP rules in the cart | Shopify Functions; external fetch only for custom apps on Enterprise stores | validate hook calls BC directly | | Upkeep | Microsoft adopts new Shopify API versions in Business Central major releases | You maintain the module as BC's API changes | | Licenses | Business Central and Shopify | Business Central, plus Medusa hosting: self-hosted, or Medusa Cloud from $29 per month with a 0% GMV fee | ## When Medusa is not the right choice for Business Central - You run Business Central online and Shopify, and the connector's syncs cover your order, stock and price flows. Use the connector. - You have no developer capacity. A Medusa integration is code you own. - You need a vendor-supported connector. Medusa has none for Business Central today. ## Common questions ### Is there a Medusa plugin for Business Central? No. Medusa has no first-party or official plugin for Microsoft Dynamics 365 Business Central. You build the integration as a custom module following the Medusa ERP recipe. ### Does Business Central send webhooks for stock changes? Not directly. Business Central webhooks cover entities such as items, customers and salesOrders, but item ledger entries, which record stock movements, are not webhook-supported. Sync stock on a schedule or check it live during add-to-cart. ### How do I sync Business Central customer prices to Medusa? The standard Business Central API v2.0 has no price list resource, so publish a custom API page in AL that exposes price list lines. A Medusa scheduled job can then write them to price lists with customer group rules. ### What are the Business Central API rate limits? Business Central online allows 6,000 OData requests per user in a 5-minute sliding window and 5 concurrent requests per user, and returns HTTP 429 when limits are exceeded. A $batch request holds up to 100 operations. ### Does the Shopify Connector work with Business Central on-premises? No. Microsoft's Shopify Connector is available only for Business Central online. A Medusa integration calls the Business Central API, so it can target any environment where the APIs are enabled and reachable. ## Documentation - [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Events and Subscribers](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) - [Compensation Function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) ## Related - [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md) - [How to integrate NetSuite with Medusa](https://medusajs.com/kb/erp-integration/netsuite.md) - [How to integrate SAP Business One with Medusa](https://medusajs.com/kb/erp-integration/sap-business-one.md) - [How to integrate Odoo with Medusa](https://medusajs.com/kb/erp-integration/odoo.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) --- title: "Coffee subscriptions without Shopify app fees" description: "Coffee subscription fee math: Shopify plus Recharge vs Medusa Cloud at $20k a month, and the roaster features Medusa covers natively or with custom code." url: https://medusajs.com/kb/subscriptions/coffee-subscription-store last_updated: 2026-10-29T06:55:50Z topic: "subscriptions" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/subscriptions/subscriptions-and-one-time-products.md" - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://www.shopify.com/pricing" - "https://apps.shopify.com/subscription-payments" - "https://getrecharge.com/pricing/" - "https://medusajs.com/pricing" - "https://stripe.com/billing/pricing" - "https://docs.medusajs.com/resources/recipes/subscriptions" - "https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard" - "https://docs.medusajs.com/resources/commerce-modules/product" - "https://docs.medusajs.com/resources/commerce-modules/loyalty" - "https://medusajs.com/blog/reorder" - "https://docs.reorderjs.com/storefront/cart.md" - "https://apps.shopify.com/shopify-subscriptions" - "https://medusajs.com/blog/goodchef" - "https://medusajs.com/blog/healthletic" --- # Coffee subscriptions without Shopify app fees > A roastery can run coffee subscriptions on Medusa with no subscription app fee. At $20,000 a month, Shopify Basic plus Recharge Starter costs about $519 a month in plan and app fees, versus $99 on Medusa Cloud Launch with a 0% GMV fee. The trade-off is building subscription logic from Medusa's official guide. ## What Shopify and Recharge cost a coffee roastery at $20k a month A roastery selling coffee subscriptions on Shopify with Recharge pays a Shopify plan fee plus Recharge's monthly fee and a cut of each subscription charge. The math below uses list prices as of October 2026 from [Shopify's pricing page](https://www.shopify.com/pricing) and [Recharge's App Store listing](https://apps.shopify.com/subscription-payments). Recharge Starter fee = $99 + (1.49% × monthly volume) + ($0.19 × number of charges) Assumptions for this example: $20,000 a month of subscription charges processed by Recharge, a $40 average charge (500 charges), Shopify Basic on monthly billing, and Medusa Cloud's Launch plan. Card processing fees are left out because you pay them on both sides. | Line item | Shopify + Recharge Starter | Medusa on Medusa Cloud | | --- | --- | --- | | Platform plan | $27 (Shopify Basic) | $99 (Launch) | | Subscription app base fee | $99 | $0 | | Percentage fee | $298 (1.49% of $20,000) | $0 (0% GMV fee) | | Per-charge fee | $95 (500 × $0.19) | $0 | | Monthly total | $519 | $99 | | Yearly total | $6,228 | $1,188 | The Medusa column leaves out the cost of building and maintaining subscription logic. If that build costs D, it pays back after D ÷ $420 months at this volume. Recharge's percentage fee grows with revenue, while the Medusa Cloud plan stays flat. Smaller roasteries should check the cheaper options first. Recharge's listing shows a $25 a month plan with no transaction fees for the first 50 subscribers, and Shopify's own Shopify Subscriptions app is free. ## Coffee subscription features and how Medusa handles them Medusa core has no Subscription Module. The [Subscriptions recipe](https://docs.medusajs.com/resources/recipes/subscriptions) and its [example guide](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard) give you the base, and the rest is code you add. | Roaster need | Status | How it works in Medusa | | --- | --- | --- | | Grind type and bag size | Native | Product options and variants | | One-off bags | Native | Standard cart and checkout | | Monthly or every N months | Official guide | interval plus period on the subscription | | Weekly or every 2 weeks | Custom | Add a weekly interval to the example | | Same address and card each renewal | Official guide | Renewal reuses the linked cart and saved card | | Subscription and one-off bag in one checkout | Custom | The example turns the whole cart into the subscription | | Skip, pause, or swap roast | Custom | Update next_order_date or the linked cart | | Failed payment retries | Custom | The example only logs failures | | Gift subscriptions | Custom | Prepaid subscription with a set number of renewals | Grind and size map directly to [product options](https://docs.medusajs.com/resources/commerce-modules/product): a "Grind" option with whole bean, filter, and espresso values, and a "Size" option, give each combination its own variant, price, and stock. Gift cards come from the [Loyalty Plugin](https://docs.medusajs.com/resources/commerce-modules/loyalty), which is store credit, not a gifted subscription. ## Three ways to build coffee subscriptions on Medusa 1. Follow the official guide and extend it. You own all the code, and the guide renews with Stripe's saved payment methods. Another provider works if it supports saved payment methods, or you write the renewal payment logic yourself. 2. Install [Reorder](https://medusajs.com/blog/reorder), an MIT-licensed community plugin for Medusa 2.3+. It adds pause, resume, skip, and cancel, dunning with retries, and per-frequency discounts. Medusa's blog reports that Roastloop launched coffee subscriptions in 7 days with it. Medusa doesn't maintain Reorder, and its current release doesn't allow mixed carts. 3. Use Stripe Billing as the engine through a custom payment provider. Stripe charges 0.7% of Billing volume on pay-as-you-go pricing, so you trade the Recharge fee for a smaller one. ## Who runs subscriptions on Medusa Good Chef sells plant-based meal boxes on subscription. Its agency built a Subscription data model and a nightly renewal job in Medusa, and skipped Stripe Billing so customers could pay with their preferred method ([Good Chef case study](https://medusajs.com/blog/goodchef)). Healthletic, a supplements brand, sells one-time purchases and subscriptions on Medusa after moving off Shopify Plus ([Healthletic case study](https://medusajs.com/blog/healthletic)). ## When Medusa is not the right choice for a roastery - You have under 50 subscribers and no developer. Recharge's $25 plan or the free Shopify Subscriptions app costs less than any build. - You want skip, pause, and dunning on day one with no code. Recharge includes failed payment recovery on Starter. - No one on your team can maintain a Node.js app. The same template applies to other consumables such as pet food, supplements, and tea: swap grind and size for flavor or pack size and keep the fee formula. ## Common questions ### How much does Recharge take from coffee subscription sales? As of October 2026, Recharge Starter costs $99 a month plus 1.49% + 19¢ per transaction, and Plus costs $499 a month plus 1.34% + 19¢. A $25 a month plan has no transaction fees for the first 50 subscribers. ### Can Medusa sell coffee by grind type and bag size? Yes. Medusa's Product Module supports options such as grind and size, and each combination becomes a variant with its own price and inventory. ### Can customers skip a coffee delivery in a Medusa store? Not out of the box. Skipping is custom work on top of Medusa's subscription guide, usually by moving the subscription's next order date forward one interval. The community plugin Reorder includes skip. ### Is Medusa cheaper than Shopify for a small roastery? Not always. With under 50 subscribers, Recharge's $25 plan or Shopify's free Shopify Subscriptions app costs less than paying a developer to build subscriptions on Medusa. ## Documentation - [Subscriptions Recipe](https://docs.medusajs.com/resources/recipes/subscriptions) - [Subscriptions example guide](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard) - [Product Module](https://docs.medusajs.com/resources/commerce-modules/product) - [Loyalty Module (gift cards)](https://docs.medusajs.com/resources/commerce-modules/loyalty) ## Related - [How to sell subscriptions and one-time products in one store](https://medusajs.com/kb/subscriptions/subscriptions-and-one-time-products.md) - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "Composable commerce platforms for mid-market brands" description: "What composable commerce and MACH mean, how Medusa's isolated commerce modules fit, and a price comparison with commercetools, BigCommerce, and more." url: https://medusajs.com/kb/migrations-and-platforms/composable-commerce last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/magento-migration.md" - "https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md" - "https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md" sources: - "https://machalliance.org/mach-principles/" - "https://machalliance.org/mach-explained" - "https://machalliance.org/members" - "https://medusajs.com/pricing" - "https://docs.medusajs.com/resources/commerce-modules" - "https://docs.medusajs.com/learn/fundamentals/modules/isolation" - "https://docs.medusajs.com/learn/introduction/architecture" - "https://commercetools.com/pricing" - "https://www.bigcommerce.com/pricing/" - "https://commercelayer.io/pricing" - "https://www.elasticpath.com/pricing" --- # Composable commerce platforms for mid-market brands > Composable commerce splits catalog, pricing, cart, orders, and other capabilities into independent parts connected through APIs. Medusa is an open-source composable commerce platform: each domain is an isolated Commerce Module you can extend, replace, or run in a Node.js app. It is free to self-host, and Medusa Cloud starts at $29/month with a 0% GMV fee. ## What is composable commerce? Composable commerce is an approach where a store's commerce capabilities (catalog, pricing, cart, checkout, orders, inventory) are separate parts that you can assemble, replace, and change independently, connected through APIs. Vendors often call these parts packaged business capabilities (PBCs). The opposite is a monolith, where every capability ships and upgrades as one unit. The [MACH Alliance](https://machalliance.org/mach-principles/), the industry body that certifies composable vendors, now describes its MACH Principles as three ideas: open, composable, and connected. In practice it lists microservices, headless architecture, best-of-breed selection, API-first design, event-driven integration, MCP connectivity, and cloud-native deployment. Medusa is not listed in the [MACH Alliance member directory](https://machalliance.org/members) as of October 2026. ## How Medusa's module architecture maps to composable commerce Medusa is an open-source commerce platform built in TypeScript on Node.js, licensed under MIT except for its Enterprise Edition RBAC and SSO features. Each commerce domain is a separate [Commerce Module](https://docs.medusajs.com/resources/commerce-modules): Product, Pricing, Cart, Order, Payment, Fulfillment, Inventory, Tax, Promotion, Customer, and more. Storefronts and other clients use these modules through Medusa's Store and Admin API routes, so the platform is headless by design. [Module isolation](https://docs.medusajs.com/learn/fundamentals/modules/isolation) is what makes this composable rather than only modular: - A module can't access another module's services or data models. - Module Links connect data models across modules, and Query reads across them. - Workflows combine several modules in one business flow, with rollback if a step fails. - You can replace a module with your own implementation when your use case differs. The [architecture docs](https://docs.medusajs.com/learn/introduction/architecture) describe the same principle for third-party services: payment, file, notification, event, caching, and workflow engine providers are swappable modules. ## Can Medusa's commerce modules run standalone? Medusa's documentation lists three ways to use Commerce Modules: inside a full Medusa application with REST APIs, inside a serverless application such as a Next.js app, and inside any Node.js application by installing the module as an npm package. The module isolation docs give the same reason: isolated modules can run in other environments, such as Edge functions and Next.js apps. Most teams still run the full Medusa application, because it wires the modules, workflows, API routes, and admin dashboard together. Standalone use fits teams that want one capability, such as pricing or a cart, inside an existing system. ## Composable commerce platforms compared The table compares common composable and headless commerce platforms. Prices come from each vendor's pricing page, as of October 2026. | Platform | Model | Starting price (as of October 2026) | Best for | | --- | --- | --- | --- | | Medusa | Open source (MIT core; RBAC and SSO are Enterprise Edition), self-host or Medusa Cloud | Free to self-host; Medusa Cloud from $29/month, 0% GMV fee | Teams with TypeScript developers who need custom commerce logic and code ownership | | commercetools | SaaS, order-based pricing | Contact sales (free trial available) | Large enterprises buying a fully managed composable suite | | BigCommerce | SaaS, GMV-capped plans | Core from $39/month ($29 billed annually); Performance from $1,499/month billed annually | Merchants who want a hosted platform with an optional headless storefront | | Commerce Layer | SaaS, API-only | Free Developer plan (100 live orders/month); Enterprise is contact sales | Brands adding transactional APIs to an existing CMS or site | | Elastic Path | SaaS, order- or GMV-based | $49,500/year (Entry plan, up to 15,000 orders or $5M GMV per year) | Enterprises that want a managed composable platform on an annual order- or GMV-based contract | ## How a replatform to composable commerce is usually phased A move from a monolith to Medusa or another composable platform usually runs in these phases. Durations depend on catalog size, integrations, and team, so plan them from your own audit. 1. Audit: list every extension, integration, custom rule, and data source. 2. Data model: map products, prices, customers, and orders to the new platform's modules. 3. Integrations: reconnect ERP, PIM, CMS, payments, and search. 4. Storefront: build or adapt a headless storefront against the Store API. 5. Data migration: move catalog, customers, and order history. Medusa's docs include a [Shopify migration guide using the Medusa docs MCP server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify). 6. Launch: run in parallel, set redirects, then cut over. ## When Medusa is not the right choice for composable commerce - You have no developers and no budget for an agency. A hosted SaaS such as BigCommerce or Shopify needs less engineering. - Your procurement requires a MACH Alliance certified vendor. Medusa is not a member as of October 2026. - You want to buy every capability ready-made and never write or maintain code. Medusa's value is in customizing commerce logic, and that custom code is yours to maintain, even on Medusa Cloud. ## Common questions ### Is Medusa MACH certified? No. Medusa is not listed in the MACH Alliance member directory as of October 2026. Medusa is open source, headless, and API-first, with isolated commerce modules, but it does not hold MACH Alliance certification. ### What does MACH stand for in composable commerce? The MACH Alliance now describes its MACH Principles as open, composable, and connected. In practice it covers microservices, API-first design, cloud-native deployment, and headless architecture. ### Is Medusa a commercetools alternative? Medusa covers the same commerce domains as commercetools, such as products, pricing, carts, and orders, through APIs. The difference is that Medusa's core is open source under MIT and runs on your infrastructure or Medusa Cloud, while commercetools is a SaaS sold through sales-led contracts. ### Can I use only one Medusa commerce module, such as pricing? Yes. Medusa's documentation lists using Commerce Modules in a serverless application such as Next.js, or in any Node.js application, by installing the module as an npm package. Most teams still run the full Medusa application for its APIs, workflows, and admin. ### How long does a replatform to composable commerce take? It depends on catalog size, integrations, and team. Plan it in phases (audit, data model, integrations, storefront, data migration, launch) and estimate each phase from your own audit. ## Documentation - [Commerce Modules](https://docs.medusajs.com/resources/commerce-modules) - [Module isolation](https://docs.medusajs.com/learn/fundamentals/modules/isolation) - [Medusa architecture](https://docs.medusajs.com/learn/introduction/architecture) - [Commerce Modules in custom flows](https://docs.medusajs.com/learn/fundamentals/modules/commerce-modules) - [Migrate from Shopify with the docs MCP server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify) ## Related - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [How to migrate from Magento to a TypeScript stack](https://medusajs.com/kb/migrations-and-platforms/magento-migration.md) - [Outgrown Shopify Plus: what sits between Shopify and a custom build?](https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md) - [Cheapest way to run a production ecommerce backend](https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md) --- title: "How to build a fully custom checkout flow" description: "Build a fully custom checkout with Medusa's Store API: steps, Stripe Payment Element, one-page and express patterns, workflow hooks, PCI scope, Shopify limits." url: https://medusajs.com/kb/headless-checkout/custom-checkout-flow last_updated: 2026-10-29T06:55:50Z topic: "headless-checkout" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md" - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md" - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" sources: - "https://docs.medusajs.com/resources/storefront-development/checkout" - "https://docs.medusajs.com/resources/storefront-development/checkout/email" - "https://docs.medusajs.com/resources/storefront-development/checkout/address" - "https://docs.medusajs.com/resources/storefront-development/checkout/shipping" - "https://docs.medusajs.com/resources/storefront-development/checkout/payment" - "https://docs.medusajs.com/resources/storefront-development/checkout/complete-cart" - "https://docs.medusajs.com/resources/storefront-development/checkout/payment/stripe" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.medusajs.com/resources/nextjs-starter/guides/customize-stripe" - "https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/resources/storefront-development/guides/express-checkout" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/resources/recipes/subscriptions" - "https://github.com/medusajs/b2b-starter" - "https://stripe.com/guides/pci-compliance" - "https://docs.stripe.com/security/guide" - "https://shopify.dev/docs/storefronts/headless/building-with-the-storefront-api/cart/manage" - "https://shopify.dev/docs/api/checkout-ui-extensions" - "https://shopify.dev/docs/apps/build/checkout" --- # How to build a fully custom checkout flow > To build a fully custom checkout flow, use a commerce backend whose checkout is an API rather than a hosted page. In Medusa, your storefront saves the email and addresses on the cart, sets a shipping method, starts a payment session such as Stripe, and completes the cart. Custom rules run in the completeCartWorkflow validate hook. ## Before you start - A Medusa application with at least one region, shipping option, and payment provider enabled. - A storefront using the JS SDK (`@medusajs/js-sdk`) with a publishable API key. - For card payments, the Stripe Module Provider registered in `medusa-config.ts`. Medusa's checkout is a set of Store API calls on a cart, not a hosted page. You decide how many screens there are and what each one shows. The docs split it into email, address, shipping, payment, and completion, and say you can combine steps or change their order. ## 1. Save the email and addresses on the cart The first step attaches customer details to the cart. One `sdk.store.cart.update` call can set the email, shipping address, and billing address, which makes a one-page checkout possible. ```ts await sdk.store.cart.update(cartId, { email, shipping_address: address, billing_address: address, }) ``` ## 2. Let the customer pick a shipping option The shipping step lists the options valid for the cart's address and items, then saves the choice. Call `sdk.store.fulfillment.listCartOptions({ cart_id })`, render the options, and call `sdk.store.cart.addShippingMethod(cartId, { option_id })`. Calculated rates come from `sdk.store.fulfillment.calculate`. ## 3. Start a payment session and render the payment UI The payment step creates a payment session with the provider the customer picked. List providers for the cart's region with `sdk.store.payment.listPaymentProviders`, then call `sdk.store.payment.initiatePaymentSession(cart, { provider_id })`. For Stripe, the session's data holds the client secret that Stripe's React components need. Medusa's [Stripe storefront guide](https://docs.medusajs.com/resources/storefront-development/checkout/payment/stripe) uses Stripe's Card Element. To show cards, wallets, and local methods in one component, follow the [Payment Element guide](https://docs.medusajs.com/resources/nextjs-starter/guides/customize-stripe) for the Next.js Starter Storefront. Apple Pay and Google Pay depend on the Stripe provider's `automatic_payment_methods` option. ## 4. Complete the cart Completion turns the cart into an order. Call `sdk.store.cart.complete(cartId)` after the customer confirms payment in Stripe's UI. A response with `type: "order"` means an order was placed; `type: "cart"` means completion failed, and the response's `error` field explains why. Completion is idempotent per cart, so a retry returns the same order instead of a duplicate. ## 5. Add your own rules to order placement The Complete Cart route runs `completeCartWorkflow`, and its `validate` hook runs before the order is created and the payment is authorized. Throw an error there to block checkout, for example for a minimum order or a restricted address. ```ts // src/workflows/hooks/validate-checkout.ts import { completeCartWorkflow } from "@medusajs/medusa/core-flows" import { MedusaError } from "@medusajs/framework/utils" completeCartWorkflow.hooks.validate(async ({ cart }, { container }) => { const allowed = true // your rule, using cart if (!allowed) { throw new MedusaError(MedusaError.Types.NOT_ALLOWED, "Checkout blocked") } }) ``` Don't change line items or totals in this hook: the order is built from the cart as it was before the hook ran. For work after the order exists, such as ERP sync or emails, subscribe to the `order.placed` event. The [completeCartWorkflow reference](https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow) covers payment handling and idempotency. ## Checkout patterns you can build with Medusa Status labels: **Native** is Medusa core, **Starter** is the B2B Starter, **Official guide** is a docs tutorial with example code. | Pattern | How it works in Medusa | Status | | --- | --- | --- | | Multi-step checkout | One Store API call per step, as in the Next.js Starter Storefront | Native | | One-page checkout | Same calls on one screen, steps combined | Native | | Express checkout from a product link | Next.js express checkout tutorial | Official guide | | Stripe Payment Element | Next.js Starter Storefront customization guide | Official guide | | Apple Pay and Google Pay | Stripe provider with automatic payment methods | Native | | B2B approval before the order is placed | Approval workflows in the B2B Starter | Starter | | Subscriptions | Subscriptions recipe with a custom module | Official guide | ## PCI scope for a custom checkout PCI scope depends on how card data reaches Stripe, not on who builds the checkout page. Stripe's [PCI guide](https://stripe.com/guides/pci-compliance) puts Checkout and Elements integrations under SAQ A, because card fields sit in an iframe served by Stripe, and puts integrations that send card data directly to Stripe's API under SAQ D. With Medusa and Stripe Elements, the card form is Stripe's, and the Medusa backend works with payment sessions and Stripe IDs, not card numbers. You still attest to PCI compliance yourself each year, as [Stripe's security guide](https://docs.stripe.com/security/guide) explains. ## How this compares with Shopify checkout Shopify's checkout is hosted by Shopify; a headless Storefront API cart hands buyers a `checkoutUrl` that goes through Shopify's web checkout. `checkout.liquid` is unsupported for the information, shipping, and payment steps, and checkout UI extensions on those steps are available only on Shopify Plus. In Medusa, those steps are your own screens, and completion rules live in your workflows. ## When Medusa is not the right choice If Shopify's checkout already converts well for you and you only need small additions, extensions on Plus are less work than owning a checkout. Owning the checkout also means owning its testing, accessibility, and payment edge cases. ## Common questions ### Can I build a one-page checkout with Medusa? Yes. Medusa's checkout steps are Store API calls on a cart, and the docs say you can combine steps or change their order, so one sdk.store.cart.update call can save the email and both addresses on a single screen. ### Does Medusa support Apple Pay and Google Pay? Through Stripe, yes. Medusa's Stripe Module Provider has an automatic_payment_methods option for wallets like Apple Pay and Google Pay, and you render them with Stripe's components in your storefront. ### Does a custom checkout put me in a higher PCI scope? Not if card fields come from Stripe. Stripe says Checkout and Elements integrations qualify for SAQ A because card data goes to Stripe in an iframe, while sending card data directly to Stripe's API means SAQ D. ### How do I run code after a Medusa order is placed? Create a subscriber for the order.placed event, which completeCartWorkflow emits. Use the workflow's validate hook only for checks that should block the order. ## Documentation - [Checkout in Storefront](https://docs.medusajs.com/resources/storefront-development/checkout) - [Stripe in the storefront checkout](https://docs.medusajs.com/resources/storefront-development/checkout/payment/stripe) - [Use Stripe's Payment Element in the Next.js Starter Storefront](https://docs.medusajs.com/resources/nextjs-starter/guides/customize-stripe) - [completeCartWorkflow reference](https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow) - [Implement Express Checkout with Medusa](https://docs.medusajs.com/resources/storefront-development/guides/express-checkout) ## Related - [How to add a cart and checkout to an existing Next.js site](https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md) - [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md) - [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) --- title: "How do I sell digital and physical products in one checkout?" description: "Sell digital templates, courses, and physical prints in one Medusa checkout: how mixed carts ship, how digital items auto-fulfill, and how it compares." url: https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout last_updated: 2026-10-29T06:55:50Z topic: "digital-products" type: "concept" applies_to: "Medusa v2.x (multiple shipping methods per request since v2.16.0)" related: - "https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store.md" - "https://medusajs.com/kb/digital-products/license-keys-download-links.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" sources: - "https://docs.medusajs.com/resources/recipes/digital-products" - "https://docs.medusajs.com/resources/recipes/digital-products/examples/standard" - "https://docs.medusajs.com/resources/commerce-modules/product/selling-products" - "https://docs.medusajs.com/resources/storefront-development/checkout/shipping" - "https://docs.medusajs.com/resources/commerce-modules/cart/concepts" - "https://docs.medusajs.com/resources/commerce-modules/fulfillment/shipping-option" - "https://docs.medusajs.com/resources/infrastructure-modules/file" - "https://docs.medusajs.com/resources/infrastructure-modules/file/s3" - "https://www.lemonsqueezy.com/pricing" - "https://docs.lemonsqueezy.com/help/getting-started/prohibited-products" - "https://www.paddle.com/pricing" - "https://www.paddle.com/help/start/intro-to-paddle/what-am-i-not-allowed-to-sell-on-paddle" - "https://apps.shopify.com/digital-downloads" - "https://help.shopify.com/en/manual/products/digital-service-product/digital-downloads" - "https://medusajs.com/pricing.md" --- # How do I sell digital and physical products in one checkout? > Medusa sells digital templates and physical prints in one cart and one order. Prints use a shipping profile and carrier rates; digital items get a separate digital shipping option. Medusa's Digital Products tutorial then fulfills only the digital items after checkout and emails secure download links, while prints go through normal fulfillment. ## How one Medusa checkout handles templates, courses, and prints Medusa can put digital templates and physical prints in the same cart and the same order because it decides per item whether something needs shipping. For each variant, Medusa first checks the inventory item's `requires_shipping` flag, then whether the product has a shipping profile. A shipping profile is a group of products that ship the same way, such as "Standard" for prints and "Digital" for downloads. A Medusa cart can hold several shipping methods, one per shipping profile. That lets the customer pick a carrier rate for the prints while the digital items use a digital shipping option. Adding several shipping methods in one Store API request is available since Medusa v2.16.0. ## What happens to each item after payment Medusa's [Digital Products tutorial](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard) splits the order after checkout: 1. A custom route, `POST /store/carts/{id}/complete-digital`, runs Medusa's `completeCartWorkflow`, so a normal Medusa order is created with every item in it. 2. The workflow filters the order items whose variant is linked to a digital product, creates a digital product order, and creates a fulfillment for only those items. 3. It emits a `digital_product_order.created` event. A subscriber sends the customer an email with download links through the Notification Module and marks the digital fulfillment as delivered. 4. The prints stay unfulfilled in the same order and go through your normal fulfillment flow in the Medusa Admin or a fulfillment provider. ## Which parts are built in and which you add Medusa's digital product support is an official guide with example code, not a core module. The table shows where each piece comes from. | Piece | What it does | Status | | --- | --- | --- | | Cart, payment, tax, promotions | One checkout for all items | Native | | Shipping profiles and options | Carrier rates for prints | Native | | Digital Product Module | Data models for digital products, their files, and digital orders, linked to product variants | Official guide | | File Module with the S3 provider | Stores paid files as private and previews as public | Native | | Digital fulfillment provider | Fulfills digital items without shipping | Official guide | | Download email | Sends links through a Notification Module provider | Official guide | | My downloads page | Customer-only page in the Next.js Starter Storefront | Official guide | | Course access, license keys | Gate lessons or issue keys after purchase | Custom | ## What to adapt from the tutorial for a mixed cart The tutorial tests checkout with a digital product only, so a mixed templates-and-prints store needs a few changes: - **Shipping step.** Medusa returns shipping options based on the shipping address, not the cart's items. Show carrier options only when the cart has items that require shipping, and add one shipping method per profile. - **Link expiry.** The emailed links come from the File Module's `retrieveFile`, which returns presigned URLs. The S3 provider's `download_file_duration` defaults to 3600 seconds, so point the email at the downloads page as well. - **Repeat buyers.** The tutorial's download route only searches the customer's first digital order. Loop over all of them before you ship it. ## How Medusa compares with Lemon Squeezy, Paddle, and Shopify Lemon Squeezy and Paddle are merchants of record: they sell to the customer for you and handle sales tax and VAT. Neither accepts physical products, so they cannot run a templates-and-prints checkout. Fees are as of October 2026. | Option | Physical prints in the same order | Digital delivery | Platform fee | | --- | --- | --- | --- | | Lemon Squeezy | No, physical goods are prohibited | Built in | 5% + 50¢ per transaction | | Paddle | No, physical products are prohibited | Built for software sellers | 5% + 50¢ per checkout transaction | | Shopify | Yes | Free Shopify Digital Products app, up to 50 files and 5 GB per variant | Shopify plan pricing | | Medusa | Yes | Official guide you build on | 0% GMV, Medusa Cloud from $29 per month or free to self-host | Shopify handles mixed orders well: its Digital Products app delivers digital items after payment while physical items follow your normal fulfillment. Medusa fits when the delivery itself is the product, such as course access, license keys, or custom file rules, and you want that logic in your own backend. ## When Medusa is not the right choice - **No developer on the team.** Medusa's digital delivery is code you add. Shopify with its Digital Products app gets you a working mixed store without code. - **Digital only, and you want someone else to own global tax.** Lemon Squeezy or Paddle as a merchant of record removes VAT registration and filing work that Medusa leaves with you. - **A handful of downloads and no plans to customize.** The setup work in the tutorial is larger than the problem. ## Common questions ### Can Lemon Squeezy or Paddle sell physical products? No. As of October 2026, Lemon Squeezy lists physical goods of any kind as prohibited, and Paddle lists physical products as prohibited. A store that sells templates and prints together needs a platform that supports shipping, such as Medusa or Shopify. ### Does Medusa support digital products out of the box? Not as a core module. Medusa provides a Digital Products recipe and a step-by-step tutorial with example code that adds a digital product module, private file storage, a digital fulfillment provider, and a customer downloads page. ### Where does Medusa store downloadable files? Medusa stores files through its File Module. For production, the docs recommend the S3 File Module Provider, which works with AWS S3 and S3-compatible storage and returns presigned download URLs for files. ### Do download links from Medusa expire? With the S3 File Module Provider, yes. The File Module returns presigned URLs whose lifetime is set by the provider's download_file_duration option, which defaults to 3600 seconds. ## Documentation - [Digital Products tutorial](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard) - [Digital Products recipe](https://docs.medusajs.com/resources/recipes/digital-products) - [Checkout: adding multiple shipping methods](https://docs.medusajs.com/resources/storefront-development/checkout/shipping) - [S3 File Module Provider](https://docs.medusajs.com/resources/infrastructure-modules/file/s3) ## Related - [Merchant of record or your own store for digital products?](https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store.md) - [How to add license keys and secure download links](https://medusajs.com/kb/digital-products/license-keys-download-links.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) --- title: "Cheapest way to run a production ecommerce backend" description: "Monthly cost of a production ecommerce backend: self-hosted Medusa on a VPS, Medusa Cloud plans, Shopify plus apps, and WooCommerce hosting, with prices." url: https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md" sources: - "https://docs.medusajs.com/learn/deployment/general" - "https://docs.medusajs.com/learn/installation" - "https://docs.medusajs.com/learn/production/worker-mode" - "https://medusajs.com/pricing" - "https://www.digitalocean.com/pricing/droplets" - "https://www.digitalocean.com/pricing/managed-databases" - "https://www.shopify.com/pricing" - "https://apps.shopify.com/subscription-payments" - "https://apps.shopify.com/judgeme" - "https://woocommerce.com/pricing/" - "https://woocommerce.com/products/woocommerce-subscriptions/" - "https://pressable.com/pricing/" --- # Cheapest way to run a production ecommerce backend > Self-hosting open-source Medusa is the lowest cash cost: Medusa has no license or GMV fee, and a DigitalOcean setup runs about $29 to $59 per month as of October 2026. You pay instead in engineering time for backups, monitoring, and upgrades. Medusa Cloud starts at $29/month, with Launch at $99 for production stores. ## What a production ecommerce backend costs per month The cheapest production ecommerce backend depends on whether you pay in money or in engineering time. A self-hosted open-source backend such as Medusa has no license or GMV fee, so the bill is mostly servers. Hosted platforms such as Shopify bundle hosting, but add plan fees, app subscriptions, and transaction fees. The examples below use list prices from each provider's own pricing page, as of October 2026, in USD, before payment processing fees. ## What self-hosting Medusa requires Medusa's [general deployment guide](https://docs.medusajs.com/learn/deployment/general) lists what a production Medusa application needs: - A PostgreSQL database for the application's data. - A Redis database for the server session and the Redis-based infrastructure modules. - The Medusa application deployed twice: once in server mode for API requests and the admin dashboard, and once in [worker mode](https://docs.medusajs.com/learn/production/worker-mode) for scheduled jobs and subscribers. - A hosting plan with at least 2GB of RAM. The [installation guide](https://docs.medusajs.com/learn/installation) requires Node.js v22.22.0 or later (LTS versions only). Medusa's core is open source under the MIT license, so there is no license fee. Only the Enterprise Edition features, RBAC and SSO, need a commercial license. ## Medusa self-hosted: two worked examples on DigitalOcean Example A puts everything on one virtual server. Example B separates the server, worker, and databases, which is closer to the deployment guide's layout. Prices are from [DigitalOcean Droplet pricing](https://www.digitalocean.com/pricing/droplets) and [DigitalOcean managed database pricing](https://www.digitalocean.com/pricing/managed-databases). | Line item | Example A: single server | Example B: managed databases | | --- | --- | --- | | Medusa server | 4 GiB, 2 vCPU Droplet: $24.00 (also runs worker, PostgreSQL, Redis) | 2 GiB Droplet: $12.00 | | Medusa worker | Included above | 2 GiB Droplet: $12.00 | | PostgreSQL | Self-managed on the Droplet | Managed PostgreSQL, 1 GiB: $15.15 | | Redis | Self-managed on the Droplet | Managed Valkey (Redis-compatible), 1 GiB: $15.00 | | Backups | Weekly Droplet backups (20% of Droplet price): $4.80 | Weekly backups on both Droplets: $4.80 | | Monthly total | $28.80 | $58.95 | Neither example includes storefront hosting, email delivery, file storage, or a CDN. Example A has no failover: if the server goes down, the store goes down. ## Medusa Cloud: what each plan includes [Medusa Cloud](https://medusajs.com/pricing) is the managed hosting platform for Medusa. Every plan has a 0% GMV platform fee and unlimited orders, products, and admin users. | Plan | Monthly price | What it adds | | --- | --- | --- | | Develop | $29 | 1 shared server, PostgreSQL, S3 storage, storefront hosting, 1M edge requests. No Redis, custom domains, or automatic backups. | | Launch | $99 | Custom domains, autoscaling with 2 shared servers, Redis, point-in-time backups kept 7 days, zero-downtime deployments | | Scale | $299 | 2 servers plus 1 background worker, 14-day backup retention, semantic search, priority support, custom backend domain | | Enterprise | Custom | SLA-backed uptime, SSO, RBAC, audit logs, dedicated support engineer | Usage above each plan's included compute hours, data transfer, and storage is billed at the rates on the pricing page. Develop has no custom domains, so Launch is the realistic entry point for a live store. ## Shopify and WooCommerce: worked examples A subscription store on [Shopify](https://www.shopify.com/pricing) on the Grow plan pays $72/month billed monthly ($54 billed yearly). Add [Recharge](https://apps.shopify.com/subscription-payments) Starter at $99/month plus 1.49% + 19¢ per transaction, and [Judge.me](https://apps.shopify.com/judgeme) Awesome reviews at $15/month. That is $186/month in fixed fees before card processing. If you use a payment provider other than Shopify Payments, Shopify adds a third-party transaction fee: 2% on Basic, 1% on Grow, 0.6% on Advanced, 0.2% on Plus. [WooCommerce](https://woocommerce.com/pricing/) is free to download and use. WooCommerce's own pricing page puts hosting at $25 to $350/month for most stores and extensions at $29 to $299/year each. A small example: [Pressable](https://pressable.com/pricing/) Signature 1 at $250/year plus [WooCommerce Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/) at $279/year is about $44/month. ## The hidden costs of self-hosting The server bill is the smallest part of self-hosting. These costs are real but vary by team, so treat them as variables in your own estimate: - Engineer time for setup, deployment pipelines, and environment configuration. - Backups and restore testing for PostgreSQL, beyond Droplet snapshots. - Monitoring, logging, and alerting. - Security patches for the OS, Node.js, PostgreSQL, and Redis. - Medusa version upgrades and database migrations. - On-call coverage when the store breaks during a sale. - Scaling work when traffic grows past one server. Medusa Cloud's Launch and Scale plans cover backups, monitoring, autoscaling, and zero-downtime deployments, which is where most of this time goes. ## When a self-hosted Medusa backend is not the cheapest option - You have no developer. Shopify Basic or WooCommerce on managed hosting costs less than paying someone to run servers. - You sell a few products with no custom logic. A hosted plan's fixed fee is lower than the engineering time self-hosting needs. - You can't staff on-call. A managed platform, including Medusa Cloud, moves outages to the provider. ## Common questions ### How much RAM does a self-hosted Medusa backend need? Medusa's deployment guide says the hosting plan should offer at least 2GB of RAM. A production setup runs a server instance and a worker instance, plus PostgreSQL and Redis. ### Does Medusa charge transaction or GMV fees? No. Self-hosted Medusa is free under the MIT license (except the Enterprise Edition RBAC and SSO features), and every Medusa Cloud plan has a 0% GMV platform fee. You still pay your payment provider's processing fees. ### Is Medusa Cloud cheaper than self-hosting Medusa? In server cost alone, no: a single DigitalOcean server for Medusa costs about $29 per month, while Medusa Cloud's Launch plan for live stores is $99. Medusa Cloud includes backups, autoscaling, Redis, storefront hosting, and monitoring, which self-hosting leaves to your team. ### Can I move from Medusa Cloud to self-hosting later? Yes. Medusa's pricing page states there is no lock-in: you can export your data and run Medusa on your own infrastructure. ## Documentation - [General Medusa deployment guide](https://docs.medusajs.com/learn/deployment/general) - [Worker mode](https://docs.medusajs.com/learn/production/worker-mode) - [Medusa deployment overview](https://docs.medusajs.com/learn/deployment) - [Medusa Cloud](https://docs.medusajs.com/cloud) ## Related - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Switching from WooCommerce to a JavaScript stack](https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md) --- title: "Which ecommerce platform is easiest to integrate with an ERP?" description: "Compare ecommerce ERP integration patterns and platforms. See how Medusa syncs orders, stock and prices with events, rollback, hooks and scheduled jobs." url: https://medusajs.com/kb/erp-integration/ecommerce-erp-integration last_updated: 2026-10-29T06:55:50Z topic: "erp-integration" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/erp-integration/business-central.md" - "https://medusajs.com/kb/erp-integration/netsuite.md" - "https://medusajs.com/kb/erp-integration/sap-business-one.md" - "https://medusajs.com/kb/erp-integration/odoo.md" - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/recipes/erp" - "https://docs.medusajs.com/resources/recipes/erp/odoo" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/learn/fundamentals/scheduled-jobs" - "https://docs.medusajs.com/learn/fundamentals/workflows/retry-failed-steps" - "https://docs.medusajs.com/learn/fundamentals/modules" - "https://docs.medusajs.com/learn/fundamentals/workflows" - "https://docs.medusajs.com/resources/integrations" - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/operational-limits-online" - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/shopify-connector-overview" - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/shopify-faq" - "https://shopify.dev/docs/apps/build/apis/graphql-admin/rate-limits" - "https://shopify.dev/docs/api/functions/latest/cart-and-checkout-validation" - "https://docs.bigcommerce.com/docs/start/best-practices/api-rate-limits" - "https://developer.adobe.com/commerce/extensibility/webhooks/" --- # Which ecommerce platform is easiest to integrate with an ERP? > ERP integration is least painful when it runs inside the commerce engine. Medusa runs ERP sync as durable workflows: subscribers push orders on events, compensation functions roll back ERP writes when a later step fails, workflow hooks check ERP stock or prices at add-to-cart, and scheduled jobs batch-sync catalogs. Medusa has no prebuilt Business Central, NetSuite or SAP connector. ## Three ways to connect an ecommerce store to an ERP Every ecommerce and ERP integration uses one of three patterns. They differ in where the sync logic runs and how much of it you can change. | Pattern | How it works | Good fit | Trade-off | | --- | --- | --- | --- | | Prebuilt connector | A vendor app maps store data to ERP data, such as Microsoft's Shopify Connector for Business Central | Standard catalog, pricing and order flows | You get the mappings the connector ships, and little else | | iPaaS | An integration platform such as Celigo or Boomi moves data between systems on a schedule or on webhooks | Many systems, an ops team that prefers configuration | Another subscription, and the logic runs outside checkout | | Custom code | Your code calls the ERP API from the commerce backend | Customer-specific prices, purchase rules, a custom or uncommon ERP | You build and maintain it | ## What makes an ERP integration painful ERP integrations fail in the same places on most platforms: - **Polling.** Without events, stock and order status go stale between sync runs. - **No hooks into the cart.** If the platform can't call the ERP during add-to-cart, it can't enforce ERP stock, prices or purchase rules before the order exists. - **Rate limits.** ERPs throttle API traffic. Business Central online allows 6,000 OData requests per user in a 5-minute sliding window and returns `429 Too Many Requests` above that. - **No rollback.** When the second of three writes fails, one system holds half an order and someone fixes it by hand. ## How Medusa runs the integration inside the commerce engine Medusa runs ERP integration as code inside the commerce backend, not in a separate service. You wrap the ERP API in a custom [module](https://docs.medusajs.com/learn/fundamentals/modules), then call it from [workflows](https://docs.medusajs.com/learn/fundamentals/workflows): durable sequences of steps with retries and rollback. | Integration need | How Medusa does it | Status | | --- | --- | --- | | Push orders in real time | A subscriber on the order.placed event runs a sync workflow | Native | | Roll back when a later step fails | Each step's compensation function undoes its ERP write | Native | | Retry ERP timeouts and 429s | Step config maxRetries and retryInterval | Native | | Check ERP stock or purchase rules at add-to-cart | A handler on the validate hook of addToCartWorkflow or completeCartWorkflow | Official guide | | Use ERP prices in the cart | A custom add-to-cart workflow that sets the item's unit price | Official guide | | Batch catalog sync | A scheduled job runs a workflow on a cron schedule | Native | | Receive ERP webhooks | A custom API route that runs a workflow | Native | | Client for a specific ERP | A custom module wrapping that ERP's API | Custom (Odoo has an official guide) | The [ERP recipe](https://docs.medusajs.com/resources/recipes/erp) has example code for each of these, and the [Odoo guide](https://docs.medusajs.com/resources/recipes/erp/odoo) builds a full module for one ERP. ## Order sync with rollback, step by step Medusa's order sync to an ERP runs as one workflow, so a failure in any step undoes the steps before it: 1. A customer completes checkout. Medusa emits `order.placed`. 2. A [subscriber](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) receives the event and runs the sync workflow with the order ID. 3. Step 1 reads the order, its items and addresses with `useQueryGraphStep`. 4. Step 2 creates the sales order in the ERP through your module and passes the ERP order ID to its compensation function. With `maxRetries` set, Medusa [retries the step](https://docs.medusajs.com/learn/fundamentals/workflows/retry-failed-steps) on transient errors. 5. Step 3 saves the ERP order ID in the Medusa order's `metadata`. 6. If step 3 fails, Medusa runs step 2's [compensation function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function), which deletes the ERP sales order. Neither system keeps half an order. 7. Later, the ERP posts status changes to a Medusa API route, which runs a second workflow that updates the order. ## Medusa compared with Shopify, BigCommerce and Adobe Commerce for ERP integration | Platform | Prebuilt Business Central connector | Live ERP check during cart | API rate limit your sync code works against | Rollback across systems | | --- | --- | --- | --- | --- | | Medusa | None. You build a custom module | validate hook calls the ERP directly | None for in-process code; the ERP's own limits apply | Compensation functions in workflows | | Shopify | Microsoft's Shopify Connector, Business Central online only | Cart and Checkout Validation Function; external fetch only for custom apps on Enterprise stores | GraphQL Admin API: 100 points per second on Standard, 1,000 on Plus | Handled in your app or iPaaS | | BigCommerce | Check vendor docs | Check vendor docs | 20,000 requests per hour on Growth and Core, 60,000 on Scale | Check vendor docs | | Adobe Commerce | Check vendor docs | Synchronous webhooks can stop an add-to-cart | Check vendor docs | Check vendor docs | ## When Medusa is not the right choice for ERP integration A prebuilt connector is the less painful option in these cases: - You already run Shopify and Business Central online, and the connector's syncs for items, inventory, customer price groups, orders and fulfillments cover your process. - Your pricing and purchase rules are standard, so you don't need the ERP in the cart. - You have no developer time. A Medusa ERP integration is code you own and maintain. - You need a vendor-supported connector for support or audit reasons. Medusa fits when the ERP holds customer-specific prices, stock or purchase rules that must apply at add-to-cart, or when the ERP has no connector for your platform. Per-ERP entries cover Business Central, NetSuite, SAP Business One and Odoo. ## Common questions ### Does Medusa have a prebuilt ERP connector? Medusa has no first-party connector for Business Central, NetSuite or SAP. Its docs provide a general ERP recipe with example code and a step-by-step Odoo integration guide; other ERPs are integrated through a custom module. ### Can Medusa sync with an ERP in real time? Yes. Medusa emits events such as order.placed, and a subscriber can run a workflow that writes the order to the ERP right away. Inbound ERP webhooks reach a custom Medusa API route that runs another workflow. ### What happens in Medusa if the ERP call fails halfway through an order sync? Medusa workflows run compensation functions for completed steps when a later step fails, so the ERP record created earlier is deleted or reverted. Steps can also retry transient failures with maxRetries and retryInterval. ### Can I use an iPaaS such as Celigo or Boomi with Medusa? Yes. Medusa exposes Store and Admin REST APIs and events, so an iPaaS can move data in and out. Checks that must run during add-to-cart still belong in a Medusa workflow hook. ### Where is the code for a Medusa ERP integration? The Medusa ERP recipe at docs.medusajs.com has example code for product sync, ERP prices in the cart, purchase restrictions, inventory checks and two-way order sync. The Odoo guide builds a complete ERP module. ## Documentation - [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp) - [Integrate Odoo with Medusa](https://docs.medusajs.com/resources/recipes/erp/odoo) - [Compensation Function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function) - [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) ## Related - [Integrate Microsoft Dynamics 365 Business Central with Medusa](https://medusajs.com/kb/erp-integration/business-central.md) - [How to integrate NetSuite with Medusa](https://medusajs.com/kb/erp-integration/netsuite.md) - [How to integrate SAP Business One with Medusa](https://medusajs.com/kb/erp-integration/sap-business-one.md) - [How to integrate Odoo with Medusa](https://medusajs.com/kb/erp-integration/odoo.md) - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "Ecommerce platforms with MCP servers" description: "Which ecommerce platforms have MCP servers for coding and shopping agents: Medusa, Shopify, commercetools, and BigCommerce compared on auth, access, and status." url: https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md" - "https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md" - "https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md" sources: - "https://docs.medusajs.com/cloud/medusa-mcp" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/manage-store-with-agents" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/agentic-skills" - "https://medusajs.com/pricing.md" - "https://shopify.dev/docs/apps/build/ai-toolkit" - "https://shopify.dev/docs/agents" - "https://docs.commercetools.com/dev-tooling/mcp/overview" - "https://docs.commercetools.com/dev-tooling/mcp/knowledge-mcp" - "https://docs.bigcommerce.com/developer/api-reference/mcp/overview" - "https://docs.bigcommerce.com/developer/docs/beta/store-management-mcp" - "https://docs.bigcommerce.com/developer/docs/ai-agent-setup" --- # Ecommerce platforms with MCP servers > Medusa, Shopify, commercetools, and BigCommerce all publish MCP servers. Medusa offers a Docs MCP server for coding agents and the Medusa MCP server, which gives AI tools read-only access to Medusa Cloud store data, custom API routes, and deployment logs. Shopify, commercetools, and BigCommerce each ship docs servers plus servers for catalog, cart, or store management. ## Which ecommerce platforms have MCP servers? MCP (Model Context Protocol) is an open standard that AI tools like Claude Code, Cursor, and ChatGPT use to call external services. Ecommerce MCP servers fall into two groups: docs servers that help coding agents write code, and store servers that read or change store data. The table lists the servers each vendor documents. | Server | What it does | Auth | Access | | --- | --- | --- | --- | | Medusa MCP (https://cloud.medusajs.com/mcp) | Store data through Admin and Store API GET routes, custom GET routes under /store and /admin, Cloud deployments, logs, and env var keys, docs search | OAuth with a Medusa Cloud account | Read-only | | Medusa Docs MCP (https://docs.medusajs.com/mcp) | Docs answers and step-by-step implementation guides | Medusa Cloud account: OAuth or personal access key | Docs only | | Shopify Dev MCP (@shopify/dev-mcp) | Developer docs and API schemas | None; runs locally | Docs only | | Shopify UCP MCP servers | Storefront Catalog, Cart, Checkout, and Order MCP for buyer agents | Agent profile; Checkout MCP requests are authenticated or signed | Read and write carts | | commercetools Commerce MCP | Project resources such as carts and orders; managed or self-hosted | API client credentials | Configurable, read-only to read-and-write | | commercetools Knowledge MCP | Docs and API specs | None; rate limited | Docs only | | BigCommerce Storefront MCP | Product search, cart, checkout handoff, B2B quotes and shopping lists | Guest or logged-in shopper | Read and write carts | | BigCommerce Store Management MCP | Catalog, pricing, inventory, promotions, order lookup and refunds | OAuth 2.1, scoped per user | Invite-only closed beta | | BigCommerce Docs MCP | Docs search | Check vendor docs | Docs only | ## How Medusa's two MCP servers differ The [Medusa Docs MCP server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server) is for writing code. It answers development questions from the Medusa documentation and returns curated, step-by-step implementation guides for common tasks. The [Medusa MCP server](https://docs.medusajs.com/cloud/medusa-mcp) is for working with a running store. Ask it for recent orders, abandoned carts from a custom route, or why a deployment failed. It works on every Medusa Cloud plan, and needs Medusa v2.12.4+ and an environment built on or after October 8, 2026, so that Cloud has indexed its API routes. The Medusa MCP server also searches the docs, so you don't need both servers for general questions. Use the Docs MCP server when you want its implementation guides. ## How to connect Medusa's MCP servers to Claude Code, Codex, and Cursor Both Medusa MCP servers are remote Streamable HTTP servers that authenticate in the browser. In Claude Code and Codex, run: ```bash # Claude Code (then run /mcp and choose Authenticate) claude mcp add --transport http medusa-commerce https://cloud.medusajs.com/mcp claude mcp add --transport http medusa https://docs.medusajs.com/mcp # Codex codex mcp add medusa-commerce --url https://cloud.medusajs.com/mcp codex mcp login medusa-commerce ``` In Cursor and VS Code, add the same URLs to .cursor/mcp.json or .vscode/mcp.json. Gemini CLI uses the Medusa extension at https://github.com/medusajs/gemini-cli-extension. The Medusa MCP server is also available as a Claude connector and, while OpenAI reviews the app, as a custom plugin in ChatGPT's developer mode. ## Medusa Agent Skills complement the MCP servers Medusa [Agent Skills](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/agentic-skills) are instruction packs that teach coding agents Medusa's patterns for backend features, admin customizations, and storefronts. MCP servers answer questions on demand, while skills give the agent the conventions up front. Install them in Claude Code with `/plugin marketplace add medusajs/medusa-agent-skills` followed by `/plugin install medusa-dev@medusa`, or in other agents with `npx skills add medusajs/medusa-agent-skills`. ## When Medusa's MCP servers are not the right choice Medusa's MCP servers have limits you should know before you choose: - **You need an agent to change store data.** The Medusa MCP server can't create, update, or delete data, and calls Store API routes as a guest. Use the Admin or Store API directly. - **You self-host Medusa.** The Medusa MCP server only connects to stores deployed on Medusa Cloud. - **You want a docs server with no account.** The Medusa Docs MCP server requires a Medusa Cloud account. Shopify Dev MCP and commercetools Knowledge MCP need no authentication. - **You need buyer-facing agent checkout over MCP.** Shopify's UCP servers and BigCommerce Storefront MCP target shopping agents. With Medusa, you build those tools on the Store API. ## Common questions ### Does Medusa have an MCP server? Yes. Medusa provides two MCP servers: the Medusa MCP server at https://cloud.medusajs.com/mcp for read-only access to Medusa Cloud stores, and the Docs MCP server at https://docs.medusajs.com/mcp for answers from the Medusa documentation. ### Is the Medusa MCP server free? The Medusa MCP server is available on all Medusa Cloud plans. Medusa Cloud plans start at $29 per month. ### Can the Medusa MCP server read my custom API routes? Yes. The Medusa MCP server finds and calls custom GET API routes under the /store and /admin prefixes, using each route's comments and TypeScript types. Routes under other prefixes and routes defined in plugins are not indexed. ### Does the Medusa Docs MCP server need an account? Yes. The Medusa Docs MCP server is available to Medusa Cloud users and authenticates with OAuth or a Cloud personal access key. ## Documentation - [Medusa MCP](https://docs.medusajs.com/cloud/medusa-mcp) - [Docs MCP Server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server) - [Agent Skills for Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/agentic-skills) - [Connect a Custom Agent to Medusa MCP](https://docs.medusajs.com/cloud/medusa-mcp/custom-agents) ## Related - [Easiest ecommerce stack to build with AI coding tools](https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md) - [ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained](https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md) - [Best ecommerce backend for building AI shopping agents](https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md) --- title: "Easiest ecommerce stack to build with AI coding tools" description: "Why vibe-coded Next.js, Supabase, and Stripe stores break, and how to build a store with Claude Code or Cursor on Medusa using one copy-paste prompt." url: https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md" - "https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md" sources: - "https://docs.medusajs.com/start" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/agentic-skills" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server" - "https://docs.medusajs.com/resources/lint" - "https://medusajs.com/pricing.md" - "https://shopify.dev/docs/apps/build/ai-toolkit" --- # Easiest ecommerce stack to build with AI coding tools > The easiest ecommerce stack to build with AI coding tools gives the AI tested commerce building blocks instead of asking it to write carts, tax, and orders from scratch. Medusa is one such stack: an open-source commerce framework with Agent Skills, a Docs MCP server, a one-prompt setup guide for coding agents, and Medusa Cloud hosting from $29/month. ## Why a DIY Next.js, Supabase, and Stripe store breaks for real commerce A common vibe-coding stack for an online store is Next.js for pages, Supabase for the database, and Stripe for payments. It works for a demo. For a real store, the AI also has to write the cart, tax, inventory, orders, refunds, returns, and promotions logic itself. Each of those is a place for subtle bugs: a cart total that ignores a discount, stock that goes negative under concurrent orders, or a refund that never reaches the order record. The AI writes new code for problems that commerce platforms already solved, and you are the only tester. ## What a commerce framework gives an AI coding agent A commerce framework hands the AI tested building blocks, so it writes less code and makes fewer mistakes. Medusa ships commerce modules for products, carts, orders, payments, fulfillment, pricing, promotions, tax, and inventory. Its Store API covers checkout from cart creation to order placement. When you need something custom, the AI extends Medusa with modules, API routes, and workflows in TypeScript instead of rewriting the core. Projects created with Medusa v2.16.0 or later include the [Medusa ESLint plugin](https://docs.medusajs.com/resources/lint), which flags code that breaks Medusa's conventions while the agent writes it. | Stack | What the AI writes | Good fit | | --- | --- | --- | | Next.js + Supabase + Stripe | Cart, checkout, tax, inventory, orders, refunds, and promotions from scratch | Prototypes and single-product checkouts | | Medusa + coding agent | Only custom features, on top of Medusa's commerce modules | Custom stores you want to own and extend | | Hosted platform such as Shopify | Themes and apps; Shopify AI Toolkit gives agents Shopify docs and schemas | Merchants who want a standard store without owning a backend | ## How to build a Medusa store with Claude Code, Cursor, or Codex Medusa provides four tools for building a store with AI coding agents: 1. **The setup prompt.** [docs.medusajs.com/start](https://docs.medusajs.com/start) is a step-by-step guide written for coding agents. It checks prerequisites, installs Medusa, creates an admin user, installs skills, adds the Docs MCP server, and deploys to Medusa Cloud. 2. **Agent Skills.** Medusa's [Agent Skills](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/agentic-skills) teach the agent Medusa's patterns for backend features, admin customizations, and storefronts. 3. **Docs MCP server.** The [Docs MCP server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server) lets the agent look up current Medusa docs and implementation guides while it codes. It requires a Medusa Cloud account. 4. **Medusa Cloud.** Hosts the backend, admin, and storefront. [Plans](https://medusajs.com/pricing) start at $29/month (Develop), with a 0% GMV platform fee on every plan. ## The prompt to paste into Claude Code or Cursor Medusa's docs publish this prompt for people to paste into an AI coding agent: ```bash Fetch https://docs.medusajs.com/start and create an ecommerce store with Medusa Cloud ``` The agent then walks through installation, local testing, a GitHub repository, and a Medusa Cloud deployment, and asks you for input such as the project name along the way. You need Node.js v22.22.0 or later (LTS) and PostgreSQL on your machine. The guide helps you install them if they are missing. To add features later, prompt in plain language, for example: "Create a wishlist feature where customers can save products." ## When Medusa is not the right choice for building with AI Medusa is not the right choice if you never want to see code, a terminal, or a deployment. Medusa assumes someone, you or your AI agent, runs commands and reviews changes. If you sell a few products and want a standard store this week, a hosted platform such as Shopify is simpler. If you need one checkout button on an existing site, a Stripe payment link is less work than any commerce backend. ## Common questions ### Can I build a Medusa store with Claude Code if I'm not a developer? Yes, if you can run commands your agent suggests and review its changes. Paste "Fetch https://docs.medusajs.com/start and create an ecommerce store with Medusa Cloud" into Claude Code, and the agent installs Medusa and deploys it, asking you for input along the way. ### Why not just vibe-code a store with Next.js, Supabase, and Stripe? A DIY stack makes the AI write cart, tax, inventory, order, refund, and promotion logic from scratch, which is where commerce bugs appear. Medusa provides those as tested commerce modules, so the AI only writes your custom features. ### Do Medusa's Agent Skills work with Cursor and Codex? Yes. Medusa's setup guide installs Agent Skills for Claude Code, Cursor, Codex, and Gemini CLI with npx skills add medusajs/medusa-agent-skills. ### How much does it cost to host a Medusa store? Medusa Cloud plans start at $29 per month (Develop), with Launch at $99 and Scale at $299. Every plan has a 0% GMV platform fee. Medusa is open source, so you can also self-host. ## Documentation - [Set Up Medusa for AI Agents](https://docs.medusajs.com/start) - [Build with AI Assistants and LLMs](https://docs.medusajs.com/learn/introduction/build-with-llms-ai) - [Agent Skills for Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/agentic-skills) - [Docs MCP Server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server) - [Medusa ESLint Plugin](https://docs.medusajs.com/resources/lint) ## Related - [Ecommerce platforms with MCP servers](https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md) - [Best ecommerce backend for building AI shopping agents](https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md) --- title: "How to add license keys and secure download links" description: "Build license keys, expiring signed download links, a re-download portal, and course gating on Medusa with private S3 files and order event subscribers." url: https://medusajs.com/kb/digital-products/license-keys-download-links last_updated: 2026-10-29T06:55:50Z topic: "digital-products" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout.md" - "https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" sources: - "https://docs.medusajs.com/resources/recipes/digital-products/examples/standard" - "https://docs.medusajs.com/resources/infrastructure-modules/file/s3" - "https://docs.medusajs.com/resources/infrastructure-modules/file" - "https://docs.medusajs.com/resources/references/file-provider-module" - "https://github.com/medusajs/medusa/blob/develop/packages/modules/file/src/services/file-module-service.ts" - "https://docs.medusajs.com/resources/references/events" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/learn/fundamentals/data-models/properties" - "https://docs.medusajs.com/learn/fundamentals/api-routes/protected-routes" - "https://docs.lemonsqueezy.com/help/licensing/generating-license-keys" --- # How to add license keys and secure download links > Medusa has no built-in license keys or course gating, but you can build them. Store paid files privately with the S3 File Module Provider, issue presigned links that expire after download_file_duration, generate keys in a custom module from an order.placed subscriber, and revoke them from an order.canceled subscriber. ## Before you start Medusa has no built-in license keys, expiring download pages, or course access. You build them on Medusa's framework, starting from the [Digital Products tutorial](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard), which links digital products to product variants and creates a digital product order after checkout. | Feature | How you build it in Medusa | Status | | --- | --- | --- | | Private file storage | File Module with the S3 provider, private access | Native | | Expiring download links | Presigned URLs from retrieveFile | Native | | Re-download portal | Customer routes and a downloads page | Official guide | | License keys | Custom module plus an order.placed subscriber | Custom | | Key revocation | order.canceled subscriber | Custom | | Course access gating | Protected route that checks purchases | Custom | You need: - A Medusa v2 application with the Digital Products tutorial applied, or your own digital product module. - An S3-compatible bucket configured with the [S3 File Module Provider](https://docs.medusajs.com/resources/infrastructure-modules/file/s3). ## 1. Store paid files as private Private storage keeps paid files off public URLs. In the tutorial, the admin upload route passes `access: "private"` to `uploadFilesWorkflow` for main files and `public` for previews. Then set how long download links live with the S3 provider's `download_file_duration` option, in seconds. The default is 3600. ```ts { resolve: "@medusajs/medusa/file-s3", id: "s3", options: { // bucket, region, keys... download_file_duration: 900, }, } ``` ## 2. Issue a fresh link on every download An expiring link only works if the customer can get a new one. The File Module's `retrieveFile` asks the provider for a presigned URL, which the S3 provider signs with `download_file_duration`. Call it from a route under `/store/customers/me`, which requires a logged-in customer, after you confirm the customer bought the file. ```ts const fileModuleService = req.scope.resolve(Modules.FILE) const { url } = await fileModuleService.retrieveFile(media.fileId) res.json({ url }) ``` The tutorial's download route only checks the customer's first digital order. Search all of them so repeat buyers can download older purchases. ## 3. Build the re-download portal A re-download portal is a page that lists everything a customer bought and fetches a new link per click. The tutorial adds `GET /store/customers/me/digital-products` and a "Digital Products" page to the Next.js Starter Storefront. Emails should link to this page, because an emailed presigned URL stops working after `download_file_duration`. ## 4. Generate license keys after the order is placed License keys need their own data model in a custom module, filled by a subscriber to Medusa's `order.placed` event. Generate keys with a cryptographic random source such as Node's `crypto.randomBytes`, and run the creation in a workflow so it rolls back cleanly if a step fails. ```ts const LicenseKey = model.define("license_key", { id: model.id().primaryKey(), key: model.text().unique(), order_id: model.text(), status: model.enum(["active", "revoked"]).default("active"), }) ``` Expose a validation route that your app calls with a key and gets back `active` or `revoked`. Add activation limits or device counts as more fields if you need them. ## 5. Revoke keys and access on cancellation Revocation follows the same pattern. Subscribe to `order.canceled`, which Medusa emits from `cancelOrderWorkflow`, and set every key for that order to `revoked`. Also make the download route from step 2 skip canceled orders, so a refunded buyer cannot fetch new links. ```ts export default async function revokeKeys({ event, container }: SubscriberArgs<{ id: string }>) { await revokeLicenseKeysWorkflow(container).run({ input: { order_id: event.data.id } }) } export const config: SubscriberConfig = { event: "order.canceled" } ``` ## 6. Gate course access Course access gating checks the purchase on every request instead of handing out a file. Link your course model to a product variant, then in a route under `/store/customers/me` use Query to read the customer's orders and their items' variants. Return lessons only if one of those variants is linked to the course. ## When Medusa is not the right choice If you only need license keys and file delivery for digital products, Lemon Squeezy generates a unique key per purchase out of the box and acts as merchant of record. Building on Medusa pays off when keys or course access must live next to physical products, custom pricing, or your own customer accounts. ## Common questions ### How long do Medusa download links last? With the S3 File Module Provider, presigned download URLs last for the provider's download_file_duration option, in seconds. The default is 3600 seconds, or one hour. ### Does Medusa generate license keys? No. License keys in Medusa are custom: you add a data model in your own module and create keys from a subscriber to the order.placed event. Lemon Squeezy is an alternative that generates license keys without code. ### How do customers re-download purchases in Medusa? Medusa's Digital Products tutorial adds customer-only Store API routes and a downloads page to the Next.js Starter Storefront. Each click requests a fresh presigned URL, so expired email links are not a dead end. ### Can Medusa restrict course content to buyers? Yes, with custom code. Link a course model to a product variant and serve lessons from a route under /store/customers/me that checks the logged-in customer's orders for that variant. ## Documentation - [Digital Products tutorial](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard) - [S3 File Module Provider](https://docs.medusajs.com/resources/infrastructure-modules/file/s3) - [Events and subscribers](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) - [Protected API routes](https://docs.medusajs.com/learn/fundamentals/api-routes/protected-routes) ## Related - [How do I sell digital and physical products in one checkout?](https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout.md) - [Merchant of record or your own store for digital products?](https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) --- title: "How to migrate from Magento to a TypeScript stack" description: "How to migrate from Magento to Medusa: what the migration tools move, a phased checklist, passwords, saved cards, 301 redirects, and Adobe support dates." url: https://medusajs.com/kb/migrations-and-platforms/magento-migration last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md" - "https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" sources: - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-magento" - "https://docs.medusajs.com/resources/integrations/guides/magento" - "https://medusajs.com/blog/magento-to-medusa-rigby" - "https://medusajs.com/blog/wipertech" - "https://experienceleague.adobe.com/en/docs/commerce-operations/release/planning/lifecycle-policy" - "https://docs.medusajs.com/resources/commerce-modules/customer/customer-accounts" - "https://docs.medusajs.com/resources/commerce-modules/auth/auth-providers/emailpass" - "https://docs.medusajs.com/resources/commerce-modules/auth/reset-password" - "https://docs.stripe.com/get-started/data-migrations/pan-import" - "https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes" - "https://medusajs.com/pricing" --- # How to migrate from Magento to a TypeScript stack > To migrate from Magento to Medusa, move catalog data first with Medusa's Docs MCP migration tool or its Magento plugin tutorial, then customers, orders, extensions, storefront, and 301 redirects. Medusa is TypeScript on Node.js. Customer passwords don't transfer, so customers set new ones, and saved cards move only through your payment provider. ## How a Magento to Medusa migration works A Magento to Medusa migration moves your catalog and store data into Medusa, a TypeScript commerce platform on Node.js, and rebuilds Magento extensions as Medusa customizations. It is a replatform, not an upgrade: Magento runs on PHP, and Medusa replaces both the backend and, usually, the storefront. Teams with mostly TypeScript developers often cite the stack as the reason. In Medusa, the backend, custom modules, workflows, API routes, and admin widgets are all TypeScript, so the same engineers who build a Next.js storefront can work on commerce logic. ## What Medusa's Magento migration tooling covers Medusa has two official tools for Magento. Neither one is a one-click migration of an entire store. | Tool | What it migrates by default | How it runs | | --- | --- | --- | | Docs MCP server migration tool (Magento guide) | Products, variants, prices, images, inventory levels, collections and categories. Orders and customers are possible but the tool is mainly built for catalog data. | Your AI agent gets a Magento-specific plan and builds either an API importer (idempotent, re-runnable) or a CSV transform for the Medusa Admin importer. | | Magento data migration plugin tutorial | Configurable products, their child variants, prices, and images. The tutorial does not cover categories, customers, or orders. | A Medusa plugin that calls the Magento 2 REST API, run by a scheduled job. Example code is in the medusajs/examples repository. | The [Magento migration tool docs](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-magento) note that the CSV approach is lossy: inventory quantities are not migrated and images keep pointing at Magento's CDN. The Docs MCP server requires a Medusa Cloud account. ## A phased Magento migration checklist 1. **Audit.** Export your module list (Rigby's guide uses `php bin/magento module:status`) and decide for each extension: Medusa core feature, existing plugin, or custom build. 2. **Catalog data.** Migrate products first, since orders and inventory reference them. Use the MCP tool or the plugin tutorial. 3. **Customers.** Import account holders with `has_account` set to `true`, as the [Customer Accounts docs](https://docs.medusajs.com/resources/commerce-modules/customer/customer-accounts) describe. 4. **Orders.** Historical orders reference customers, regions, sales channels, and payments, so treat them as custom work. 5. **Extensions.** Rebuild them as modules, workflows, subscribers, and scheduled jobs. 6. **Storefront.** Build a new storefront against the Store API, or move pages gradually. 7. **SEO.** Map every old URL to its new URL and add permanent server-side 301 redirects. 8. **Launch.** Submit the new sitemap in Search Console and keep redirects for at least a year. Rigby, a Medusa Expert partner, describes a four-phase variant in its [Magento to Medusa developer's guide](https://medusajs.com/blog/magento-to-medusa-rigby) (2024): new storefront first, then catalog, then checkout and orders, then customer accounts and decommissioning. ## How customer passwords and saved cards move Medusa's emailpass auth provider hashes passwords with scrypt (scrypt-kdf), and the docs do not describe importing password hashes from another platform. Plan for customers to set a new password. The docs pattern for imports is to create customers with `has_account: true`, then link the new auth identity to the existing customer on first login with `setAuthAppMetadataStep`. Medusa's [reset password flow](https://docs.medusajs.com/resources/commerce-modules/auth/reset-password) emits `auth.password_reset` so you can send the email. Saved payment methods live with your payment provider, not in Magento. Moving them between processors needs the provider's help. For example, [Stripe's payment data import](https://docs.stripe.com/get-started/data-migrations/pan-import) is run by Stripe's Data Migrations team from your previous processor's encrypted export, and CVCs are never transferred. ## How to protect SEO during the move Google's [site move guide](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes) recommends mapping each old URL to one new URL and using permanent server-side redirects. Don't send many old URLs to the home page. Use Search Console's Change of Address tool only if the domain changes. ## Magento support dates and timeline Adobe's [lifecycle policy](https://experienceleague.adobe.com/en/docs/commerce-operations/release/planning/lifecycle-policy) lists end-of-support dates per Adobe Commerce version. For example, standard support for 2.4.6 ended August 11, 2026, and 2.4.8 runs to May 31, 2028. Adobe Commerce as a whole has no end-of-life date there, so check your exact version. There is no published Magento-to-Medusa merchant case study on medusajs.com yet. As a scale reference from a different platform, [Wipertech](https://medusajs.com/blog/wipertech) (2026) moved off Craft Commerce to Medusa, including 800,000+ historical orders and a new frontend, in just over four months. On cost, Medusa's core is MIT-licensed, so there is no license fee unless you need the Enterprise Edition RBAC and SSO features. Medusa Cloud plans start at $29, $99, and $299 per month with a 0% GMV fee ([pricing](https://medusajs.com/pricing)). Your main cost is engineering time. ## When Medusa is not the right choice - Your team is PHP-only and has no plan to hire TypeScript developers. - You rely on many Magento extensions with no equivalent and no budget to rebuild them. - You want a hosted, no-code platform: a SaaS such as Shopify needs less engineering. ## Common questions ### Does Medusa have a Magento migration tool? Yes. Medusa's Docs MCP server has a Magento-specific migration guide that migrates products, variants, prices, images, inventory, and categories, and Medusa's docs include a Magento data migration plugin tutorial for products. Neither migrates a whole store in one click. ### Can Medusa import Magento customer passwords? Medusa's docs don't describe importing Magento password hashes. Medusa's emailpass provider hashes passwords with scrypt, so plan for imported customers to set a new password on first login. ### Is Magento end of life? Adobe publishes end-of-support dates per Adobe Commerce version, not one end-of-life date for the product. For example, standard support for Adobe Commerce 2.4.6 ended on August 11, 2026, and 2.4.8 is supported until May 31, 2028. ### Can I migrate from Magento to Medusa in phases? Yes. Rigby, a Medusa Expert partner, recommends starting with a new storefront on Magento's API, then moving catalog, checkout and orders, and finally customer accounts to Medusa before decommissioning Magento. ### Do I need Medusa Cloud to use the migration tool? The Docs MCP server, which hosts the migration tool, requires a Medusa Cloud account. The Magento plugin tutorial works with any Medusa application, self-hosted or on Medusa Cloud. ## Documentation - [Migrate from Magento (Adobe Commerce) to Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-magento) - [How to Build Magento Data Migration Plugin](https://docs.medusajs.com/resources/integrations/guides/magento) - [Customer Accounts](https://docs.medusajs.com/resources/commerce-modules/customer/customer-accounts) - [Docs MCP server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server) ## Related - [Switching from WooCommerce to a JavaScript stack](https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md) - [Outgrown Shopify Plus: what sits between Shopify and a custom build?](https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Cheapest way to run a production ecommerce backend](https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) --- title: "Medusa vs Vendure" description: "Medusa vs Vendure: REST vs GraphQL, modules and workflows vs NestJS plugins, MIT vs GPLv3 licensing, Medusa Cloud vs Vendure Cloud, and when to choose each." url: https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md" - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" sources: - "https://docs.medusajs.com/learn/introduction/architecture" - "https://docs.medusajs.com/learn/fundamentals/modules" - "https://docs.medusajs.com/learn/fundamentals/workflows" - "https://docs.medusajs.com/learn/fundamentals/api-routes" - "https://docs.medusajs.com/learn/fundamentals/admin" - "https://docs.medusajs.com/learn/deployment" - "https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function" - "https://medusajs.com/pricing.md" - "https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md" - "https://github.com/medusajs/medusa" - "https://github.com/medusajs/b2b-starter" - "https://github.com/vendurehq/vendure" - "https://docs.vendure.io/current/framework/developer-guide/overview.md" - "https://docs.vendure.io/current/framework/developer-guide/rest-endpoint.md" - "https://docs.vendure.io/current/framework/extending-the-dashboard/tech-stack.md" - "https://docs.vendure.io/current/framework/extending-the-dashboard/extending-overview.md" - "https://vendure.io/pricing" --- # Medusa vs Vendure > Medusa and Vendure are both open-source TypeScript commerce platforms on Node.js. Medusa uses REST APIs, modules and workflows under an MIT license (except Enterprise RBAC and SSO), with Medusa Cloud generally available. Vendure uses NestJS, GraphQL APIs and plugins under GPLv3 or a commercial license, with Vendure Cloud not yet available. Choose Vendure for GraphQL, Medusa for REST. ## How Medusa and Vendure differ at a glance Medusa and Vendure are both open-source, headless commerce platforms written in TypeScript on Node.js. They differ in API style, extension model, database support, license and hosting. Vendure facts below come from Vendure's own docs, repository and pricing page; GitHub stars are as of October 28, 2026. | Area | Medusa | Vendure | | --- | --- | --- | | Framework | Medusa Framework on Node.js | NestJS on Node.js, with TypeORM | | Database | PostgreSQL | PostgreSQL, MySQL, MariaDB or SQLite | | API style | REST: Store API, Admin API and your own API routes | GraphQL: Shop API and Admin API; plugins can add REST-style endpoints | | Extension model | Modules, workflows, subscribers, API routes and admin widgets, packaged as plugins | Plugins, plus service overrides | | Admin | Medusa Admin, extended with widgets and UI routes | Vendure Dashboard (React 19, Vite, TanStack), extended through dashboard extensions declared in plugins | | License | MIT (RBAC and SSO are Enterprise Edition) | GPLv3, or the Vendure Commercial License on paid plans | | Managed hosting | Medusa Cloud, generally available | Not yet; Vendure Cloud opens as a closed beta for paid plans first, GA planned for Q1 2027 | | GitHub stars | 36,981 | 8,548 | ## Architecture: modules and workflows versus plugins Medusa splits commerce into modules (product, cart, order, pricing and more). Requests move from API routes to workflows to modules to PostgreSQL, per [Medusa's architecture docs](https://docs.medusajs.com/learn/introduction/architecture). You write custom [modules](https://docs.medusajs.com/learn/fundamentals/modules) with their own data models and link them to core ones, and you put multi-step business logic in [workflows](https://docs.medusajs.com/learn/fundamentals/workflows) that roll back completed steps when a later step fails. Vendure is built on NestJS. Its [developer guide](https://docs.vendure.io/current/framework/developer-guide/overview.md) says each unit of functionality is encapsulated in a plugin, and a worker process handles background jobs such as search indexing and emails. Vendure's README says you can extend or override any part of the system through plugin contracts and service overrides. Teams that already know NestJS dependency injection will find Vendure's model familiar. ## API style: REST versus GraphQL Medusa's APIs are REST, and you add your own REST [API routes](https://docs.medusajs.com/learn/fundamentals/api-routes) in the same project. Vendure exposes two GraphQL APIs, the Shop API for storefronts and the Admin API for administration, and plugins can add [REST-style endpoints](https://docs.vendure.io/current/framework/developer-guide/rest-endpoint.md). If your team wants an introspectable GraphQL schema as the main contract, Vendure is the closer fit. ## License and hosting: Medusa Cloud versus Vendure's plans Medusa is MIT-licensed except for its RBAC and SSO code. [Medusa Cloud](https://medusajs.com/pricing.md) lists Develop at $29, Launch at $99 and Scale at $299 per month, with a 0% GMV fee on every plan. Vendure Framework is free under GPLv3. [Vendure's pricing page](https://vendure.io/pricing) lists paid plans at €199 (Starter), €599 (Growth) and €2,499 (Scale) per month on annual terms, and Enterprise from €60,000 per year. Paid plans include a commercial license as an alternative to GPLv3, and the Scale plan adds B2B capabilities such as order approvals and contract pricing. Vendure Cloud is not available yet: Vendure says it will open as a closed beta for paid plans first, with general availability planned for Q1 2027. ## Choose Vendure if - Your team wants GraphQL as the primary API for storefront and admin. - Your developers already build with NestJS and TypeORM. - You need MySQL, MariaDB or SQLite instead of PostgreSQL. - You want vendor-built B2B features such as contract pricing and order approvals in a paid plan. ## Choose Medusa if - You want REST APIs for your storefront and admin tools. - You want a permissive MIT license for the core without buying a commercial license. - You want generally available managed hosting today at a flat monthly price with no GMV fee. - You want to start B2B from open-source code: Medusa's [B2B starter](https://github.com/medusajs/b2b-starter) ships company, quote and approval modules you can change. ## When Medusa is not the right choice Medusa is not the right fit if GraphQL is a hard requirement, or if your database standard is MySQL or MariaDB, since Medusa supports only PostgreSQL as its main database. Teams deeply invested in NestJS conventions may also move faster on Vendure than on learning Medusa's module and workflow model. ## Common questions ### Does Vendure support REST like Medusa? Vendure's main APIs are the GraphQL Shop API and Admin API, and its plugins can add REST-style endpoints. Medusa's built-in Store API and Admin API are REST. ### Is Vendure free to use commercially? Vendure Framework is free under GPLv3, and Vendure's paid plans include a commercial license as an alternative to GPLv3. Medusa's core is MIT-licensed, apart from its RBAC and SSO code. ### Does Vendure have managed hosting like Medusa Cloud? Not yet. Vendure says Vendure Cloud will open as a closed beta for paid plans first, with general availability planned for Q1 2027. Medusa Cloud is generally available, with plans at $29, $99 and $299 per month. ### Which databases do Medusa and Vendure support? Medusa supports PostgreSQL as its main database. Vendure supports PostgreSQL, MySQL, MariaDB and SQLite through TypeORM. ## Documentation - [Medusa's architecture](https://docs.medusajs.com/learn/introduction/architecture) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Workflows](https://docs.medusajs.com/learn/fundamentals/workflows) - [API routes](https://docs.medusajs.com/learn/fundamentals/api-routes) - [Admin development](https://docs.medusajs.com/learn/fundamentals/admin) ## Related - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Medusa vs Saleor, and other Saleor alternatives](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Switching from WooCommerce to a JavaScript stack](https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md) - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) --- title: "Merchant of record or your own store for digital products?" description: "Merchant of record or your own store for digital products? Compare Lemon Squeezy and Paddle with Medusa on tax, fees, physical goods, and delivery." url: https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store last_updated: 2026-10-29T06:55:50Z topic: "digital-products" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout.md" - "https://medusajs.com/kb/digital-products/license-keys-download-links.md" - "https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international.md" - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md" sources: - "https://www.lemonsqueezy.com/pricing" - "https://docs.lemonsqueezy.com/help/getting-started/prohibited-products" - "https://docs.lemonsqueezy.com/help/licensing/generating-license-keys" - "https://www.paddle.com/pricing" - "https://www.paddle.com/help/start/intro-to-paddle/what-am-i-not-allowed-to-sell-on-paddle" - "https://docs.medusajs.com/resources/commerce-modules/tax" - "https://docs.medusajs.com/resources/commerce-modules/tax/tax-provider" - "https://docs.medusajs.com/resources/integrations/guides/avalara" - "https://docs.medusajs.com/resources/recipes/digital-products/examples/standard" - "https://medusajs.com/pricing.md" --- # Merchant of record or your own store for digital products? > Use a merchant of record like Lemon Squeezy or Paddle if you sell only digital goods and want them to own sales tax and VAT for 5% + 50¢ per sale. Run your own store on Medusa when you sell physical items too, need custom delivery, or want lower fees and your own customer data, and handle tax filing yourself. ## What a merchant of record does for digital products A merchant of record (MoR) is the company that legally sells the product to your customer. You sell to the MoR, and it resells to the buyer, so its name is on the transaction and it carries the tax and payment obligations. Lemon Squeezy and Paddle are the two MoRs most often compared for digital products. According to their own pricing pages, as of October 2026: - **Lemon Squeezy** says it is "your merchant of record", takes on "the liability of tax collection and calculation" for sales tax and VAT, and is "registered to file and pay taxes on your behalf". It charges 5% + 50¢ per transaction, with possible extra fees for some payments and non-US transactions. - **Paddle** says its 5% + 50¢ per checkout transaction covers payments, checkout, billing, global tax and regulatory compliance, fraud protection, chargebacks, and buyer support. Orders under $10 may need custom pricing. ## When Lemon Squeezy or Paddle is the better choice An MoR is the better choice when tax compliance is the hard part of your business and your catalog is standard: - You sell only digital goods, such as software, e-books, design assets, or SaaS. - You sell to buyers in many countries and don't want to register for VAT or sales tax in each. - You want license keys and hosted checkout without writing code. Lemon Squeezy generates a unique license key per purchase when the product setting is on. - Your volume is low enough that a percentage fee costs less than running your own stack. ## When to run your own store on Medusa instead Medusa is an open source commerce platform you host yourself or on Medusa Cloud. You become the seller, so you own checkout, customer data, and delivery logic. That fits when: - **Your catalog is mixed.** Lemon Squeezy lists "physical goods of any kind" as prohibited, and Paddle prohibits physical products. Medusa can sell templates and prints in one order. - **Delivery is custom.** Course access, seat-based licenses, or file rules per customer group are code in your own Medusa modules and workflows. - **Fees matter at your volume.** Medusa Cloud plans are Develop $29, Launch $99, and Scale $299 per month with a 0% GMV fee. You still pay your payment provider and any tax service. - **You want the customer relationship.** Orders and customers live in your own database, behind your own Store API. ## How tax works when you own the store with Medusa Medusa's Tax Module calculates tax lines for carts and orders per tax region. You set default and conditional tax rates per region, and the default `system` tax provider (`tp_system`) performs basic calculation from them. For automated rates, you plug in a Tax Module Provider: Medusa has an [Avalara tutorial](https://docs.medusajs.com/resources/integrations/guides/avalara), and you can [create your own provider](https://docs.medusajs.com/resources/commerce-modules/tax/tax-provider) by implementing `ITaxProvider`. Medusa calculates tax. It does not register your business, file returns, or remit tax for you. With your own store, those tasks stay with your business and whatever tax service you choose, which is the main thing an MoR takes off your plate. ## Merchant of record vs your own store, term by term | Term | With Lemon Squeezy or Paddle | With Medusa | Medusa status | | --- | --- | --- | --- | | Seller of record | The MoR | Your business | Native | | Tax calculation | Included | Tax Module with a tax provider | Native | | Automated tax rates | Included | Avalara or another tax provider | Official guide | | Tax filing and remittance | Included | Your business or a tax service | Not in Medusa | | Chargebacks and fraud | Included with Paddle | Your payment provider | Native payment providers | | Physical products | Prohibited | Supported in the same cart | Native | | Digital file delivery | Built in | Digital Products tutorial | Official guide | | License keys | Built into Lemon Squeezy | Your own module | Custom | | Platform fee | 5% + 50¢ per transaction | 0% GMV, Cloud plan from $29 per month | Native | ## A quick cost check On a $20 template, a 5% + 50¢ MoR fee is $1.50 per sale. That fee includes payment processing and tax compliance, so compare it with your payment provider's fees plus a tax service plus hosting, not with hosting alone. Medusa usually wins on cost only at higher volume or higher order values. ## When Medusa is not the right choice - You sell only digital products and want global VAT handled without registering anywhere: use an MoR. - You have no developer: Lemon Squeezy or Paddle gives you checkout, delivery, and tax without code. - Your margin can absorb 5% + 50¢ and you have no need for physical goods or custom delivery. ## Common questions ### What is a merchant of record? A merchant of record is the company that legally sells a product to the end customer. Lemon Squeezy and Paddle act as merchants of record, so they collect and handle sales tax and VAT on the sales they process for you. ### Is Medusa a merchant of record? No. Medusa is open source commerce software, so your business is the seller. Medusa's Tax Module calculates tax, but registration, filing, and remittance stay with your business or a tax service you choose. ### How much do Lemon Squeezy and Paddle charge? As of October 2026, both list 5% + 50¢ per transaction on their pricing pages. Lemon Squeezy notes extra fees can apply to some payments and non-US transactions, and Paddle offers custom pricing for orders under $10 and for high volume. ### Can Medusa calculate sales tax automatically? Yes, through a Tax Module Provider. Medusa documents an Avalara integration, and you can write your own provider by implementing the ITaxProvider interface. ## Documentation - [Tax Module](https://docs.medusajs.com/resources/commerce-modules/tax) - [Tax Module Provider](https://docs.medusajs.com/resources/commerce-modules/tax/tax-provider) - [Integrate Avalara for tax calculation](https://docs.medusajs.com/resources/integrations/guides/avalara) - [Digital Products tutorial](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard) ## Related - [How do I sell digital and physical products in one checkout?](https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout.md) - [How to add license keys and secure download links](https://medusajs.com/kb/digital-products/license-keys-download-links.md) - [Tax-inclusive vs tax-exclusive pricing for US, UK and EU](https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international.md) - [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md) --- title: "Multi-currency pricing via API" description: "How Medusa's Pricing Module and Store API handle multi-currency and region pricing, with code samples and a comparison with commercetools price selection." url: https://medusajs.com/kb/international-commerce/multi-currency-pricing-api last_updated: 2026-10-29T06:55:50Z topic: "international-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md" - "https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-calculation" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules" - "https://docs.medusajs.com/resources/storefront-development/products/price" - "https://docs.medusajs.com/resources/commerce-modules/product/guides/price" - "https://docs.medusajs.com/api/admin" - "https://docs.medusajs.com/api/store/products/list-products" - "https://docs.medusajs.com/resources/infrastructure-modules/search/product-index-examples#index-prices-for-multiple-currencies" - "https://docs.commercetools.com/api/pricing-and-discounts-overview" - "https://docs.commercetools.com/api/projects/productProjections" - "https://docs.bigcommerce.com/developer/docs/admin/store-configuration/currencies/how-currencies-work.md" - "https://help.shopify.com/en/manual/international/pricing" --- # Multi-currency pricing via API > Medusa handles multi-currency pricing through its Pricing Module: each variant has a price set with one price per currency, plus optional prices scoped by region, customer group or quantity. The Store API returns a calculated price for the shopper's region and country, with and without tax. Medusa does not convert currencies automatically. ## How Medusa's price model handles multiple currencies Medusa's Pricing Module links every product variant and shipping option to a **price set**: a collection of prices for one resource. Each price has a `currency_code` and an `amount` stored in major units, so `20` means 20.00 ([Pricing Concepts](https://docs.medusajs.com/resources/commerce-modules/pricing/concepts)). Prices can carry rules and quantity tiers: - **Price rules** limit a price to a context, such as a `region_id`, a customer group or a postal code. - **Tiers** use `min_quantity` and `max_quantity` to change the price by quantity. - **Price lists** group prices of type `sale` or `override` that apply only when their rules match, optionally within a date range. | Pricing need | Medusa feature | Status | | --- | --- | --- | | One price per currency | Prices with a currency_code in the price set | Native | | Different price for one region in the same currency | Price with a region_id rule | Native | | Customer group or B2B prices | Price lists with rules | Native | | Quantity breaks | Tiered prices | Native | | Automatic exchange-rate conversion | Not built in; update prices from a rate feed in a scheduled job | Custom | ## How to set multi-currency prices with the Admin API You send prices per currency when you create or update a variant. A price with `rules` applies only in that context. This body for `POST /admin/products/{id}/variants` follows the [Admin API schema](https://docs.medusajs.com/api/admin): ```json { "title": "Large", "prices": [ { "currency_code": "usd", "amount": 40 }, { "currency_code": "eur", "amount": 39 }, { "currency_code": "eur", "amount": 42, "rules": { "region_id": "reg_123" } } ] } ``` Customers in region `reg_123` see 42 EUR. Other euro customers see 39 EUR. ## How the Store API returns calculated prices The Store API resolves one price per variant for the shopper's context. Add `*variants.calculated_price` to `fields` on the List Products or Get Product routes, and pass at least one context parameter ([Retrieve Product Variant's Prices](https://docs.medusajs.com/resources/storefront-development/products/price)): - `region_id`: the region, which also sets the currency. - `country_code` and `province`: needed for prices with tax. - `cart_id`: uses the cart's region and shipping address instead. ```ts const { products } = await sdk.store.product.list({ fields: "*variants.calculated_price", region_id: region.id, country_code: "fr", }) ``` Each variant gets `calculated_amount`, `original_amount`, `currency_code`, and, when both region and country are passed, `calculated_amount_with_tax` and `calculated_amount_without_tax`. If the request is authenticated, the customer's groups are used to select group prices automatically. ## How to calculate prices in backend code In custom API routes or workflows, you pass the currency and region directly with Query ([Get Variant Prices](https://docs.medusajs.com/resources/commerce-modules/product/guides/price)): ```ts const { data: products } = await query.graph({ entity: "product", fields: ["variants.calculated_price.*"], filters: { id: "prod_123" }, context: { variants: { calculated_price: QueryContext({ region_id: "reg_123", currency_code: "eur" }), }, }, }) ``` ## How Medusa selects a price Medusa's `calculatePrices` returns a calculated price and an original price for each price set ([Prices Calculation](https://docs.medusajs.com/resources/commerce-modules/pricing/price-calculation)): 1. With no rules in the context, it selects the default price for the currency. 2. If a price matches every rule in the context, it selects that price. 3. Otherwise, it selects the price that matches the most rules. A matching price list price becomes the calculated price. For sale price lists, the original price stays the regular price so the storefront can show a strike-through; for override price lists, the original price equals the calculated price. ## Medusa compared with commercetools price selection Both platforms store explicit prices per currency and pick one per request. They differ in which dimensions a price can be scoped by. | Aspect | Medusa | commercetools | | --- | --- | --- | | Price scope | Currency plus any rules, such as region, customer group or postal code | Currency, country, customer group and channel | | Selection input | region_id, country_code or cart_id on the Store API | priceCurrency, priceCountry, priceCustomerGroup and priceChannel on product projections | | Fallback | Exact match, then the price matching the most rules | A fixed order of eight scope combinations, with time-bound prices first | | Quantity tiers | min_quantity and max_quantity | Tiers by minimum quantity per line item | commercetools facts come from its [pricing overview](https://docs.commercetools.com/api/pricing-and-discounts-overview) and [Product Projections](https://docs.commercetools.com/api/projects/productProjections) docs. ## When Medusa is not the right choice - You want prices converted from one base currency automatically. Medusa needs a price per currency or a custom sync job. Shopify converts prices at the current market exchange rate by default, and BigCommerce auto-converts prices using an exchange rate the merchant sets or updates through its API. - You need a search index sorted by price in many currencies with no setup. Medusa's Pricing Module calculates a price for one currency per query, so a search index needs a price field per currency ([Index Prices for Multiple Currencies](https://docs.medusajs.com/resources/infrastructure-modules/search/product-index-examples#index-prices-for-multiple-currencies)). ## Common questions ### How do I get a product's price in a specific currency from the Medusa Store API? Pass the region_id of a region that uses that currency, with fields=*variants.calculated_price. Medusa returns each variant's calculated_price in the region's currency. ### Can Medusa have two prices in the same currency for different regions? Yes. Add a price with a region_id rule. Medusa selects it for that region and uses the default price for the currency elsewhere. ### Does Medusa support customer-specific prices in multiple currencies? Yes. Medusa price lists hold prices per currency with rules such as customer group, and the Store API applies them when the customer is authenticated. ### How is Medusa's price selection different from commercetools? commercetools scopes prices by currency, country, customer group and channel and walks a fixed fallback order. Medusa scopes prices by currency plus any rules and picks the price that matches the most rules. ## Documentation - [Pricing Concepts](https://docs.medusajs.com/resources/commerce-modules/pricing/concepts) - [Prices Calculation](https://docs.medusajs.com/resources/commerce-modules/pricing/price-calculation) - [Price Tiers and Rules](https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules) - [Retrieve Product Variant's Prices in Storefront](https://docs.medusajs.com/resources/storefront-development/products/price) - [Get Product Variant Prices using Query](https://docs.medusajs.com/resources/commerce-modules/product/guides/price) ## Related - [How to sell in multiple countries from one ecommerce backend](https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md) - [Tax-inclusive vs tax-exclusive pricing for US, UK and EU](https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "How to sell in multiple countries from one ecommerce backend" description: "How to sell in the US, UK and EU from one ecommerce backend with Medusa: regions, currencies, VAT, tax-inclusive prices, shipping zones, and honest gaps." url: https://medusajs.com/kb/international-commerce/multi-region-ecommerce last_updated: 2026-10-29T06:55:50Z topic: "international-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international.md" - "https://medusajs.com/kb/international-commerce/multi-currency-pricing-api.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/recipes/multi-region-store" - "https://docs.medusajs.com/user-guide/settings/regions" - "https://docs.medusajs.com/user-guide/settings/tax-regions" - "https://docs.medusajs.com/api/admin/regions/create-region" - "https://docs.medusajs.com/resources/storefront-development/products/price" - "https://docs.medusajs.com/resources/commerce-modules/pricing/tax-inclusive-pricing" - "https://docs.medusajs.com/resources/commerce-modules/tax/tax-region" - "https://docs.medusajs.com/resources/commerce-modules/tax/tax-rates-and-rules" - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://docs.medusajs.com/resources/commerce-modules/fulfillment/shipping-option" - "https://docs.medusajs.com/resources/commerce-modules/fulfillment/concepts" - "https://docs.medusajs.com/resources/commerce-modules/stock-location/concepts" - "https://docs.medusajs.com/resources/integrations/guides/avalara" - "https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules" - "https://www.gov.uk/vat-businesses/charging-vat" - "https://europa.eu/youreurope/business/taxation/vat/vat-rules-rates/index_en.htm" - "https://help.shopify.com/en/manual/international/pricing" - "https://help.shopify.com/en/manual/international/managed-markets" - "https://docs.bigcommerce.com/developer/docs/admin/store-configuration/currencies/how-currencies-work.md" - "https://docs.bigcommerce.com/developer/docs/storefront/catalyst/features/localization/multi-storefront/overview.md" - "https://docs.commercetools.com/api/pricing-and-discounts-overview" - "https://docs.commercetools.com/api/projects/stores" --- # How to sell in multiple countries from one ecommerce backend > Medusa sells in multiple countries from one backend without running separate stores. You create a region per market with its own currency, countries and payment providers, set prices per currency or region, configure tax regions with tax-inclusive pricing for the UK and EU, and limit shipping options to service zones. Duties and automatic currency conversion need custom integrations. ## How Medusa runs several countries from one backend Medusa v2 sells in multiple countries from one application, without running separate stores. Each country maps to a **region**, and prices, taxes, shipping and stock are resolved per request from the customer's region, country and cart. The [Multi-Region Store recipe](https://docs.medusajs.com/resources/recipes/multi-region-store) describes the full setup. | Term | What it means in Medusa | Status | | --- | --- | --- | | Market or region | A region has one currency, a list of countries, payment providers and a tax-inclusive setting. Several regions can share a currency. | Native | | Prices per country | A variant's price set holds one price per currency, plus optional prices with a region_id rule | Native | | VAT and sales tax | Tax regions per country with a default rate, overrides by product type, and state or province sublevels | Native | | Tax-inclusive prices | Enabled per region or per currency | Native | | Shipping per country | Shipping options are limited to service zones made of countries, provinces, cities or postal codes | Native | | Multi-warehouse | Stock locations with inventory levels per location | Native | | Tax engine | Avalara tax provider | Official guide | | Duties, landed cost, merchant of record | Not built in | Custom | ## Worked example: US, UK and EU settings The table shows one way to configure a store that sells in the United States, the United Kingdom and the EU. You enter tax rates in each tax region, or a tax provider returns them. | Setting | United States | United Kingdom | European Union | | --- | --- | --- | --- | | Region | United States, country us | United Kingdom, country gb | Europe, countries such as de, fr, nl | | Currency | usd | gbp | eur | | Tax-inclusive pricing | Off (sales tax added at checkout) | On (VAT included) | On (VAT included) | | Tax regions | us with state sublevels, or Avalara as the provider | gb with a default rate (standard VAT is 20%) | One tax region per country, each with its own rate | | Example variant price | 40 usd | 35 gbp | 39 eur | | Shipping options | Service zone for us, fulfilled from a US warehouse | Service zone for gb | Service zone for EU countries, fulfilled from an EU warehouse | | Payment providers | Chosen per region, for example Stripe | Chosen per region | Chosen per region | UK VAT rates come from [GOV.UK](https://www.gov.uk/vat-businesses/charging-vat). Each EU country sets its own VAT rate, with a standard rate of at least 15% ([Your Europe](https://europa.eu/youreurope/business/taxation/vat/vat-rules-rates/index_en.htm)). ## Example API calls for a multi-region setup You create a region with the Admin API, here through the Medusa JS SDK. The fields below are part of the [Create Region API route](https://docs.medusajs.com/api/admin/regions/create-region): ```ts await sdk.admin.region.create({ name: "Europe", currency_code: "eur", countries: ["de", "fr", "nl"], automatic_taxes: true, is_tax_inclusive: true, payment_providers: ["pp_stripe_stripe"], }) ``` In the storefront, you pass the customer's region and country when you fetch products. Medusa returns each variant's `calculated_price` in the region's currency, with and without tax ([Retrieve Product Variant's Prices](https://docs.medusajs.com/resources/storefront-development/products/price)): ```ts const { product } = await sdk.store.product.retrieve(id, { fields: "*variants.calculated_price", region_id: region.id, country_code: "de", }) ``` At checkout, customers only see the payment providers enabled for their region and the shipping options that can deliver to their address. ## Medusa compared with Shopify Markets, BigCommerce and commercetools All four platforms can sell to several countries from one catalog. They differ in how currencies are priced and in who handles duties and compliance. | Capability | Medusa | Shopify Markets | BigCommerce | commercetools | | --- | --- | --- | --- | --- | | Unit of setup | Regions in one backend | Markets in one store | Multi-Storefront channels, each with its own currency | Stores with their own countries, languages and channels | | Price per currency | Set a price per currency or per region | Converted automatically at the exchange rate by default, or fixed per market through catalogs | Auto-converted at a merchant-set exchange rate (updated manually or through the API), or set per currency with price lists | Prices scoped by currency, country, customer group and channel | | Automatic FX conversion | No | Yes | Yes, at a merchant-set rate | Check vendor docs | | Duties and merchant of record | Custom integration | Managed Markets: Global-e is the merchant of record and handles duties | Check vendor docs | Check vendor docs | Shopify facts come from its [international selling](https://help.shopify.com/en/manual/international/pricing) and [Managed Markets](https://help.shopify.com/en/manual/international/managed-markets) help pages. BigCommerce facts come from [How Currencies Work](https://docs.bigcommerce.com/developer/docs/admin/store-configuration/currencies/how-currencies-work.md). ## What Medusa does not do for international selling Medusa leaves three cross-border jobs to you or to an integration: - **Duties and landed cost.** Medusa has no duty calculation. Call a landed-cost service from a custom workflow or a fulfillment provider's price calculation. - **Merchant of record.** Medusa does not act as the seller of record. You sell under your own entity and handle tax registrations, or integrate a merchant-of-record service as a custom provider. - **Automatic FX conversion.** Medusa does not convert prices by exchange rate. Set a price for each currency, or write a scheduled job that updates prices from a rate feed. For tax calculation beyond fixed rates, the [Avalara guide](https://docs.medusajs.com/resources/integrations/guides/avalara) builds a tax provider that returns rates per address. ## When Medusa is not the right choice - You have no developer and want multi-currency selling configured from an admin screen. Shopify Markets covers that. - You want a provider to act as merchant of record, collect duties and hold tax registrations for you without engineering work. Shopify Managed Markets does this for eligible merchants. - You sell in one country with one currency. A multi-region backend adds setup you will not use. ## Common questions ### Does Medusa convert prices between currencies automatically? No. Medusa selects a price you set for each currency or region and does not convert prices by exchange rate. You can write a scheduled job that updates prices from an exchange-rate feed. ### Can one Medusa store use different payment providers per country? Yes. Each Medusa region has its own list of payment providers, and customers only see the providers enabled for their region at checkout. ### Does Medusa calculate customs duties or act as merchant of record? No. Medusa has no built-in duty or landed-cost calculation and does not act as merchant of record. You integrate a landed-cost or merchant-of-record service through a custom workflow or provider. ### Can Medusa show different stock per country? Yes. Medusa's Stock Location and Inventory Modules track inventory per location, and shipping options are tied to the service zones of each location's fulfillment set. ### Is Medusa an alternative to Shopify Markets? Medusa covers multi-region pricing, taxes, shipping and payments from one backend, but it needs a developer and has no built-in merchant-of-record service like Shopify Managed Markets. ## Documentation - [Multi-Region Store Recipe](https://docs.medusajs.com/resources/recipes/multi-region-store) - [Manage Regions in Medusa Admin](https://docs.medusajs.com/user-guide/settings/regions) - [Manage Tax Regions in Medusa Admin](https://docs.medusajs.com/user-guide/settings/tax-regions) - [Retrieve Product Variant's Prices in Storefront](https://docs.medusajs.com/resources/storefront-development/products/price) - [Integrate Avalara (AvaTax) for Tax Calculation](https://docs.medusajs.com/resources/integrations/guides/avalara) ## Related - [Tax-inclusive vs tax-exclusive pricing for US, UK and EU](https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international.md) - [Multi-currency pricing via API](https://medusajs.com/kb/international-commerce/multi-currency-pricing-api.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "How do I build a multi-vendor marketplace with open source?" description: "Build an open source multi-vendor marketplace on Medusa: recipe or Mercur, capability table, and a comparison with Sharetribe and WooCommerce + Dokan." url: https://medusajs.com/kb/marketplaces/multi-vendor-marketplace last_updated: 2026-10-29T06:55:50Z topic: "marketplaces" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/marketplaces/artisan-marketplace.md" - "https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md" - "https://medusajs.com/kb/marketplaces/rental-marketplace.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md" sources: - "https://docs.medusajs.com/resources/recipes/marketplace" - "https://docs.medusajs.com/resources/recipes/marketplace/examples/vendors" - "https://medusajs.com/marketplace" - "https://medusajs.com/blog/get-started-with-mercur-2-0-on-cloud" - "https://medusajs.com/pricing" - "https://medusajs.com/blog/foraged" - "https://docs.mercurjs.com/learn/introduction" - "https://docs.mercurjs.com/learn/use-cases/standalone-marketplace" - "https://docs.mercurjs.com/resources/deployment/medusa-cloud" - "https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline" - "https://docs.mercurjs.com/platform/commission/concepts/rules-and-rates" - "https://docs.mercurjs.com/platform/review/overview" - "https://github.com/mercurjs/mercur" - "https://www.sharetribe.com/pricing/" - "https://dokan.co/wordpress/pricing/" --- # How do I build a multi-vendor marketplace with open source? > To build an open source multi-vendor marketplace on Medusa, either follow Medusa's marketplace recipe to add vendors and order splitting yourself, or start from Mercur, a marketplace platform on Medusa built by Rigby. Mercur ships seller onboarding, a vendor panel, commissions, split orders, Stripe Connect payouts, and reviews, and deploys on Medusa Cloud. ## What a multi-vendor marketplace needs from its platform A multi-vendor marketplace is a store where many independent sellers list products and customers buy from several sellers in one checkout. On top of normal commerce, it needs seller accounts, a seller dashboard, per-seller orders, a commission model, and payouts to each seller. Medusa core is a single-store commerce engine. The [vendors example](https://docs.medusajs.com/resources/recipes/marketplace/examples/vendors) states that Medusa doesn't provide marketplace features natively, but its framework lets you add them. You have two paths: build the marketplace layer yourself from the official recipe, or start from Mercur, which ships that layer prebuilt on Medusa. ## How Medusa and Mercur cover each marketplace capability Statuses: **Native** is Medusa core, **Starter** is Mercur, **Official guide** is a Medusa docs recipe with example code, **Custom** is code you write. | Capability | What it means | How it works on Medusa | Status | | --- | --- | --- | --- | | Vendor onboarding | Sellers register, get approved, and connect a payout account | Mercur Vendor Panel registration and onboarding wizard, with an admin approval queue. The recipe creates vendors and vendor admins with a custom actor type | Starter or Official guide | | Vendor dashboard | Each seller manages only their own store | Mercur Vendor Panel at /seller. The Medusa Admin is for super admins only, so the recipe path needs a dashboard you build | Starter | | Per-vendor products and orders | Products and orders belong to a seller | Module links between a vendor and the Product and Order modules | Starter or Official guide | | Order splitting | One cart becomes one order per seller | Mercur order groups; the recipe's vendor order workflow | Starter or Official guide | | Commission | The marketplace keeps a share of each sale | Mercur Commission module: percentage or fixed rates scoped by seller, product, type, collection, or category | Starter | | Payouts | Each seller receives their share | Mercur Payout module with a Stripe Connect provider; you decide when to trigger payouts | Starter | | Reviews | Customers rate products and sellers | Mercur Review module with operator moderation and seller replies | Starter | | Cart, checkout, payments | One checkout across sellers | Medusa Cart and Payment modules with the Stripe provider | Native | ## Path 1: build on the Medusa marketplace recipe The [Marketplace recipe](https://docs.medusajs.com/resources/recipes/marketplace) shows how to create a Marketplace Module with vendor data models, link vendors to products and orders, protect vendor API routes with a [custom actor type](https://docs.medusajs.com/resources/commerce-modules/auth/create-actor-type), and split a cart into one order per vendor with a workflow. The full code is in the [marketplace example repository](https://github.com/medusajs/examples/tree/main/marketplace). Choose this path when your marketplace model is unusual, for example rentals, services, or a restaurant-delivery flow, and you want to own every data model. Commissions, payouts, and a vendor dashboard are yours to build. ## Path 2: start from Mercur Medusa describes [Mercur](https://medusajs.com/marketplace) as an open core marketplace platform built by its Expert partners at Rigby. The [Mercur repository](https://github.com/mercurjs/mercur) is MIT licensed. Mercur runs `@mercurjs/core` as a plugin on Medusa and adds an Admin Panel for operators and a Vendor Panel for sellers. ```bash bun create mercur-app@latest ``` Mercur projects deploy on Medusa Cloud. Mercur's [Medusa Cloud guide](https://docs.mercurjs.com/resources/deployment/medusa-cloud) says one deployment serves the API, the admin panel at /dashboard, and the vendor panel at /seller. The basic template doesn't ship a storefront, so you build one on the Mercur Store API or start from Mercur's separate storefront repository. ## Medusa and Mercur vs Sharetribe vs WooCommerce + Dokan vs from scratch Prices are as of October 2026, from each vendor's own pricing page. | Option | Model | Price | Marketplace features | Best for | | --- | --- | --- | --- | --- | | Medusa + Mercur | Open source, self-hosted or on Medusa Cloud | Free to self-host; Medusa Cloud from $29 per month, 0% GMV fee | Sellers, commissions, split orders, Stripe Connect payouts, reviews | Teams with a developer who want to own the code | | Sharetribe | Hosted SaaS with no-code tools and code access | Build $39 per month; Live $199 per month billed yearly, no transaction fees, usage above 1M credits billed | Listings, transactions, reviews, Stripe payments | Founders without a developer | | WooCommerce + Dokan | WordPress plugin | Dokan Lite free; paid plans from $149 per year list price | Vendor dashboard, commission types; Stripe Express in Professional and above | Teams already on WordPress | | From scratch | Custom code on any stack | Developer time | Only what you build | Teams that need no commerce engine at all | ## When Medusa is not the right choice - **No developer on the team.** Mercur and the recipe both need someone to run and change code. Sharetribe is built to launch without coding. - **A small marketplace on an existing WordPress site.** Dokan adds sellers to WooCommerce without a new stack. - **You expect payouts to run with zero code.** Mercur's [payout docs](https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline) state that core doesn't ship the job that decides when an order is paid out. You write that trigger. ## Who runs marketplaces on Medusa [Foraged](https://medusajs.com/blog/foraged) moved to Medusa after trying WooCommerce and a fully custom build, and serves over 1,000 local sellers of wild and specialty foods. Medusa's [marketplace page](https://medusajs.com/marketplace) also lists Patyna, Poland's largest vintage marketplace, which uses custom post-order splitting on Medusa. ## Common questions ### Does Medusa support multi-vendor marketplaces natively? No. Medusa core is a single-store commerce engine, and its docs say it doesn't provide marketplace features natively. You add them with the official marketplace recipe or by starting from Mercur, which runs on Medusa. ### Is Mercur free to use? Mercur's main GitHub repository is MIT licensed, so you can self-host it without a license fee. Medusa describes Mercur as an open core platform, so check Rigby's site for any paid offerings. ### Can I deploy a Mercur marketplace on Medusa Cloud? Yes. Mercur's Medusa Cloud guide shows importing the project with packages/api as the Medusa root directory, and Medusa Cloud plans start at $29 per month with a 0% GMV fee. ### Is Medusa a good Dokan or Sharetribe alternative? Medusa with Mercur fits teams with a developer who want to own the code and the marketplace logic. Sharetribe fits founders who want a hosted no-code launch, and Dokan fits teams already on WordPress and WooCommerce. ## Documentation - [Marketplace recipe](https://docs.medusajs.com/resources/recipes/marketplace) - [Marketplace recipe: vendors example](https://docs.medusajs.com/resources/recipes/marketplace/examples/vendors) - [Create an actor type](https://docs.medusajs.com/resources/commerce-modules/auth/create-actor-type) ## Related - [How do I build an artisan marketplace with AI coding help?](https://medusajs.com/kb/marketplaces/artisan-marketplace.md) - [How do Stripe Connect payouts work for a marketplace?](https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md) - [Build a peer-to-peer rental marketplace: build vs buy](https://medusajs.com/kb/marketplaces/rental-marketplace.md) - [Easiest ecommerce stack to build with AI coding tools](https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md) --- title: "How do I manage inventory across multiple warehouses and sales channels?" description: "Track stock across warehouses, a website and a retail store in open-source Medusa: locations, channel scoping, CSV import, and the gaps an ERP fills." url: https://medusajs.com/kb/order-management/multi-warehouse-inventory last_updated: 2026-10-29T06:55:50Z topic: "order-management" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/order-management/online-and-retail-pos.md" - "https://medusajs.com/kb/order-management/open-source-oms.md" - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md" - "https://medusajs.com/kb/erp-integration/odoo.md" - "https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md" sources: - "https://docs.medusajs.com/resources/commerce-modules/inventory" - "https://docs.medusajs.com/resources/commerce-modules/inventory/concepts" - "https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-kit" - "https://docs.medusajs.com/resources/commerce-modules/stock-location" - "https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations" - "https://docs.medusajs.com/resources/commerce-modules/product/variant-inventory" - "https://docs.medusajs.com/user-guide/products/import" - "https://docs.medusajs.com/user-guide/orders/fulfillments" - "https://docs.medusajs.com/api/admin" - "https://docs.medusajs.com/resources/recipes/oms" - "https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory.html" --- # How do I manage inventory across multiple warehouses and sales channels? > Medusa is an open-source commerce platform that tracks stock per warehouse and store through its Inventory, Stock Location and Sales Channel modules. You create a location per site, link each sales channel to the locations it sells from, import SKUs and barcodes by CSV, and load stock levels. Transfers, purchasing and replenishment need custom code or an ERP. ## Before you start Medusa tracks stock per location through three modules: the Inventory Module (stock quantities and reservations), the Stock Location Module (warehouses and stores) and the Sales Channel Module (where you sell). This guide moves a typical setup, such as three warehouses plus a website and a retail store tracked in spreadsheets, into Medusa. - A Medusa v2 application with the Medusa Admin. - A spreadsheet with one row per product variant, including SKU and barcode. - Stock counts per warehouse and store. ## 1. Create a stock location for each warehouse and store A stock location in Medusa is any physical place that holds stock, such as a warehouse or a shop's stockroom. Create one per site in Settings → Locations & Shipping, with its address. Each location also gets the fulfillment providers and the shipping or pickup options it offers. See [manage locations](https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations). ## 2. Link each sales channel to the locations that serve it A sales channel in Medusa is a place you sell, such as a web storefront or a retail POS. Linking a sales channel to stock locations scopes availability: a storefront only sees stock at the locations linked to its channel, through its publishable API key. See [product variant inventory](https://docs.medusajs.com/resources/commerce-modules/product/variant-inventory). For a website plus one shop, a common setup is to link the website channel to the three warehouses, and the retail channel to the shop's location. Leave the shop out of the website channel if store stock must not be sold online. The retail store's POS then sells from its own channel and location. ## 3. Import products, SKUs and barcodes from CSV Medusa Admin imports products from a CSV file with one row per variant. The template supports `Variant Sku`, `Variant Barcode`, `Variant Ean`, `Variant Upc`, `Variant Manage Inventory`, `Variant Allow Backorder`, prices and `Product Sales Channel` columns. Existing rows update when you include `Product Id` and `Variant Id`. See [import products](https://docs.medusajs.com/user-guide/products/import). The product CSV has no stock quantity columns, so set quantities in the next step. ## 4. Set stock levels per location An inventory level in Medusa holds one item's `stocked_quantity`, `reserved_quantity` and `incoming_quantity` at one location. Edit them per inventory item in the Medusa Admin, or load them from your spreadsheet with the Admin API: ```bash curl -X POST "$MEDUSA_BACKEND_URL/admin/inventory-items/location-levels/batch" \ -H "Authorization: Basic $MEDUSA_SECRET_API_KEY" \ -H "Content-Type: application/json" \ -d '{"update":[{"inventory_item_id":"iitem_123","location_id":"sloc_123","stocked_quantity":40}]}' ``` The same request accepts `create` and `delete` arrays. See the [Admin API reference](https://docs.medusajs.com/api/admin). ## 5. Let orders reserve and deduct stock by location When an order is placed, Medusa reserves the quantity at the stock location linked to the order's sales channel. When the order is fulfilled, the reserved quantity is deducted from that location's stock. Staff can choose a different location when creating a fulfillment in the Admin. See [inventory concepts](https://docs.medusajs.com/resources/commerce-modules/inventory/concepts). Inventory kits link one variant to several inventory items, so bundles and multi-part products deduct each component's stock. ## What Medusa doesn't do for inventory, and how to fill the gaps Medusa core has no stock transfers between locations, no purchase orders, no reorder points or automatic replenishment, and no warehouse management features such as bins or pick lists. The `incoming_quantity` field records expected stock but doesn't affect availability. | Need | Status | How to add it | | --- | --- | --- | | Stock per location, reservations, availability by channel | Native | Built in | | Product and barcode import from CSV | Native | Built in | | Transfers between locations | Custom | A workflow that lowers stock at one location and raises it at another | | Reorder points and replenishment | Custom | A scheduled job that checks levels, or replenishment in an ERP | | Purchase orders and receiving | Custom | A custom module, or an ERP synced into Medusa | | Pick, pack, bins (WMS) | Custom | A WMS or 3PL connected through a fulfillment provider | If an ERP already plans purchasing, keep it as the stock master and sync levels into Medusa. The ERP recipe shows the pattern: [integrate an ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp). ## When Medusa is not the right inventory tool Medusa is a commerce backend, not a warehouse system. If replenishment, purchasing and transfers are the main problem and you don't have developers, an ERP such as Odoo fits better: its Inventory app documents warehouses, routes, reordering rules and inter-warehouse replenishment. Medusa fits when the channels, orders and storefronts are the priority and stock planning can live in an ERP or in custom code. ## Common questions ### Can Medusa import stock quantities from a CSV file? Not through the product CSV import, which has no stock quantity columns. Load quantities per location with the Admin API route POST /admin/inventory-items/location-levels/batch, or edit them in the Medusa Admin. ### Does Medusa support stock transfers between warehouses? No. Medusa core has no transfer feature. You can build one as a workflow that lowers stock at one location and raises it at another, or keep transfers in an ERP and sync the resulting levels. ### How does Medusa stop online orders from using store stock? Medusa scopes availability by sales channel. If the website's sales channel isn't linked to the store's stock location, online orders can't reserve or see that location's stock. ### Does Medusa support barcodes? Yes. Medusa product variants have barcode, EAN, UPC and SKU fields, and the product CSV import accepts all four. Scanning hardware and lookup screens are built in your own POS or warehouse app. ## Documentation - [Inventory concepts](https://docs.medusajs.com/resources/commerce-modules/inventory/concepts) - [Manage locations in Medusa Admin](https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations) - [Import products in Medusa Admin](https://docs.medusajs.com/user-guide/products/import) - [Product variant inventory](https://docs.medusajs.com/resources/commerce-modules/product/variant-inventory) - [ERP integration recipe](https://docs.medusajs.com/resources/recipes/erp) ## Related - [How do I run online and in-store POS sales from one system?](https://medusajs.com/kb/order-management/online-and-retail-pos.md) - [Is there an open-source order management system I can extend?](https://medusajs.com/kb/order-management/open-source-oms.md) - [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md) - [How to integrate Odoo with Medusa](https://medusajs.com/kb/erp-integration/odoo.md) - [How to sell in multiple countries from one ecommerce backend](https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md) --- title: "How to integrate NetSuite with Medusa" description: "How to integrate NetSuite with Medusa: which SuiteTalk APIs to use, how NetSuite data maps to Medusa, real-time vs scheduled sync, and a code skeleton." url: https://medusajs.com/kb/erp-integration/netsuite last_updated: 2026-10-29T06:55:50Z topic: "erp-integration" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md" - "https://medusajs.com/kb/erp-integration/business-central.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/recipes/erp" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_1540391670.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/subsect_156509465078.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/article_2104046421.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4418229131.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_N3361453.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_164723289789.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_159665260887.html" - "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N2182485.html" - "https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/learn/fundamentals/scheduled-jobs" - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://docs.medusajs.com/resources/commerce-modules/inventory/concepts" --- # How to integrate NetSuite with Medusa > Medusa has no prebuilt NetSuite connector. You build a custom Medusa module that calls NetSuite's SuiteTalk REST web services or RESTlets, then sync orders, items, stock, and prices with Medusa workflows, subscribers, and scheduled jobs. Workflows roll back NetSuite writes when a step fails, and NetSuite user event scripts can push changes to Medusa. ## Does Medusa have a NetSuite connector? Medusa has no first-party NetSuite connector and no NetSuite-specific guide. You integrate NetSuite by writing a custom Medusa module that calls NetSuite's APIs, then running it from workflows, subscribers, and scheduled jobs. The general [Medusa ERP integration recipe](https://docs.medusajs.com/resources/recipes/erp) shows each of these patterns with example code. Everything NetSuite-specific in this entry is Custom work. ## Which NetSuite APIs to use from Medusa NetSuite exposes three integration channels under SuiteTalk and SuiteScript. Oracle's guidance is to build new integrations on REST web services with OAuth 2.0. | NetSuite API | What it is | Use it from Medusa for | | --- | --- | --- | | SuiteTalk REST web services | REST interface for CRUD on records, metadata, and SuiteQL queries. No server-side script to deploy. | Default choice: create sales orders, read items, customers, and stock | | RESTlets | SuiteScript endpoints you write and deploy in NetSuite | One call that runs a full business flow, or logic REST does not expose | | SuiteTalk SOAP web services | Legacy SOAP API | Avoid for new work. Oracle stops new SOAP integrations in 2027.1 and disables all SOAP endpoints in 2028.2 | | SuiteScript user event scripts with N/https | Scripts that run when a record is saved and can POST to an external URL | Push changes from NetSuite to a Medusa API route in near real time | To get NetSuite changes into Medusa as they happen, you deploy a user event script whose `afterSubmit` entry point sends the record to a Medusa API route with the `N/https` module. Otherwise, you poll NetSuite from a Medusa scheduled job. Concurrency limits are shared across SOAP, REST, and RESTlets, so batch calls where you can. ## How NetSuite data maps to Medusa Each row is a sync you build in your NetSuite module. The Medusa side of every row uses native commerce modules. | NetSuite data | Medusa equivalent | Direction | Status | | --- | --- | --- | --- | | Item records and matrix items | Products and product variants (Product Module) | NetSuite to Medusa | Custom | | Item quantities by location | Inventory levels per stock location (Inventory Module) | NetSuite to Medusa | Custom | | Price levels and customer-specific prices | Price lists with customer group rules (Pricing Module), or a live price lookup in add-to-cart | NetSuite to Medusa | Custom | | Customer records | Customers and customer groups (Customer Module) | Both | Custom | | Sales orders | Orders (Order Module) | Medusa to NetSuite | Custom | | Fulfillment and status updates | Order updates | NetSuite to Medusa | Custom | Store the NetSuite internal ID on the Medusa record, for example in `metadata` or the product's `external_id`, so later syncs can match records. ## Real-time vs scheduled sync with NetSuite Medusa supports both timing models with built-in tools. Choose per data type. - **Real-time, Medusa to NetSuite.** A [subscriber](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) on `order.placed` runs a workflow that creates the sales order in NetSuite. - **Real-time, inside checkout.** A [workflow hook](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) on `addToCartWorkflow` checks stock or purchase rules in NetSuite before an item enters the cart. - **Real-time, NetSuite to Medusa.** A user event script posts to a custom Medusa API route that runs an update workflow. - **Scheduled.** A [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) pulls the item catalog or price levels on a cron schedule. ## Code skeleton: push Medusa orders to NetSuite A Medusa workflow step can define a compensation function that runs if a later step fails. Here the compensation deletes the NetSuite sales order, so the two systems do not drift apart. `createSalesOrder` and `deleteSalesOrder` are methods you write in your own NetSuite module, for example against the REST `salesOrder` record. ```ts import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk" import { OrderDTO } from "@medusajs/framework/types" export const createNetSuiteOrderStep = createStep( "create-netsuite-order", async ({ order }: { order: OrderDTO }, { container }) => { const netsuite = container.resolve("netsuite") const id = await netsuite.createSalesOrder(order) return new StepResponse(id, id) }, async (id, { container }) => { if (!id) return await container.resolve("netsuite").deleteSalesOrder(id) } ) ``` Run this step in a workflow triggered by an `order.placed` subscriber, as in the [ERP recipe's order sync section](https://docs.medusajs.com/resources/recipes/erp). Learn more about [compensation functions](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function). ## How Shopify and other platforms connect to NetSuite Oracle's NetSuite Connector is a prebuilt integration for a fixed list of storefronts. Medusa is not on that list, so Medusa projects use custom code or an iPaaS tool. | Platform | How it connects to NetSuite | Customizable flows | | --- | --- | --- | | Shopify, BigCommerce, Magento 2, WooCommerce | Oracle NetSuite Connector (prebuilt) | Limited to the connector's sync options | | Medusa | Custom Medusa module using REST web services or RESTlets | Any flow you code, including checkout-time stock and price checks | | Any platform | iPaaS tools | Depends on the iPaaS recipe | ## When Medusa is not the right choice for NetSuite - You run a standard store on Shopify, BigCommerce, Magento 2, or WooCommerce, and NetSuite Connector covers your order, item, and fulfillment syncs. A prebuilt connector is less work than a custom module. - You have no developer to own the integration. A Medusa NetSuite integration is TypeScript code you maintain through NetSuite releases. Medusa fits when NetSuite holds rules the storefront must enforce during checkout, such as customer-specific prices or purchase restrictions, or when you need flows a connector's sync options do not cover. ## Common questions ### Is there a Medusa plugin for NetSuite? No. Medusa has no first-party NetSuite plugin or NetSuite-specific guide. You write a custom module, following the patterns in the Medusa ERP integration recipe. ### Should a NetSuite integration use SOAP or REST? Use SuiteTalk REST web services with OAuth 2.0. Oracle says new SOAP integrations cannot be built from the 2027.1 release, and all SOAP endpoints are disabled in 2028.2. ### Does NetSuite support webhooks? A SuiteScript user event script can send a record to an external URL in its afterSubmit entry point using the N/https module, which works as a webhook to a Medusa API route. ### Can Medusa use NetSuite customer-specific prices at checkout? Yes, with custom code. You either sync NetSuite price levels into Medusa price lists, or fetch the price from NetSuite in a custom add-to-cart workflow, as the Medusa ERP recipe shows. ## Documentation - [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp) - [Compensation Function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function) - [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) ## Related - [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md) - [Integrate Microsoft Dynamics 365 Business Central with Medusa](https://medusajs.com/kb/erp-integration/business-central.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "How to integrate Odoo with Medusa" description: "How to integrate Odoo with Medusa: the official guide, Odoo JSON-2 vs XML-RPC/JSON-RPC, data mapping, real-time vs scheduled sync, and a code skeleton." url: https://medusajs.com/kb/erp-integration/odoo last_updated: 2026-10-29T06:55:50Z topic: "erp-integration" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md" - "https://medusajs.com/kb/erp-integration/business-central.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/recipes/erp/odoo" - "https://docs.medusajs.com/resources/recipes/erp" - "https://www.odoo.com/documentation/19.0/developer/reference/external_api.html" - "https://www.odoo.com/documentation/19.0/developer/reference/external_rpc_api.html" - "https://www.odoo.com/documentation/20.0/developer/reference/external_rpc_api.html" - "https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html" - "https://www.odoo.com/documentation/19.0/applications/sales/sales/products_prices/prices/pricing.html" - "https://www.odoo.com/documentation/19.0/applications/websites/ecommerce.html" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/learn/fundamentals/scheduled-jobs" - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://docs.medusajs.com/resources/commerce-modules/inventory/concepts" --- # How to integrate Odoo with Medusa > Medusa has an official guide for integrating Odoo. It builds a custom Medusa module that authenticates with Odoo's external API and syncs products into Medusa with a workflow and a daily scheduled job. You extend it with the Medusa ERP recipe's patterns for orders, prices, and stock. On Odoo 19 and later, prefer the JSON-2 API. ## Does Medusa have an Odoo integration? Medusa has an official step-by-step guide, [Integrate Odoo with Medusa](https://docs.medusajs.com/resources/recipes/erp/odoo), with example code. It builds a custom Odoo module in Medusa that authenticates with Odoo, fetches products and their variants, and syncs them into Medusa with a workflow and a daily scheduled job. Orders, prices, and stock checks are not in the guide; you add them with the patterns in the [Medusa ERP integration recipe](https://docs.medusajs.com/resources/recipes/erp). There is no installable Medusa Odoo plugin. The integration is code that lives in your Medusa project. ## Which Odoo APIs to use from Medusa Odoo exposes its models (products, contacts, sales orders, and more) to external systems through two API generations. | Odoo API | Endpoint | Status | | --- | --- | --- | | External JSON-2 API | POST to /json/2// with an API key as a bearer token | New in Odoo 19.0. The replacement for the RPC APIs | | XML-RPC and JSON-RPC | /xmlrpc, /xmlrpc/2, /jsonrpc | Deprecated since Odoo 19.0. Scheduled for removal in Odoo 22 (fall 2028) and Odoo Online 21.1 (winter 2027) | The Medusa Odoo guide uses the JSON-RPC endpoint with the `json-rpc-2.0` package, which works on current Odoo versions. On Odoo 19 or later, write new code against JSON-2 so you do not have to migrate later. Two Odoo constraints matter before you start. Odoo's documentation states that external API access is only available on Custom pricing plans, not on One App Free or Standard. For pushing changes out of Odoo, automation rules (in Odoo Studio) include a Send Webhook Notification action that POSTs selected fields to a URL. ## How Odoo data maps to Medusa Each row is a sync in your Odoo module. The Medusa side of every row uses native commerce modules. | Odoo data | Medusa equivalent | Direction | Status | | --- | --- | --- | --- | | Product templates and variants (product.template) | Products and product variants (Product Module) | Odoo to Medusa | Official guide | | On-hand quantity (qty_available) | Inventory levels per stock location (Inventory Module) | Odoo to Medusa | Custom | | Pricelists, including a pricelist set on a customer's contact | Price lists with customer group rules (Pricing Module), or a live price lookup in add-to-cart | Odoo to Medusa | Custom | | Contacts (res.partner) | Customers and customer groups (Customer Module) | Both | Custom | | Sales orders (sale.order) | Orders (Order Module) | Medusa to Odoo | Custom | | Order and delivery status | Order updates | Odoo to Medusa | Custom | Store the Odoo record ID on the Medusa record, for example in `metadata` or the product's `external_id`, so later syncs can match records. ## Real-time vs scheduled sync with Odoo Medusa supports both timing models with built-in tools. The Odoo guide uses the scheduled model for products. - **Scheduled.** A [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) runs the product sync workflow once a day (cron `0 0 * * *`), paging through Odoo products until none are left. - **Real-time, Medusa to Odoo.** A [subscriber](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) on `order.placed` runs a workflow that creates the sales order in Odoo. - **Real-time, inside checkout.** A [workflow hook](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) on `addToCartWorkflow` checks stock in Odoo before an item enters the cart. - **Real-time, Odoo to Medusa.** An Odoo automation rule sends a webhook to a custom Medusa API route that runs an update workflow. ## Code skeleton: call the Odoo JSON-2 API from a Medusa module A Medusa module service holds the Odoo connection, and workflows resolve it from the Medusa container. This sketch uses JSON-2 instead of the JSON-RPC client in the guide. The method name and body fields follow Odoo's JSON-2 reference. ```ts type Options = { url: string; database: string; apiKey: string } export default class OdooModuleService { private options: Options constructor({}, options: Options) { this.options = options } async searchRead(model: string, body: Record) { const res = await fetch(`${this.options.url}/json/2/${model}/search_read`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `bearer ${this.options.apiKey}`, "X-Odoo-Database": this.options.database, }, body: JSON.stringify(body), }) if (!res.ok) throw new Error(`Odoo request failed: ${res.status}`) return res.json() } } ``` The rest of the guide applies unchanged: register the module in `medusa-config.ts`, create the sync workflow with `createProductsWorkflow` and `updateProductsWorkflow`, and run it from a scheduled job. ## Odoo eCommerce vs Shopify vs Medusa with Odoo Odoo ships its own eCommerce app, which handles the order lifecycle inside Odoo, including stock management, returns, and invoicing. That option deserves a fair look before you add a second system. | Option | How it uses Odoo data | Sync needed | | --- | --- | --- | | Odoo eCommerce app | Built into Odoo, with orders, stock, and invoicing handled in Odoo | No | | Shopify with Odoo | Third-party connector or iPaaS | Yes. Check vendor docs | | Medusa with Odoo | Custom Medusa module from the official guide | Yes, in Medusa workflows and scheduled jobs | ## When Medusa is not the right choice for Odoo - Odoo eCommerce covers your storefront and checkout needs. It avoids a second system and all sync work. - You are on an Odoo Standard or One App Free plan. The external API is not available there, so no outside storefront can integrate. - You have no developer. The Medusa Odoo integration is TypeScript code your team maintains. Medusa fits when you need a custom storefront or checkout, multiple sales channels, or commerce logic Odoo eCommerce does not offer, while Odoo stays the system of record for products, stock, and orders. ## Common questions ### Is there a Medusa plugin for Odoo? No installable plugin exists. Medusa provides an official guide with example code that you copy into your project as a custom Odoo module. ### Does the Odoo external API work on every Odoo plan? No. Odoo's documentation states that access to data through the external API is only available on Custom pricing plans, not on One App Free or Standard plans. ### Is Odoo's XML-RPC and JSON-RPC API being removed? Yes. Odoo deprecated the XML-RPC and JSON-RPC APIs in Odoo 19.0 and scheduled them for removal in Odoo 22 (fall 2028) and Odoo Online 21.1 (winter 2027). The External JSON-2 API replaces them. ### Can Odoo send webhooks to Medusa? Yes. Odoo automation rules include a Send Webhook Notification action that sends a POST request with selected fields to a URL, such as a custom Medusa API route. ## Documentation - [Integrate Odoo with Medusa](https://docs.medusajs.com/resources/recipes/erp/odoo) - [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) - [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) ## Related - [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md) - [Integrate Microsoft Dynamics 365 Business Central with Medusa](https://medusajs.com/kb/erp-integration/business-central.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "How do I run online and in-store POS sales from one system?" description: "Run a web store and retail POS on one Medusa backend: sales channels, shared inventory, endless aisle, draft orders, Tekla's example and the POS Starter." url: https://medusajs.com/kb/order-management/online-and-retail-pos last_updated: 2026-10-29T06:55:50Z topic: "order-management" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/order-management/multi-warehouse-inventory.md" - "https://medusajs.com/kb/order-management/open-source-oms.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" sources: - "https://docs.medusajs.com/resources/recipes/pos" - "https://docs.medusajs.com/resources/commerce-modules/inventory/concepts" - "https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations" - "https://docs.medusajs.com/user-guide/orders/fulfillments" - "https://docs.medusajs.com/resources/commerce-modules/order/draft-orders" - "https://docs.medusajs.com/resources/commerce-modules/order" - "https://medusajs.com/blog/tekla-pos" - "https://medusajs.com/blog/agilo-starter-pos" - "https://github.com/Agilo/medusa-pos-starter" --- # How do I run online and in-store POS sales from one system? > Medusa runs online and in-store sales from one backend by giving each store's point of sale its own sales channel and stock location. A POS app places orders as draft orders through the Admin API, sharing products, customers, promotions and returns with the web store. Agilo's open-source POS Starter provides a ready app; terminals and offline mode need custom work. ## How Medusa runs online and in-store sales from one backend Medusa runs a web store and physical stores from one backend by treating each store's point of sale (POS) as its own sales channel. A POS is the app staff use to ring up in-store sales. Products, customers, promotions and orders live in one Medusa application, and the POS app talks to it over the Admin API, the same way the storefront uses the Store API. Medusa's [POS recipe](https://docs.medusajs.com/resources/recipes/pos) describes the pattern: create a sales channel for the online store and another for the POS, link each to its stock locations, and place in-store orders as draft orders. Orders from every channel then show up together in the Medusa Admin. ## Which POS capabilities does Medusa provide? Medusa provides the backend for a POS; it doesn't ship a POS app itself. The table maps common POS terms to Medusa. Native means Medusa core, Starter means an open-source starter app, and Custom means you build it. | POS capability | How Medusa handles it | Status | | --- | --- | --- | | Shared catalog, customers and orders across channels | One backend; each channel is a sales channel | Native | | Store stock kept separate from online stock | Each store is a stock location linked only to its sales channel | Native | | Barcode data | Variants have barcode, EAN, UPC and SKU fields | Native | | Barcode scan lookup | A custom API route that finds a variant by barcode | Custom | | Ringing up a sale | Draft orders created through the Admin API, then converted to orders | Native | | In-store promotions and customer lookup | Promotion and Customer modules | Native | | Returns, exchanges and claims across channels | Order Module, regardless of where the order was placed | Native | | Card terminal payments | A payment module provider for your terminal vendor | Custom | | Ready-made POS app | Agilo's MIT-licensed Medusa POS Starter for iOS and Android | Starter | | Offline selling | Not supported by Medusa or the POS Starter today | Custom | ## How endless aisle works with Medusa Endless aisle means a customer buys an item in the store that isn't on the shelf, and it ships to them from a warehouse. In Medusa, you link the POS sales channel to both the store's location and the warehouse locations. Staff then see warehouse stock in the POS when they sell an item the store doesn't have on the shelf. The POS recipe describes this case: when a product is out of stock in the store but available in a warehouse, the customer buys it in-store and it is delivered to their address. Staff can choose the fulfilling location when they create the fulfillment in the Medusa Admin. ## Shared inventory between the website and the store Shared inventory in Medusa is controlled by which stock locations each sales channel can use. If the website channel is linked to the warehouses only, online orders never consume store stock. If you link the store location to the website channel too, the store's shelves count toward online availability, which supports in-store pickup through the location's pickup options. Each order reserves stock at a location and deducts it on fulfillment, so the same counts are used by every channel. See [inventory concepts](https://docs.medusajs.com/resources/commerce-modules/inventory/concepts) and [manage locations](https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations). ## Example: Tekla's POS on Medusa Tekla moved into physical retail in April 2023 with a Copenhagen store and an iOS POS app built by Agilo on top of the Medusa backend that already ran its online sales. According to [Medusa's case study](https://medusajs.com/blog/tekla-pos), the app supports endless aisle, customer lookup, barcode scanning, draft orders, returns and exchanges, and Stripe Terminal payments. Agilo created a sales channel for the Copenhagen store and linked the store's stock location to it, so store stock wasn't used for online orders. Distribution center stock was also made available to the store for endless aisle. Agilo later released the [Medusa POS Starter](https://medusajs.com/blog/agilo-starter-pos), an Expo and React Native app built on the Admin API. Its README says integrated payment processing and full offline mode are not yet supported. ## When Medusa is not the right choice for POS Medusa is a weaker fit if you need a finished POS with hardware, terminals and offline mode on day one and have no developers. A packaged POS from your commerce platform or your payment provider is faster in that case. Medusa fits when you want online and store channels on one backend you control, and can build or adapt the POS app. ## Common questions ### Does Medusa include a POS app? No. Medusa provides the backend and APIs for a POS. Agilo's MIT-licensed Medusa POS Starter is an Expo and React Native app that connects to the Medusa Admin API and can be used as a starting point. ### Can customers buy in store and get delivery from a warehouse with Medusa? Yes. Link the POS sales channel to warehouse stock locations as well as the store's location, and staff can sell warehouse stock and fulfill it from the warehouse. Medusa's POS recipe calls this an endless aisle experience. ### Can I take card payments in store with Medusa? Yes, through a payment module provider for your terminal vendor, such as Stripe Terminal, which Tekla used. Medusa doesn't ship a terminal integration in core, and the POS Starter's README says terminal payments are still in development. ### Can in-store purchases be returned online with Medusa? Yes. Orders from every sales channel live in the same Order Module, so returns, exchanges and claims work the same way for in-store and online orders. ## Documentation - [Point-of-Sale (POS) recipe](https://docs.medusajs.com/resources/recipes/pos) - [Sales Channel Module](https://docs.medusajs.com/resources/commerce-modules/sales-channel) - [Draft Orders plugin](https://docs.medusajs.com/resources/commerce-modules/order/draft-orders) - [Create a payment module provider](https://docs.medusajs.com/resources/references/payment/provider) - [Manage locations in Medusa Admin](https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations) ## Related - [How do I manage inventory across multiple warehouses and sales channels?](https://medusajs.com/kb/order-management/multi-warehouse-inventory.md) - [Is there an open-source order management system I can extend?](https://medusajs.com/kb/order-management/open-source-oms.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) --- title: "Best open-source ecommerce platforms (2026), compared" description: "Compare Medusa, Saleor, Vendure, WooCommerce, Magento, PrestaShop, Sylius and Spree by license, stack, API, GitHub stars, managed hosting and best fit." url: https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md" - "https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md" - "https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" sources: - "https://medusajs.com/pricing.md" - "https://docs.medusajs.com/learn/introduction/architecture" - "https://docs.medusajs.com/learn/deployment" - "https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md" - "https://github.com/medusajs/medusa" - "https://github.com/saleor/saleor" - "https://saleor.io/pricing" - "https://github.com/vendurehq/vendure" - "https://vendure.io/pricing" - "https://github.com/woocommerce/woocommerce" - "https://woocommerce.com/posts/woocommerce-hosting/" - "https://developer.woocommerce.com/docs/apis/store-api/" - "https://github.com/magento/magento2" - "https://business.adobe.com/products/commerce/magento/open-source.html" - "https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/overview" - "https://developer.adobe.com/commerce/webapi/graphql/usage/" - "https://github.com/PrestaShop/PrestaShop" - "https://prestashop.com/prestashop-offers/hosted/" - "https://devdocs.prestashop-project.org/9/admin-api/" - "https://github.com/Sylius/Sylius" - "https://sylius.com/" - "https://github.com/spree/spree" --- # Best open-source ecommerce platforms (2026), compared > The leading open-source ecommerce platforms in 2026 are Medusa, Saleor, Vendure, WooCommerce, Magento Open Source, PrestaShop, Sylius and Spree. Medusa fits TypeScript teams building custom commerce logic over REST APIs. Saleor and Vendure fit GraphQL-first teams. WooCommerce, Magento, PrestaShop and Sylius fit PHP teams, and Spree fits Ruby on Rails teams. ## Open-source ecommerce platforms compared side by side The table below compares eight open-source ecommerce platforms on license, stack, API style, GitHub stars, managed hosting and fit. Licenses and star counts come from each project's GitHub repository as of October 28, 2026. Hosting and "best for" notes come from each project's own site. | Platform | License | Stack | API style | GitHub stars | Managed hosting | Best for | | --- | --- | --- | --- | --- | --- | --- | | Medusa | MIT (RBAC and SSO are Enterprise Edition) | TypeScript, Node.js, PostgreSQL | Headless: REST Store API and Admin API | 36,981 | Medusa Cloud | TypeScript teams building custom commerce logic | | Saleor | BSD-3-Clause | Python, Django, PostgreSQL | Headless: GraphQL only | 23,486 | Saleor Cloud | Teams that want a GraphQL-first API and extensions in any language | | Spree | BSD-3-Clause | Ruby on Rails | Headless: REST API with TypeScript SDKs | 15,786 | None from the project; self-host with official Docker images | Ruby on Rails teams, marketplaces and B2B | | Magento Open Source | OSL-3.0 | PHP | Built-in storefront plus REST and GraphQL APIs | 12,213 | None for Open Source; paid Adobe Commerce has Adobe-managed cloud options | PHP teams with large catalogs and a possible move to Adobe Commerce | | WooCommerce | GPL-2.0 | PHP, WordPress plugin | Built-in WordPress storefront plus REST API and Store API | 10,570 | WordPress.com Commerce plan or any WordPress host | Content-led stores already running on WordPress | | PrestaShop | OSL-3.0 core, AFL-3.0 modules | PHP | Built-in storefront plus Webservice API and Admin API | 9,237 | PrestaShop Hosted offer | Small and mid-size merchants who want a classic all-in-one store | | Sylius | MIT | PHP, Symfony, API Platform | Headless: REST API | 8,563 | None listed; self-host on a VPS, Docker or Kubernetes | Symfony teams building custom B2C or B2B stores | | Vendure | GPLv3 or Vendure Commercial License | TypeScript, Node.js, NestJS | Headless: GraphQL Shop API and Admin API | 8,548 | None yet; Vendure Cloud beta for paid plans not open yet (GA planned Q1 2027) | TypeScript teams that want GraphQL, especially complex B2B | ## How to read the license, stars and hosting columns License type affects what you can do with your changes. MIT and BSD-3-Clause are permissive licenses: you can modify and ship the code without publishing your changes. GPL and OSL are copyleft licenses that attach share-alike conditions in some distribution cases, which is why Vendure also sells a commercial license as an alternative to GPLv3. Medusa's repository is MIT except for its RBAC and SSO code, which is licensed under the [Medusa Enterprise Edition license](https://github.com/medusajs/medusa/blob/develop/ENTERPRISE-LICENSE.md). GitHub stars measure developer attention, not production installs. Projects that merchants install from a plugin directory or a hosting panel, such as WooCommerce, can run on far more stores than their star count suggests. Managed hosting differs a lot. Medusa Cloud and Saleor Cloud are generally available, Vendure Cloud has not opened its beta yet, and Spree and Sylius leave hosting to you. WooCommerce, Magento and PrestaShop run on standard PHP hosting. ## Which open-source ecommerce platform fits which team - **Medusa** fits TypeScript teams that need custom business logic in the backend: custom data models, multi-step [workflows](https://docs.medusajs.com/learn/fundamentals/workflows), and REST API routes in the same codebase. - **Saleor** fits teams that want a GraphQL-only API and prefer to extend through apps, which are separate services that talk to Saleor through webhooks and the API. - **Vendure** fits TypeScript teams that prefer GraphQL and the NestJS framework, and teams that want B2B features from a paid plan. - **WooCommerce** fits stores where content and WordPress come first and the team is not writing a custom backend. - **Magento Open Source** fits PHP teams with large catalogs who may later need Adobe Commerce. - **PrestaShop** fits merchants who want themes, modules and a hosted plan without building a headless stack. - **Sylius** fits PHP and Symfony teams building custom stores for mid-market and enterprise brands. - **Spree** fits Ruby on Rails teams, and ships a marketplace seller panel and B2B features in its open-source core. ## How Medusa works as an open-source commerce platform Medusa is a TypeScript commerce platform that ships commerce modules (products, carts, orders, payments, pricing, inventory and more), a Store API, an Admin API and the Medusa Admin dashboard. Requests flow from API routes to workflows to modules to a PostgreSQL database, as described in [Medusa's architecture docs](https://docs.medusajs.com/learn/introduction/architecture). You add custom [modules](https://docs.medusajs.com/learn/fundamentals/modules), workflows, subscribers and admin widgets in the same project. You can self-host Medusa on any Node.js host with PostgreSQL and Redis; the docs recommend at least 2GB of RAM. [Medusa Cloud](https://medusajs.com/pricing.md) plans cost $29 (Develop), $99 (Launch) and $299 (Scale) per month, with a 0% GMV fee on every plan. ## When Medusa is not the right choice - **You want a GraphQL-first API.** Saleor and Vendure both expose GraphQL as their main API. Medusa's APIs are REST. - **Your team writes PHP or Ruby.** Sylius, Magento Open Source and Spree let your team stay in its language. - **You run a WordPress site and have no developer.** WooCommerce on a managed WordPress host is simpler to run. - **You want a classic store with no custom code.** PrestaShop's Hosted offer, or a SaaS platform, gets a small catalog online faster than any headless backend. ## Common questions ### What is the most popular open-source ecommerce platform on GitHub? As of October 28, 2026, Medusa has the most GitHub stars of the eight platforms compared here, with 36,981, followed by Saleor with 23,486. Stars measure developer attention, so WooCommerce runs on far more stores than its 10,570 stars suggest. ### Which open-source ecommerce platforms use GraphQL? Saleor exposes only a GraphQL API, and Vendure exposes GraphQL Shop and Admin APIs. Magento Open Source offers GraphQL alongside REST. Medusa, Sylius and Spree use REST APIs. ### Is Medusa fully open source? Medusa's repository is MIT-licensed except for its RBAC and SSO code, which falls under the Medusa Enterprise Edition license. Commerce modules, the Store and Admin APIs, workflows and the Medusa Admin are MIT. ### What is the best open-source Shopify alternative? It depends on your team's language. Medusa and Vendure suit TypeScript teams, Saleor suits teams that want GraphQL and Python, and WooCommerce suits stores already on WordPress. Merchants without developers may be better served by a hosted plan such as PrestaShop Hosted. ## Documentation - [Medusa's architecture](https://docs.medusajs.com/learn/introduction/architecture) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Workflows](https://docs.medusajs.com/learn/fundamentals/workflows) - [Medusa deployment overview](https://docs.medusajs.com/learn/deployment) ## Related - [Medusa vs Saleor, and other Saleor alternatives](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-saleor.md) - [Medusa vs Vendure](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md) - [Composable commerce platforms for mid-market brands](https://medusajs.com/kb/migrations-and-platforms/composable-commerce.md) - [Switching from WooCommerce to a JavaScript stack](https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) --- title: "Is there an open-source order management system I can extend?" description: "Medusa is an open-source, extensible OMS: multi-channel orders, edits, returns, exchanges, claims and fulfillment, compared with Odoo and closed OMS vendors." url: https://medusajs.com/kb/order-management/open-source-oms last_updated: 2026-10-29T06:55:50Z topic: "order-management" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/order-management/multi-warehouse-inventory.md" - "https://medusajs.com/kb/order-management/online-and-retail-pos.md" - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md" - "https://medusajs.com/kb/erp-integration/odoo.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" sources: - "https://docs.medusajs.com/resources/recipes/oms" - "https://docs.medusajs.com/resources/commerce-modules/order" - "https://docs.medusajs.com/resources/commerce-modules/order/edit" - "https://docs.medusajs.com/resources/commerce-modules/order/exchange" - "https://docs.medusajs.com/resources/commerce-modules/order/claim" - "https://docs.medusajs.com/resources/commerce-modules/order/draft-orders" - "https://docs.medusajs.com/user-guide/orders/fulfillments" - "https://docs.medusajs.com/user-guide/orders/returns" - "https://docs.medusajs.com/resources/commerce-modules/stock-location/links-to-other-modules" - "https://medusajs.com/blog/makro-pro" - "https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory.html" - "https://www.odoo.com/page/editions" --- # Is there an open-source order management system I can extend? > Yes. Medusa's MIT-licensed core is a commerce platform that works as an extensible open-source order management system. It natively handles multi-channel order capture, draft orders, order edits, returns, exchanges, claims, location-based stock reservation and fulfillment providers. You extend it with TypeScript workflows, subscribers and modules. Replenishment, purchasing and warehouse management need custom code or an ERP. ## How Medusa works as an open-source order management system Medusa is an open-source commerce platform, MIT-licensed apart from its Enterprise Edition RBAC and SSO features, whose commerce modules cover the core of an order management system (OMS). An OMS is the system that captures orders from every sales channel, decides where each order ships from, and tracks it through fulfillment, returns and refunds. In Medusa, that job is split across the Order, Inventory, Stock Location, Sales Channel, Fulfillment and Payment modules. Medusa's [OMS recipe](https://docs.medusajs.com/resources/recipes/oms) describes this setup: storefronts and other channels send orders into Medusa, stock is reserved at a location, and fulfillment and payment run through provider modules. Because Medusa is a headless backend with a framework for customization, you change how orders are captured, routed or synced in your own TypeScript code instead of waiting on a vendor roadmap. ## Which OMS capabilities does Medusa cover? Medusa's OMS capabilities map to common order management terms as follows. Native means it ships in Medusa core, Official guide means the docs include a guide with example code, and Custom means you build it. | OMS capability | How Medusa handles it | Status | | --- | --- | --- | | Multi-channel order capture | Sales channels scope products, stock and orders; the Store API serves web, mobile and kiosk clients | Native | | Orders from phone, sales reps or POS | Draft orders, with an Admin UI from the Draft Orders plugin included since v2.10.0 | Native | | Order editing | Add items or change quantities and prices; each change creates a new order version | Native | | Returns, exchanges and claims | Dedicated order changes, with refunds or extra payment tracked through a difference due | Native | | Fulfillment provider framework | Fulfillment Module providers, linked to the stock locations where they can be used | Native | | Connecting a carrier or 3PL | Create a fulfillment module provider for the service | Official guide | | Routing by location | Stock is reserved at the location linked to the order's sales channel; staff can pick another location per fulfillment | Native | | Automated routing rules (nearest store, split by stock) | Not built in; write a workflow that picks locations and creates fulfillments | Custom | | Importing orders from marketplaces or another checkout | A custom API route or scheduled job, as the OMS recipe suggests | Custom | | Replenishment, purchasing, warehouse management | Not built in; pair Medusa with an ERP or WMS | Custom | ## How do you extend Medusa's order flows? Medusa's framework gives you four main extension points for order management. Each one runs inside the same application as the commerce modules, so custom logic and core data share one database and one deployment. - **Subscribers** run code when an event fires, such as `order.placed`, `order.fulfillment_created` or `order.return_requested`. Use them to push orders to a 3PL or ERP. See [events and subscribers](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) and the [order events reference](https://docs.medusajs.com/resources/references/order/events). - **Workflows** chain steps with compensation, so a failed call to an external system rolls back earlier steps. See [workflows](https://docs.medusajs.com/learn/fundamentals/workflows). - **Module providers** plug carriers and payment services into the Fulfillment and Payment modules. See [create a fulfillment module provider](https://docs.medusajs.com/resources/references/fulfillment/provider). - **Custom modules and API routes** add data that Medusa doesn't model, such as routing rules or warehouse priorities, and expose it to your apps. ## Example: Makro PRO uses Medusa for order orchestration Makro PRO, the online platform of Thai wholesaler CP Axtra (the Makro chain, called Siam Makro in Medusa's OMS recipe), uses Medusa as the central hub for order orchestration. According to [Medusa's 2023 case study](https://medusajs.com/blog/makro-pro), the setup processes more than 5,000 orders per day, dispatched from over 100 stores across Thailand. Orders are registered in Medusa and split by fulfillment type. First-party orders go to a custom system that coordinates fulfillment across Makro stores, and third-party orders go to Mirakl, which manages Makro's seller network. The team built a webhook-based plugin so external systems update order statuses in Medusa, which customer support uses as the single order overview. ## How does Medusa compare with Odoo and closed OMS vendors? Medusa, Odoo and closed-source OMS products solve overlapping problems from different starting points. Odoo is an ERP suite, closed OMS vendors sell routing and orchestration as a hosted product, and Medusa is a commerce backend you extend in code. | Aspect | Medusa | Odoo | Closed-source OMS vendors | | --- | --- | --- | --- | | License | MIT open source (RBAC and SSO are Enterprise Edition) | Community edition open source, Enterprise licensed | Proprietary | | Main focus | Commerce backend: carts, orders, payments, fulfillment | ERP suite with Inventory, Purchase, POS and more | Order routing and orchestration | | Replenishment and purchasing | Custom or via an ERP | Reordering rules, replenishment report, requests for quotation | Check vendor docs | | Inter-warehouse transfers | Custom | Routes, push and pull rules, inter-warehouse replenishment | Check vendor docs | ## When Medusa is not the right choice for an OMS Medusa is a weaker fit when you need warehouse and purchasing features on day one. Purchase orders, reorder points, bin locations and stock transfers aren't part of Medusa core, so a team without developers is better served by an ERP such as Odoo, or by keeping the ERP as the stock master and syncing it with Medusa. A dedicated OMS product can also fit better when business users need to edit routing rules in a UI without any code, and you don't need control over the source. ## Common questions ### Can Medusa be used only as an OMS behind another storefront or checkout? Yes. Medusa's OMS recipe describes importing orders from a third-party checkout through a custom API route or a scheduled job. You build that import yourself, since Medusa has no built-in order importer. ### Does Medusa route orders to the nearest warehouse automatically? No. Medusa reserves stock at the stock location linked to the order's sales channel, and staff can choose another location when they create a fulfillment. Rules such as nearest store or split shipments need a custom workflow. ### Does Medusa support returns, exchanges and claims? Yes. Medusa's Order Module supports returns, exchanges, claims and order edits as order changes, and the Medusa Admin has screens for each. Returned items can be received back into a chosen stock location. ### Is Medusa an alternative to Odoo for order management? Partly. Medusa covers order capture, fulfillment and returns for commerce channels, while Odoo is an ERP with purchasing, replenishment and inter-warehouse transfers. Many teams pair Medusa with an ERP for stock planning. ## Documentation - [Order Management System (OMS) recipe](https://docs.medusajs.com/resources/recipes/oms) - [Order Module](https://docs.medusajs.com/resources/commerce-modules/order) - [Create a fulfillment module provider](https://docs.medusajs.com/resources/references/fulfillment/provider) - [Order events reference](https://docs.medusajs.com/resources/references/order/events) - [Workflows](https://docs.medusajs.com/learn/fundamentals/workflows) ## Related - [How do I manage inventory across multiple warehouses and sales channels?](https://medusajs.com/kb/order-management/multi-warehouse-inventory.md) - [How do I run online and in-store POS sales from one system?](https://medusajs.com/kb/order-management/online-and-retail-pos.md) - [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md) - [How to integrate Odoo with Medusa](https://medusajs.com/kb/erp-integration/odoo.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) --- title: "Outgrown Shopify Plus: what sits between Shopify and a custom build?" description: "Outgrown Shopify Plus? How Medusa maps Functions limits, checkout extensibility, Scripts deprecation and API rate limits to a commerce framework you own." url: https://medusajs.com/kb/migrations-and-platforms/outgrown-shopify-plus last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" sources: - "https://shopify.dev/docs/api/functions/latest" - "https://shopify.dev/docs/api/checkout-ui-extensions" - "https://shopify.dev/docs/apps/build/checkout" - "https://help.shopify.com/en/manual/checkout-settings/script-editor/migrating" - "https://shopify.dev/docs/apps/build/apis/graphql-admin/rate-limits" - "https://medusajs.com/blog/healthletic" - "https://medusajs.com/pricing" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow" - "https://docs.medusajs.com/resources/references/medusa-workflows/addToCartWorkflow" - "https://docs.medusajs.com/learn/fundamentals/modules" - "https://docs.medusajs.com/learn/fundamentals/api-routes" - "https://docs.medusajs.com/learn/fundamentals/api-routes/middlewares" - "https://docs.medusajs.com/resources/storefront-development/checkout" - "https://docs.medusajs.com/resources/examples/guides/custom-item-price" --- # Outgrown Shopify Plus: what sits between Shopify and a custom build? > Medusa is the in-between option for brands that outgrew Shopify Plus: an open-source commerce framework, not a build from scratch. It ships carts, orders, pricing, payments, and an admin, and you add custom logic in TypeScript with workflows, workflow hooks, custom modules, and API routes, without Shopify Functions limits or a sandboxed checkout. ## Why is Medusa the option between Shopify Plus and a custom build? Medusa is the in-between option for brands that have outgrown Shopify Plus: a commerce framework, not a build from scratch. It ships the commerce modules (products, carts, orders, pricing, promotions, payments, fulfillment, inventory), a Store API, an Admin API, and an admin dashboard. You write only the logic that is specific to your business. That custom logic runs as TypeScript inside your own Medusa application. It is not a sandboxed extension with platform-set limits. You add [custom modules](https://docs.medusajs.com/learn/fundamentals/modules) for new data and business logic, [workflows](https://docs.medusajs.com/learn/fundamentals/workflows) for multi-step processes, and [custom API routes](https://docs.medusajs.com/learn/fundamentals/api-routes) to expose them. ## How do Shopify Plus limits map to Medusa? The table maps the Shopify Plus limits teams hit most often to the Medusa equivalent. Shopify figures come from shopify.dev and help.shopify.com. | Shopify Plus limit | What Shopify documents | Medusa equivalent | Status | | --- | --- | --- | --- | | Shopify Functions limits | WebAssembly modules with a 256 kB compiled size cap. For carts up to 200 lines: 11 million instructions, 128 kB input, 20 kB output. Network access is limited to custom apps on Enterprise stores, on request. | Workflow hooks in core flows, such as setPricingContext in addToCartWorkflow and validate in completeCartWorkflow. Steps are TypeScript and can call external services, such as a real-time price API. | Native | | Custom line item pricing | The Functions output limit doesn't support bulk price transformations across all line items. | A custom workflow that computes a price and adds the item to the cart with it. | Official guide | | Checkout extensibility | UI extensions run in an isolated sandbox without DOM access, limited to platform components. Extensions on the information, shipping, and payment steps are Plus-only. | The checkout is your own storefront calling the Store API: email, address, shipping, payment, and cart completion. | Native | | Shopify Scripts deprecation | Scripts were deprecated on June 30, 2026, and published Scripts were deactivated. Functions replace them. | No scripting layer to sunset. Logic lives in workflows in your own repository. | Native | | API rate limits | GraphQL Admin API: 100 points per second on Standard, 1000 on Plus, 2000 on Shopify for enterprise. One query can't exceed 1,000 points. | Capacity depends on the servers you run, or your Medusa Cloud plan's compute. You add rate limiting as API route middleware if you want it. | Custom | | App sprawl | Custom features often ship as separate apps. | Custom modules run inside the same Medusa application, with no separate app to host. | Native | ## What does custom checkout logic look like in Medusa? A workflow hook is a point in a Medusa core workflow where you inject your own step. The `completeCartWorkflow` has a `validate` hook that runs before the order is created and payment is authorized. Throwing an error stops the order. ```ts import { completeCartWorkflow } from "@medusajs/medusa/core-flows" import { MedusaError } from "@medusajs/framework/utils" completeCartWorkflow.hooks.validate(async ({ cart }, { container }) => { const allowed = await checkOrderRules(cart, container) if (!allowed) { throw new MedusaError(MedusaError.Types.INVALID_DATA, "Order not allowed") } }) ``` Here `checkOrderRules` is your own function. It can query your custom modules or call an ERP, with no instruction count or binary size cap. See [workflow hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) for the full pattern. ## How do you migrate from Shopify Plus to Medusa? Medusa's [Shopify migration tool](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify) is part of the Medusa Docs MCP server. You ask your AI coding agent to migrate your Shopify store, and it follows a guide the tool returns. 1. Connect the Medusa Docs MCP server to your AI tool or IDE. 2. Pick an approach. The default builds a module and workflows that pull from Shopify's API, so the import is resumable and can run again. The CSV approach is faster but lossy: inventory quantities aren't migrated and images stay on Shopify's CDN. 3. Migrate catalog data first: products, variants, prices, images, inventory, and collections. The tool is mainly aimed at catalog data. Orders and customers are possible but secondary. 4. Run Medusa alongside Shopify for a phased cutover, then move remaining flows. For hands-on help, Medusa lists [Expert partners](https://medusajs.com/experts) for data migration and custom features. ## Has a Shopify Plus brand at scale moved to Medusa? Healthletic, a supplements brand with $24M+ in yearly GMV and 240,000+ orders a year, moved from Shopify Plus to Medusa with Rigby, a Medusa Expert partner. On Shopify Plus it paid $25,000 per month in platform and transaction fees, and it could not add payment options beyond what Shopify's checkout supported. In the first month after the migration, checkout conversion was around 30% higher than on Shopify Plus. Rigby built subscriptions as a module in the Medusa backend and kept Shopify for existing subscriptions and fulfillment as a first phase. Read the [Healthletic case study](https://medusajs.com/blog/healthletic). ## When should you stay on Shopify Plus? Shopify Plus is the better fit in these cases: - You have no developers, in-house or through a partner, to own a codebase. - Your custom logic fits within Functions limits and checkout UI extensions. - Your operations depend on Shopify apps you can't replace, and app costs are acceptable. - You want Shopify to run hosting and checkout for you. With Medusa you own the storefront, the custom code, and its maintenance. You self-host it or run it on [Medusa Cloud](https://medusajs.com/pricing), with plans from $29 per month and a 0% GMV platform fee. ## Common questions ### What replaces Shopify Scripts after the June 2026 deprecation? Shopify says Scripts were deprecated on June 30, 2026, and points merchants to Shopify Functions. In Medusa, the same kind of cart, discount, and checkout logic lives in workflows and workflow hooks in your own codebase. ### Can I keep Shopify running while I move to Medusa? Yes. Healthletic ran Medusa alongside Shopify, keeping Shopify for existing subscriptions and fulfillment while Medusa handled the storefront, checkout, and new subscriptions. A phased cutover lowers the risk to live orders and billing. ### Does Medusa charge a percentage of GMV like Shopify Plus? No. Medusa's core is open source under the MIT license, and every Medusa Cloud plan has a 0% GMV platform fee, with plans from $29 per month. If you self-host, you pay only for your own infrastructure. ### Do I need developers to run Medusa? Yes. Medusa is a framework, so a developer or a Medusa Expert partner builds and maintains the storefront and custom logic. Teams without that capacity are usually better served by Shopify Plus. ## Documentation - [Migrate from Shopify to Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify) - [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Checkout in Storefront](https://docs.medusajs.com/resources/storefront-development/checkout) - [Implement Custom Line Item Pricing in Medusa](https://docs.medusajs.com/resources/examples/guides/custom-item-price) ## Related - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) --- title: "How to make your product catalog visible to AI assistants" description: "How to make products visible in ChatGPT and AI assistants: ACP feed fields, format and cadence, Medusa field mapping, schema.org markup, and llms.txt." url: https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md" - "https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md" - "https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant.md" sources: - "https://developers.openai.com/commerce/specs/file-upload/products" - "https://developers.openai.com/commerce/specs/file-upload/overview" - "https://developers.openai.com/commerce/guides/get-started" - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce" - "https://developers.google.com/merchant/ucp" - "https://schema.org/Product" - "https://llmstxt.org/" - "https://docs.medusajs.com/resources/storefront-development/publishable-api-keys" - "https://docs.medusajs.com/api/store" --- # How to make your product catalog visible to AI assistants > To make products visible in ChatGPT, send OpenAI a product feed that follows its Agentic Commerce Protocol schema: nine required fields per variant, uploaded as a full snapshot at least daily. Add schema.org Product markup and agent-readable pages for other assistants. Medusa has an official guide that builds the feed with a workflow and scheduled job. ## How do AI assistants read a product catalog? AI assistants read a store's catalog through three channels: product feeds sent to the AI platform, structured data on product pages, and APIs or agent-readable files they call directly. ChatGPT shopping relies on a product feed. Assistants that browse the web also read schema.org markup and Markdown, so a visible catalog covers all three. | Channel | What the assistant reads | Medusa status | | --- | --- | --- | | ChatGPT product feed (ACP) | A full catalog snapshot you upload to OpenAI | Official guide | | Google Merchant Center shopping feeds | The feeds Google's UCP page says merchants can reuse | Custom | | schema.org Product markup | JSON-LD on storefront product pages | Custom | | llms.txt and Markdown pages | Agent-friendly text versions of your pages | Custom | | Store API product search | GET /store/products with a search term | Native | ## What fields does the ChatGPT product feed need? OpenAI's [product file schema](https://developers.openai.com/commerce/specs/file-upload/products) requires nine fields for every item or variant: `item_id`, `title`, `description`, `url`, `brand`, `seller_name`, `image_url`, `availability`, and `price`. Availability must be one of `in_stock`, `out_of_stock`, `pre_order`, `backorder`, or `unknown`. Price uses major currency units with the currency code, such as `79.99 USD`. Variants share a `group_id` and set `listing_has_variations` and `variant_dict`. To appear in Instant Checkout, an item also needs `is_eligible_checkout`, `seller_privacy_policy`, and `seller_tos`. ## How often and in what format do you send the feed? OpenAI's [file upload guide](https://developers.openai.com/commerce/specs/file-upload/overview) sets these delivery rules: - Push full catalog snapshots over SFTP. - Use parquet (preferred), or jsonl.gz, csv.gz, or tsv.gz, in UTF-8. - Upload at least once a day, and overwrite the same file names each time. - Keep shards under about 500,000 items and 500MB. - A product missing from later snapshots expires within 14 days. Set `is_eligible_search=false` to hide it sooner. Feed onboarding is open to approved partners, who [apply through OpenAI](https://developers.openai.com/commerce/guides/get-started). ## How do Medusa fields map to ACP feed fields? This mapping applies OpenAI's current product file schema to the Medusa data that Medusa's [ACP guide](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) reads, one row per variant. The guide itself writes older field names (link, image_link, item_group_id, separate color and size), so rename them for OpenAI's format: | ACP field | Medusa source | | --- | --- | | item_id | Variant id | | group_id | Product id | | title | Product title; OpenAI asks you to name the variant too | | description | Product description | | url | Storefront URL plus product handle | | image_url | Product thumbnail | | price | Variant calculated price in the region's currency | | availability | Variant inventory, or in_stock when inventory isn't managed | | variant_dict | Variant option values, such as color and size | | gtin | Variant upc | | brand, seller_name | Not in core; set from config, metadata, or a custom module | ## How do you generate the feed from Medusa? In Medusa, you generate the feed in a [workflow](https://docs.medusajs.com/learn/fundamentals/workflows) that reads products, prices, and stock with [Query](https://docs.medusajs.com/learn/fundamentals/query), then run it from a [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs). This job runs the guide's `sendProductFeedWorkflow` once a day: ```ts import { MedusaContainer } from "@medusajs/framework/types" import sendProductFeedWorkflow from "../workflows/send-product-feed" export default async function syncProductFeed(container: MedusaContainer) { await sendProductFeedWorkflow(container).run({ input: { currency_code: "usd", country_code: "us" }, }) } export const config = { name: "sync-product-feed", schedule: "0 2 * * *", } ``` The guide writes the feed as XML on a 15-minute schedule and logs it instead of uploading it. Change the output to a format OpenAI's current spec accepts, and add the SFTP upload once you have access. ## How do you make product pages readable by agents? Product pages become readable to web-browsing assistants through [schema.org Product](https://schema.org/Product) markup. Add a JSON-LD block with `name`, `description`, `image`, `sku` or `gtin`, `brand`, and an `offers` object with `price`, `priceCurrency`, and `availability`. Medusa storefronts are separate apps, so you add this in your product page using data from the Store API. [llms.txt](https://llmstxt.org/) is a proposed Markdown file at a site's root that lists the pages an agent should read. The same proposal suggests a Markdown copy of each page at the page URL plus `.md`. Medusa does not generate either for storefronts; you add them in the storefront. ## How can agents query a Medusa catalog directly? Agents that call APIs can search a Medusa catalog through the Store API. `GET /store/products` accepts a `q` search term and needs an `x-publishable-api-key` header, which scopes results to a sales channel. See [List Products](https://docs.medusajs.com/resources/storefront-development/products/list) and [publishable API keys](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys). ## When is Medusa not the right choice? If you only need a ChatGPT feed and have no developer, a hosted platform or a feed management tool takes less work than building the feed in code. Medusa fits when you want the feed generated from your own product, price, and inventory data. ## Common questions ### What format does the ChatGPT product feed use? OpenAI's file upload spec prefers parquet and also accepts jsonl.gz, csv.gz, and tsv.gz, delivered over SFTP as a full catalog snapshot. OpenAI recommends uploading at least once a day. ### Can anyone submit a product feed to ChatGPT? No. OpenAI states that product feed onboarding in ChatGPT is available to approved partners, who apply through OpenAI's merchant form. ### Does Medusa add schema.org markup to product pages? Medusa storefronts are separate applications, so you add schema.org Product JSON-LD in your storefront's product page, using product, price, and stock data from Medusa's Store API. ### How do I remove a product from the ChatGPT feed? Set is_eligible_search to false, or leave the product out of later full snapshots. OpenAI keeps a missing product's last record for up to 14 days before it expires. ## Documentation - [Implement Agentic Commerce (ChatGPT Instant Checkout) Specifications](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) - [Query](https://docs.medusajs.com/learn/fundamentals/query) - [Show Products in Storefront](https://docs.medusajs.com/resources/storefront-development/products/list) ## Related - [How to let ChatGPT and other AI agents buy from your store](https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md) - [ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained](https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md) - [How to build an AI shopping assistant on your product catalog](https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant.md) --- title: "Build a peer-to-peer rental marketplace: build vs buy" description: "Build vs buy a peer-to-peer rental marketplace: compare from scratch, Sharetribe, and Medusa with Mercur for listings, availability, payouts, and deposits." url: https://medusajs.com/kb/marketplaces/rental-marketplace last_updated: 2026-10-29T06:55:50Z topic: "marketplaces" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits.md" - "https://medusajs.com/kb/marketplaces/multi-vendor-marketplace.md" - "https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md" - "https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md" sources: - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals" - "https://docs.medusajs.com/resources/recipes/marketplace" - "https://medusajs.com/marketplace.md" - "https://medusajs.com/blog/get-started-with-mercur-2-0-on-cloud.md" - "https://github.com/mercurjs/mercur" - "https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline.md" - "https://docs.mercurjs.com/llms.txt" - "https://medusajs.com/pricing.md" - "https://www.sharetribe.com/pricing/" - "https://www.sharetribe.com/rental-marketplace/" --- # Build a peer-to-peer rental marketplace: build vs buy > For a peer-to-peer rental marketplace you can build from scratch, launch on Sharetribe, or start from Medusa with the Mercur marketplace platform. Mercur adds sellers, commissions, reviews and Stripe Connect payouts, and Medusa's rentals tutorial adds availability and per-day pricing. Deposits, insurance and payout timing are custom work. ## Three ways to build a peer-to-peer rental marketplace A peer-to-peer rental marketplace, such as one where people rent camera gear to each other, needs listings, an availability calendar, time-based pricing, payments, and payouts to owners. You can build it from scratch, launch on a marketplace SaaS such as Sharetribe, or start from Medusa with the Mercur marketplace platform and Medusa's rentals guide. Sharetribe figures are from its own site, as of October 2026. | Factor | From scratch | Sharetribe | Medusa + Mercur + rentals guide | | --- | --- | --- | --- | | Time to first booking | Longest | Shortest, rentals are built in | Middle, marketplace is built in and rental logic is added | | Code ownership | Full | Build plan includes full code access; runs on Sharetribe's API | Full, open source (MIT core) | | Platform cost | Your infrastructure | Build $39/month (test mode only), Live $199/month billed yearly | Self-host for free, or Medusa Cloud from $29/month | | Transaction fee | None | No Sharetribe transaction fees on Live | 0% GMV fee on Medusa Cloud | | Availability calendar | You build it | Built in, by day, night, or hour | Official guide, by day | | Owner payouts | You build it | Stripe pays the supplier after the booking ends | Mercur Stripe Connect provider; you trigger each payout | | Deposits | You build it | Listed as an integration you add | Custom | Sharetribe is the faster path if its rental model matches yours. Medusa is the better fit when you need rules Sharetribe doesn't model, such as a custom deposit flow, B2B fleet owners, or bundles, and you want to own the backend. ## How rental marketplace features map to Medusa and Mercur Medusa is an open source commerce platform with a framework for custom modules and workflows. [Mercur](https://github.com/mercurjs/mercur), built by Rigby on Medusa, adds sellers, commissions, split orders, reviews, and payouts. Medusa's [product rentals tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) adds rental dates, availability, and per-day pricing for a single merchant. | Rental term | How Medusa does it | Status | | --- | --- | --- | | Listings by owners | Mercur sellers with their own products and vendor panel | Starter | | Availability calendar | Rental records with start and end dates and an overlap check per variant | Official guide | | Per-day pricing | Variant price times rental days, set as the line item price | Official guide | | Multi-owner checkout | Mercur splits one cart into one order per seller under an order group | Starter | | Commission | Mercur commission rates, percentage or fixed, matched by rules | Starter | | Owner payouts and onboarding | Mercur payout module with the Stripe Connect provider and onboarding links | Starter | | Reviews | Mercur reviews with moderation and seller answers | Starter | | Delayed payout after return | You decide when to call Mercur's createPayoutWorkflow | Custom | | Security deposits | Separate authorization or charge | Custom | | Damage protection, insurance | Third-party integration | Custom | Two gaps matter. The rentals tutorial is single-merchant, so wiring its rental module to Mercur's sellers is your work; no official guide combines them yet. Mercur's [payout pipeline](https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline.md) ships the payout workflows and webhook handling but no scheduler, so you write the job or subscriber that pays an owner once the gear is returned. ## How the pieces fit together ```text Storefront (Next.js or your own) | Store API Medusa backend |- Product, Pricing, Cart, Order, Payment modules (core) |- Mercur: sellers, commissions, order groups, payouts, reviews |- Rental module (from the rentals guide): configs, rentals, overlap checks |- Your code: deposits, insurance, payout timing Stripe Connect (owner accounts and transfers) ``` Customers book through the Store API, Mercur splits the order per owner, the rental module records the dates, and your payout job transfers the owner's share minus commission after the return. ## When Medusa is not the right choice for a rental marketplace - You want to validate demand in weeks with no developers. Sharetribe's built-in rental flow, calendar, and payouts get you there faster. - Your rentals are hourly or nightly with standard rules, and Sharetribe's model covers them. Medusa's rentals guide works in days, so hourly pricing is custom. - You don't plan to customize the booking or payment flow. Owning the code pays off only when you change it. ## Common questions ### Can Medusa run a rental marketplace out of the box? Not as one package. Mercur adds the marketplace layer on Medusa and the official rentals tutorial adds rental dates and pricing, but combining the two and adding deposits is custom work. ### How do owners get paid in a Medusa rental marketplace? Mercur's payout module connects each seller to Stripe Connect through an onboarding link and transfers the order total minus commission. Mercur doesn't schedule payouts, so you trigger them, for example after the rental is returned. ### Is Sharetribe or Medusa cheaper for a rental marketplace? As of October 2026, Sharetribe's Live plan is $199 per month billed yearly with no Sharetribe transaction fees. Medusa is free to self-host and Medusa Cloud starts at $29 per month with a 0% GMV fee, but you pay for the development work. ### Does Medusa support security deposits for rentals? Not natively. Deposits are custom work, typically a separate payment authorization or a charge that you refund after the return. ## Documentation - [Implement Product Rentals in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) - [Marketplace Recipe](https://docs.medusajs.com/resources/recipes/marketplace) - [Marketplace Recipe: Vendors Example](https://docs.medusajs.com/resources/recipes/marketplace/examples/vendors) ## Related - [Rental pricing, availability and security deposits](https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits.md) - [How do I build a multi-vendor marketplace with open source?](https://medusajs.com/kb/marketplaces/multi-vendor-marketplace.md) - [How do Stripe Connect payouts work for a marketplace?](https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md) - [How to build a booking or reservation system on an ecommerce platform](https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md) --- title: "Rental pricing, availability and security deposits" description: "Rental pricing in Medusa: per-day price calculation, overlap checks to stop double bookings, and security deposit patterns with Stripe holds or refunds." url: https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits last_updated: 2026-10-29T06:55:50Z topic: "marketplaces" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/marketplaces/rental-marketplace.md" - "https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md" - "https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md" sources: - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.medusajs.com/resources/infrastructure-modules/locking" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-flow" - "https://docs.stripe.com/payments/place-a-hold-on-a-payment-method" - "https://docs.stripe.com/payments/extended-authorization" - "https://github.com/medusajs/medusa/issues/17287" --- # Rental pricing, availability and security deposits > Medusa's official rentals tutorial prices a rental as the variant's daily price times the number of days, and blocks dates that overlap an existing pending or active rental. Hourly pricing and security deposits are custom. Deposits usually use a separate card authorization or a charge that you refund after the return. ## How per-day rental pricing works in Medusa Medusa's [product rentals tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) stores each product's regular price as the daily rate. When a customer picks dates, a custom add-to-cart workflow multiplies the variant's calculated price by the number of rental days and sets the result as the line item's `unit_price`. Rental items must have a quantity of 1, and non-rental products in the same cart keep their normal price. A rental configuration per product sets `min_rental_days` and an optional `max_rental_days`. The tutorial also rejects dates in the past and end dates before start dates. Because pricing comes from Medusa's Pricing Module, the daily rate can differ by region or currency like any other price. | Pricing need | How to do it in Medusa | Status | | --- | --- | --- | | Per-day price | Daily price times rental days | Official guide | | Minimum and maximum rental length | Rental configuration per product | Official guide | | Per-hour or per-night price | Store hours or nights instead of days and change the multiplier | Custom | | Weekly or long-rental discounts | Your own rate rules in the price calculation step | Custom | | Regional pricing | Prices per region or currency in the Pricing Module | Native | ## How rental availability and overlap checks work The rentals tutorial treats a variant as unavailable when an existing rental overlaps the requested dates. Two date ranges overlap when the existing start is on or before the requested end and the existing end is on or after the requested start. The tutorial's Rental module service runs this check against rentals with a `pending` or `active` status: ```ts const [, count] = await this.listAndCountRentals({ variant_id, status: ["active", "pending"], $or: [{ rental_start_date: { $lte: end_date }, rental_end_date: { $gte: start_date }, }], }) ``` The check runs in three places: an availability route that the storefront date picker calls, the add-to-cart workflow (against existing rentals and other items in the same cart), and the order creation workflow. Order creation holds a lock on the cart from Medusa's Locking Module. That lock is keyed on the cart, not the variant, so two different carts completing at the same moment can both pass; add a lock keyed on the variant if that risk matters to you. Availability is tracked per variant, so one variant represents one rentable unit. If you own five identical cameras, either create one variant per unit or change the overlap check to count rentals against a quantity. Inventory management is optional for rental variants; the tutorial shows how to restock a variant when a rental is marked as returned. ## Security deposit patterns for rentals A security deposit protects the owner against damage or late returns. Medusa has no built-in deposit feature, so every pattern below is custom work on top of your payment provider. The card hold limits come from [Stripe's documentation](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method), as of October 2026. | Pattern | How it works | Limits | Status in Medusa | | --- | --- | --- | --- | | Authorize and hold | Create a separate Stripe PaymentIntent with manual capture, capture part of it if there's damage, cancel it otherwise | Online card holds usually last 7 days (Visa merchant-initiated: about 5 days); extended authorization reaches 30 days on eligible cards | Custom | | Charge and refund | Charge the deposit with the order, refund it after the return | No time limit; the customer sees the full charge | Custom deposit, native refunds | | Save card, charge on damage | Save the payment method at checkout and charge only if there's a claim | Needs clear terms and customer consent | Custom | The hold pattern fits short rentals that end inside the authorization window. For a 2-week camera rental booked a month ahead, a hold placed at checkout expires before the return, so charge and refund or a hold placed at pickup works better. ## Payment holds in Medusa's Stripe provider Medusa's [Stripe module provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) authorizes the order payment at checkout and captures it later, unless you set its `capture` option to `true`. That is a hold on the whole order, not a separate deposit. Don't settle a deposit by partially capturing the order payment. As of October 2026, an [open Medusa issue](https://github.com/medusajs/medusa/issues/17287) reports that capturing less than the authorized amount records the partial amount in Medusa while Stripe captures the full authorization. Keep the deposit in its own PaymentIntent, managed by a workflow you write. ## When this approach is not the right choice - You need hourly slots, buffers, and staff calendars without writing code. A booking plugin or scheduling SaaS covers that out of the box. - You need deposits held longer than 30 days on a card. No card hold lasts that long; use charge and refund. ## Common questions ### Can Medusa price rentals per hour? Not in the official rentals tutorial, which works in days. You can adapt it to store hours and multiply an hourly rate, which is custom work. ### How long can Stripe hold a security deposit? Stripe's documentation says online card authorizations usually last 7 days, and extended authorization reaches 30 days on eligible cards. Longer rentals need a charge and refund instead. ### Does Medusa capture payments automatically? Medusa's Stripe provider authorizes the payment at checkout and captures it later unless its capture option is set to true. Merchants capture authorized payments from the order page in Medusa Admin. ### How does Medusa stop two customers renting the same item for the same dates? The rentals tutorial checks for overlapping pending or active rentals on the date picker, on add to cart and when the order is created. The overlap check is per variant, so one variant represents one rentable unit. ## Documentation - [Implement Product Rentals in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) - [Stripe Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) - [Locking Module](https://docs.medusajs.com/resources/infrastructure-modules/locking) ## Related - [Build a peer-to-peer rental marketplace: build vs buy](https://medusajs.com/kb/marketplaces/rental-marketplace.md) - [How to build a booking or reservation system on an ecommerce platform](https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md) - [How do Stripe Connect payouts work for a marketplace?](https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md) --- title: "How to integrate SAP Business One with Medusa" description: "How to integrate SAP Business One with Medusa: the Service Layer API, data mapping, real-time vs scheduled sync, webhooks, and a code skeleton to start from." url: https://medusajs.com/kb/erp-integration/sap-business-one last_updated: 2026-10-29T06:55:50Z topic: "erp-integration" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md" - "https://medusajs.com/kb/erp-integration/business-central.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://docs.medusajs.com/resources/recipes/erp" - "https://help.sap.com/doc/fc2f5477516c404c8bf9ad1315a17238/10.0/en-US/Working_with_SAP_Business_One_Service_Layer.pdf" - "https://help.sap.com/doc/089315d8d0f8475a9fc84fb919b501a3/10.0/en-US/SDKHelp/SAPbobsCOM~SpecialPrices.html" - "https://docs.medusajs.com/learn/fundamentals/modules" - "https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function" - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers" - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks" - "https://docs.medusajs.com/learn/fundamentals/scheduled-jobs" - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://docs.medusajs.com/resources/commerce-modules/inventory/concepts" --- # How to integrate SAP Business One with Medusa > Medusa has no prebuilt SAP Business One connector. You build a custom Medusa module that calls the SAP Business One Service Layer, an OData API, then sync items, stock, prices, business partners, and orders with Medusa workflows, subscribers, and scheduled jobs. From 10.0 FP 2602, Service Layer webhooks can push SAP changes to Medusa. ## Does Medusa have an SAP Business One connector? Medusa has no first-party SAP Business One connector and no SAP Business One guide. You integrate SAP Business One by writing a custom Medusa module that calls the SAP Business One Service Layer, then running it from workflows, subscribers, and scheduled jobs. The general [Medusa ERP integration recipe](https://docs.medusajs.com/resources/recipes/erp) shows each of these patterns with example code. Everything SAP-specific in this entry is Custom work. ## Which SAP Business One API to use from Medusa The SAP Business One Service Layer is a web API server that exposes SAP Business One business objects over HTTP and OData. It is the API to call from a Node.js application like Medusa. - **Protocol.** OData version 3 at `/b1s/v1` and OData version 4 at `/b1s/v2`. Both support CRUD with GET, POST, PATCH, and DELETE, plus OData query options such as `$filter`, `$select`, and `$top`. - **Session login.** You POST `CompanyDB`, `UserName`, and `Password` to `/b1s/v1/Login`. The response sets a `B1SESSION` cookie that you send on every later request. The sample session timeout is 30 minutes, so your module must log in again when a session expires. - **Batch.** The Service Layer supports batch requests, which helps when you sync many items at once. - **Webhooks.** As of SAP Business One 10.0 FP 2602, the Service Layer supports webhooks. You enable them per company, create an event subscription (for example, on `Orders` created), and the Webhook Messenger Service delivers notifications with retries. The Service Layer runs on your SAP Business One server; SAP's examples use port 50000. Your Medusa backend needs network access to it, and SAP needs network access to Medusa if you use webhooks. ## How SAP Business One data maps to Medusa Each row is a sync you build in your SAP Business One module. The Medusa side of every row uses native commerce modules. | SAP Business One object | Medusa equivalent | Direction | Status | | --- | --- | --- | --- | | Items | Products and product variants (Product Module) | SAP to Medusa | Custom | | Item warehouse info (stock per warehouse) | Inventory levels per stock location (Inventory Module) | SAP to Medusa | Custom | | Price lists and special prices for business partners | Price lists with customer group rules (Pricing Module), or a live price lookup in add-to-cart | SAP to Medusa | Custom | | Business partners (customers) | Customers and customer groups (Customer Module) | Both | Custom | | Orders (sales orders) | Orders (Order Module) | Medusa to SAP | Custom | | Order status and deliveries | Order updates | SAP to Medusa | Custom | Store the SAP key, such as `ItemCode` or `CardCode`, on the Medusa record, for example in `metadata` or the product's `external_id`, so later syncs can match records. ## Real-time vs scheduled sync with SAP Business One Medusa supports both timing models with built-in tools. Your SAP Business One version decides how SAP changes reach Medusa. - **Real-time, Medusa to SAP.** A [subscriber](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) on `order.placed` runs a workflow that creates the sales order through the Service Layer. - **Real-time, inside checkout.** A [workflow hook](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) on `addToCartWorkflow` checks warehouse stock or purchase rules in SAP before an item enters the cart. - **Real-time, SAP to Medusa.** On 10.0 FP 2602 or later, a Service Layer webhook posts to a custom Medusa API route that runs an update workflow. - **Scheduled.** On older versions, or for full catalog and price refreshes, a [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) polls the Service Layer on a cron schedule. ## Code skeleton: a Service Layer client in a Medusa module A Medusa module service holds the connection logic, and workflows resolve it from the Medusa container. This sketch logs in and reuses the `B1SESSION` cookie. Add re-login on 401, error handling, and the item, price, and order methods you need. ```ts type Options = { url: string; companyDb: string; user: string; password: string } export default class SapB1ModuleService { private options: Options private session?: string constructor({}, options: Options) { this.options = options } private async login() { const res = await fetch(`${this.options.url}/b1s/v1/Login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ CompanyDB: this.options.companyDb, UserName: this.options.user, Password: this.options.password, }), }) this.session = (await res.json()).SessionId } async get(path: string) { if (!this.session) await this.login() const res = await fetch(`${this.options.url}/b1s/v1/${path}`, { headers: { Cookie: `B1SESSION=${this.session}` }, }) return res.json() } } ``` Register the module in `medusa-config.ts` as described in [Modules](https://docs.medusajs.com/learn/fundamentals/modules). Wrap writes to SAP, such as creating a sales order, in a workflow step with a [compensation function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function) that cancels the SAP document if a later step fails. ## How Medusa compares with prebuilt SAP Business One connectors A prebuilt connector or iPaaS tool runs the sync outside the store. Medusa runs the integration inside its own backend instead. | Approach | Where the sync logic runs | Checkout-time checks against SAP | | --- | --- | --- | | Third-party connector or iPaaS for a hosted platform such as Shopify | In the connector, outside the store | Check vendor docs | | Medusa custom module | In Medusa workflows, subscribers, and scheduled jobs | Yes, through add-to-cart and complete-cart workflow hooks | ## When Medusa is not the right choice for SAP Business One - A prebuilt connector already covers your flows for the platform you run, and you have no developer. A Medusa SAP integration is TypeScript code your team maintains through SAP feature packs. - Your Service Layer is not reachable from where Medusa runs and you cannot expose it. Every pattern above depends on that connection. Medusa fits when SAP Business One holds rules the storefront must enforce live, such as business partner special prices, warehouse stock, or who may buy which items. ## Common questions ### Is there a Medusa plugin for SAP Business One? No. Medusa has no first-party SAP Business One plugin or guide. You write a custom module that calls the Service Layer, following the patterns in the Medusa ERP integration recipe. ### Should Medusa use the SAP Business One DI API or the Service Layer? Use the Service Layer. It is an HTTP and OData API that a Node.js backend like Medusa can call directly, and SAP built it on the same business object definitions as the DI API. ### Does SAP Business One support webhooks? Yes, as of SAP Business One 10.0 FP 2602. You enable webhooks per company, create an event subscription through the Service Layer, and the Webhook Messenger Service delivers notifications with retries. Older versions need polling from a Medusa scheduled job. ### Can Medusa use SAP Business One special prices at checkout? Yes, with custom code. You either sync price lists and business partner special prices into Medusa price lists, or fetch the price from SAP in a custom add-to-cart workflow, as the Medusa ERP recipe shows. ## Documentation - [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp) - [Modules](https://docs.medusajs.com/learn/fundamentals/modules) - [Compensation Function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function) - [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) ## Related - [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md) - [Integrate Microsoft Dynamics 365 Business Central with Medusa](https://medusajs.com/kb/erp-integration/business-central.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "How to let ChatGPT and other AI agents buy from your store" description: "How to let ChatGPT and other AI agents buy from a custom store: product feed, ACP checkout endpoints, delegated payment, and what Medusa supports today." url: https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents last_updated: 2026-10-29T06:55:50Z topic: "agentic-commerce" type: "how-to" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md" - "https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents.md" - "https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md" sources: - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce" - "https://developers.openai.com/commerce/guides/key-concepts" - "https://developers.openai.com/commerce/guides/get-started" - "https://developers.openai.com/commerce/specs/file-upload/overview" - "https://developers.openai.com/commerce/specs/checkout" - "https://developers.openai.com/commerce/guides/production" - "https://agenticcommerce.dev/" - "https://developers.google.com/merchant/ucp" - "https://ucp.dev/" - "https://docs.stripe.com/agentic-commerce" - "https://shopify.dev/docs/agents" - "https://docs.medusajs.com/cloud/medusa-mcp" --- # How to let ChatGPT and other AI agents buy from your store > To let ChatGPT buy from a custom store, implement OpenAI's Agentic Commerce Protocol (ACP): a product feed, checkout session endpoints, delegated payment, and order webhooks. Google AI Mode and Gemini use UCP with AP2 instead. Medusa has an official ACP guide with example code; UCP and AP2 are custom work today. ## What does an AI agent need from your store to buy from it? An AI agent needs three layers from a store before it can complete a purchase: discovery, checkout, and payment. Each AI platform defines these layers in its own protocol. Selling through an assistant means implementing the protocol that assistant uses. | Layer | What it does | ChatGPT (ACP) | Google AI Mode and Gemini (UCP) | | --- | --- | --- | --- | | Discovery | The agent finds products, prices, and stock | Product feed sent to OpenAI | Catalog capability and Merchant Center shopping feeds | | Checkout | The agent builds a cart and places the order | Agentic Checkout Spec endpoints on your backend | UCP checkout capability over REST or MCP | | Payment | The agent hands over a scoped payment credential | Delegated Payment Spec, such as a Stripe Shared Payment Token | AP2 payment mandates | Assistants that support the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro), such as Claude and ChatGPT, can also call tools that a store exposes through an MCP server. MCP is a general tool protocol, not a checkout standard. ## Before you start - A Medusa v2 application with published products, a region, and a sales channel. - The [Stripe Payment Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe). Medusa's ACP guide notes that ChatGPT currently supports only Stripe as a payment provider. - Approval from OpenAI. Product feed onboarding in ChatGPT is open to approved partners, who apply at [chatgpt.com/merchants](https://chatgpt.com/merchants). - Public privacy policy and terms of service URLs. OpenAI's feed spec requires them for checkout eligibility. ## 1. Publish a product feed The product feed is how ChatGPT indexes your catalog. OpenAI's [file upload spec](https://developers.openai.com/commerce/specs/file-upload/overview) takes full catalog snapshots over SFTP, in parquet, jsonl.gz, csv.gz, or tsv.gz, at least once a day. In Medusa, you build the feed in a [workflow](https://docs.medusajs.com/learn/fundamentals/workflows) that reads products, prices, and inventory, and run it from a [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs). Medusa's [ACP guide](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) shows this pattern, but its upload step only logs the feed. You write the delivery code once OpenAI gives you access. ## 2. Add the checkout session endpoints OpenAI's [Agentic Checkout Spec](https://developers.openai.com/commerce/specs/checkout) defines the REST endpoints ChatGPT calls on your backend. In Medusa, each one is a custom API route that runs a workflow over Medusa's cart: - `POST /checkout_sessions` creates a cart with the requested items. - `POST /checkout_sessions/{id}` updates items, the address, or the shipping option. - `GET /checkout_sessions/{id}` returns the current state. - `POST /checkout_sessions/{id}/complete` completes the cart and creates the order. - `POST /checkout_sessions/{id}/cancel` cancels the session. ## 3. Authenticate and verify every request ChatGPT sends a bearer token and a `Signature` header with each checkout request. The Medusa guide adds a middleware that checks the token against a Medusa secret API key and verifies the signature with HMAC-SHA256, using the signing key OpenAI issues. ## 4. Charge the delegated payment OpenAI's [Delegated Payment Spec](https://developers.openai.com/commerce/specs/payment) passes your payment provider a one-time token with a maximum amount and an expiry. [Stripe's Shared Payment Token](https://docs.stripe.com/agentic-commerce) is the first compatible implementation. The Medusa guide passes this token to the Stripe provider when it completes the cart. ## 5. Send order webhooks ChatGPT tracks order status through webhooks you send. The Medusa guide uses a [subscriber](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) on `order.placed` and `order.updated` to post these events. ## 6. Pass certification and go live OpenAI's [production guide](https://developers.openai.com/commerce/guides/production) lists sandbox tests to complete before launch: sessions with and without an address, shipping updates, payment tokens, order completion, signed webhooks, errors, and idempotency. You stay the merchant of record and handle refunds and chargebacks. ## Which agentic commerce protocols does Medusa support? Medusa's support for agentic commerce protocols today: | Protocol | Used by | Status | What exists | | --- | --- | --- | --- | | ACP | ChatGPT Instant Checkout | Official guide | Tutorial with example code; feed delivery is a stub | | UCP | Google AI Mode and Gemini | Custom | No guide; build on API routes and workflows | | AP2 | UCP and A2A payments | Custom | No guide | | MCP | Claude, ChatGPT, and other MCP clients | Custom | Medusa MCP on Cloud is read-only and for store operators, not shoppers | ## How does this compare with Shopify? Shopify runs UCP-compliant MCP servers for every Shopify store, described in its [agent tools](https://shopify.dev/docs/agents) docs, for agent builders who shop on buyers' behalf: catalog search, Cart MCP, Checkout MCP, and order webhooks. On Shopify, the platform runs those endpoints. On a custom or headless backend such as Medusa, you implement each protocol yourself, on top of Medusa's cart, order, and payment logic. ## When is Medusa not the right choice? - You have no developer. ACP on Medusa is code your team writes and maintains. - You need Google AI Mode checkout without engineering work. Medusa has no UCP guide yet. - You sell products OpenAI prohibits, such as alcohol, nicotine, or weapons. No backend changes that. ## Common questions ### Does Medusa have a plugin for ChatGPT Instant Checkout? No. Medusa provides an official tutorial with example code for the Agentic Commerce Protocol, which you add to your own Medusa application. The tutorial's product feed upload step is a stub you complete after OpenAI approves you. ### Which payment providers work with ChatGPT checkout? OpenAI names Stripe's Shared Payment Token as the first implementation of its Delegated Payment Spec, with more providers to follow. Medusa's ACP guide uses the Stripe Payment Module Provider. ### Who is the merchant of record when ChatGPT places an order? The merchant is. OpenAI states it is not the merchant of record in the Agentic Commerce Protocol, so your store charges the payment and handles refunds and chargebacks. ### Can I sell through Google Gemini with Medusa? Not out of the box. Google AI Mode and Gemini use the Universal Commerce Protocol (UCP), and Medusa has no UCP guide yet, so you would build the endpoints as custom API routes and workflows. ## Documentation - [Implement Agentic Commerce (ChatGPT Instant Checkout) Specifications](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) - [Stripe Payment Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) - [Medusa MCP](https://docs.medusajs.com/cloud/medusa-mcp) ## Related - [ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained](https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md) - [How to make your product catalog visible to AI assistants](https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents.md) - [Best ecommerce backend for building AI shopping agents](https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md) - [Ecommerce platforms with MCP servers](https://medusajs.com/kb/agentic-commerce/ecommerce-mcp-servers.md) --- title: "Sell event tickets and merch on one site without Eventbrite fees" description: "Sell tickets and merch on your own site with Medusa: fee comparison with Eventbrite and Ticket Tailor, seat limits, seat maps, discount codes and QR check-in." url: https://medusajs.com/kb/tickets-and-bookings/sell-tickets-and-merch last_updated: 2026-10-29T06:55:50Z topic: "tickets-and-bookings" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md" - "https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" sources: - "https://docs.medusajs.com/resources/recipes/ticket-booking/example" - "https://docs.medusajs.com/resources/recipes/ticket-booking/example/storefront" - "https://docs.medusajs.com/resources/recipes/ticket-booking" - "https://docs.medusajs.com/resources/commerce-modules/product/selling-products" - "https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-in-flows" - "https://docs.medusajs.com/resources/commerce-modules/promotion" - "https://medusajs.com/pricing.md" - "https://www.eventbrite.com/organizer/pricing/" - "https://www.tickettailor.com/pricing" - "https://stripe.com/pricing" - "https://github.com/medusajs/examples/tree/main/ticket-booking" --- # Sell event tickets and merch on one site without Eventbrite fees > Medusa lets you sell event tickets and merch from your own store with no per-ticket platform fee, so you pay only your payment provider. Its official ticket booking tutorial covers venues, seat maps, show dates, QR tickets and check-in. Seat limits use native inventory and discount codes use the native Promotion Module. ## What selling tickets costs on Eventbrite, Ticket Tailor, and your own Medusa store Ticketing platforms charge a fee on every paid ticket, on top of card processing. A store you run on Medusa charges no per-ticket platform fee, so you pay only your payment provider and your hosting. The figures below are from each vendor's own pricing page, as of October 2026. | Option | Platform fee per paid ticket | Payment processing | Notes | | --- | --- | --- | --- | | Eventbrite (US) | 3.7% + $1.79 service fee | 2.9% per order | Buyers pay the fees by default; organizers can absorb them | | Ticket Tailor | £0.60 pay as you go, from £0.22 with prepaid credits (ex. VAT) | Separate, charged by your Stripe, PayPal, or Square account | The pricing page lists fees in GBP | | Your own store on Medusa | None | Your provider's rate, for example Stripe US cards at 2.9% + 30¢ | Self-host for free (MIT-licensed core) or use Medusa Cloud from $29/month with a 0% GMV fee | For a $40 ticket, Eventbrite's service fee is $3.27 (3.7% of $40 plus $1.79) before processing. On Medusa with Stripe, a single $40 order costs $1.46 in Stripe fees and nothing else per ticket. The trade-off is that you build and run the store, while Eventbrite also brings event discovery and a ready-made checkout. ## How ticketing features map to Medusa Medusa has no built-in ticketing product type. The official [ticket booking tutorial](https://docs.medusajs.com/resources/recipes/ticket-booking/example) builds a Ticket Booking module on top of Medusa's products, inventory, carts, and orders, with [full code on GitHub](https://github.com/medusajs/examples/tree/main/ticket-booking). | Ticketing term | What it means | How Medusa does it | Status | | --- | --- | --- | --- | | Seat limits, capacity | No more tickets than seats per show | One variant per show date and row type, with inventory set to the row's seat count | Native | | Seat map, reserved seating | Buyers pick a specific seat | Venue and row models with seat counts, seat numbers stored on each ticket purchase, and a seat chart in the Next.js Starter Storefront | Official guide | | Discount codes | Promo codes, early-bird pricing | Promotion Module: percentage or fixed discounts, rules, and campaigns with budgets | Native | | QR tickets and check-in | Scannable ticket at the door | QR codes in the order confirmation email and a verify route that marks a ticket as scanned | Official guide | | Double booking prevention | A seat sells once per show | Validation when a seat is added to the cart and again when the cart completes | Official guide | | Tickets and merch in one cart | One checkout for both | Supported by Medusa's cart; the tutorial's checkout needs changes | Custom | ## What changes when you add merch to the ticket checkout The ticket booking tutorial builds a ticket-only checkout. Its storefront removes the shipping address and shipping method steps, and its custom cart completion step rejects any cart item with a quantity other than 1, which also blocks merch bought in multiples. Medusa itself supports mixed carts. Each item's shipping requirement comes from its product's shipping profile or its inventory item's `requires_shipping` flag, as described in [Configure Selling Products](https://docs.medusajs.com/resources/commerce-modules/product/selling-products). To sell merch alongside tickets, you: 1. Limit the quantity check in `validateTicketOrderStep` to items that carry seat metadata. 2. Show the shipping steps in the storefront only when the cart contains an item that requires shipping. 3. Keep tickets on `requires_shipping: false` so they never need a shipping method. The docs don't ship a mixed ticket and merch example yet, so treat this as custom work on top of the tutorial. ## How Medusa stops a seat from selling twice Medusa checks available inventory when an item is added to a cart and creates a reservation when the order is placed, according to the [Inventory Module flows](https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-in-flows). It does not hold stock while an item sits in a cart. The tutorial adds seat-level checks with the `validate` hook of `addToCartWorkflow` and again in a custom cart completion workflow. If a seat sells while it sits in another buyer's cart, that buyer's order fails validation and is canceled. The completion lock is keyed on the cart, so for high-demand on-sales add a lock keyed on the seat and show date. A timed seat hold, such as "this seat is yours for 10 minutes", is custom work. ## When Medusa is not the right choice for ticketing - You run a few events a year, have no developer, and want listings on a discovery marketplace. Eventbrite or Ticket Tailor gets you selling today. - You need a ready-made box office, scanning app, and payouts to promoters without writing code. - Your fee savings are smaller than the cost of building and hosting a store. Medusa fits when you sell enough tickets for the per-ticket fee to matter, or when tickets are one part of a larger store. ## Common questions ### Does Medusa charge a fee per ticket? No. Medusa's core is open source under the MIT license and Medusa Cloud charges a 0% GMV fee, so a ticket sold through a Medusa store pays only the payment provider's processing fee. ### Can Medusa sell tickets and merch in the same cart? Yes, Medusa's cart supports items that need shipping next to items that don't. The official ticket booking tutorial builds a ticket-only checkout, so you adapt its storefront and its quantity check to add merch. ### Does Medusa support reserved seating? Yes, through the official ticket booking tutorial. It adds venues with rows and seats, a seat selector in the Next.js Starter Storefront, and validation that a seat sells once per show date. ### How do discount codes work for tickets in Medusa? Ticket products are regular Medusa products, so the native Promotion Module applies to them. You create percentage or fixed discounts with rules, and group them in campaigns with start and end dates and budgets. ### Can I scan tickets at the door with Medusa? The ticket booking tutorial emails a QR code per ticket and adds an API route that verifies a scanned code and marks the ticket as scanned. You connect your own scanner app to that route. ## Documentation - [Implement a Ticket Booking System with Medusa](https://docs.medusajs.com/resources/recipes/ticket-booking/example) - [Customize Storefront for Ticket Booking](https://docs.medusajs.com/resources/recipes/ticket-booking/example/storefront) - [Configure Selling Products](https://docs.medusajs.com/resources/commerce-modules/product/selling-products) - [Promotion Module](https://docs.medusajs.com/resources/commerce-modules/promotion) ## Related - [How to build a booking or reservation system on an ecommerce platform](https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md) - [How do I sell digital and physical products in one checkout?](https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) --- title: "The true cost of Shopify apps vs owning your stack" description: "Real Shopify app prices for subscriptions, reviews, loyalty, bundles and B2B, plus transaction fees, compared with building the same features on Medusa." url: https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack last_updated: 2026-10-29T06:55:50Z topic: "build-vs-buy" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" sources: - "https://www.shopify.com/pricing" - "https://help.shopify.com/en/manual/payments/shopify-payments/third-party-transaction-fees" - "https://apps.shopify.com/subscription-payments" - "https://apps.shopify.com/skio" - "https://apps.shopify.com/shopify-subscriptions" - "https://apps.shopify.com/judgeme" - "https://apps.shopify.com/yotpo-social-reviews" - "https://apps.shopify.com/smile-io" - "https://apps.shopify.com/shopify-bundles" - "https://apps.shopify.com/simple-bundles" - "https://apps.shopify.com/sparklayer" - "https://apps.shopify.com/wholesale-gorilla" - "https://medusajs.com/pricing.md" - "https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-kit" - "https://docs.medusajs.com/resources/commerce-modules/pricing/concepts" - "https://github.com/medusajs/b2b-starter" - "https://medusajs.com/blog/healthletic.md" --- # The true cost of Shopify apps vs owning your stack > Paid Shopify app plans for subscriptions, reviews, loyalty, bundles, and B2B run from $15 to $599 per month each, and some add per-transaction fees. Owning your stack with Medusa replaces those apps with modules you build once, guided by official tutorials, on Medusa Cloud from $29 per month with a 0% GMV fee. Developer time is the trade-off. ## Where Shopify app costs come from A Shopify store's running cost has three layers: the Shopify plan, the apps you install, and fees charged on sales. Apps are often the layer founders underestimate, because each one looks cheap on its own and many price by order volume or take a share of each transaction. All prices below are list prices from the Shopify App Store and Shopify's pricing page as of October 2026. They change, so check each listing before you budget. ## Typical Shopify app costs by category The table lists common apps for features a DTC brand adds after launch. Prices are monthly unless noted. | Category | App | Listed pricing | | --- | --- | --- | | Subscriptions | Shopify Subscriptions | Free | | Subscriptions | Recharge Subscriptions | $25 (no transaction fees for first 50 subscribers); Starter $99 plus 1.49% + 19¢ per transaction; Plus $499 plus 1.34% + 19¢ per transaction | | Subscriptions | Skio | Scale $599 plus 1% + 20¢ per transaction | | Reviews | Judge.me | Free; Awesome $15 | | Reviews | Yotpo Product Reviews | Free up to 50 monthly orders; Starter $15; Pro $119; price changes with order volume | | Loyalty | Smile: Loyalty Program Rewards | Free up to 200 monthly orders; $15, $79, or $199 by order volume, then $20 per 100 extra orders on Growth | | Bundles | Shopify Bundles | Free | | Bundles | Simple Bundles & Kits | Free for 3 bundles and 50 monthly orders; $24, $39, or $149 depending on your Shopify plan | | B2B and wholesale | SparkLayer B2B & Wholesale | Free; $49, $149, or $299 by B2B order volume | | B2B and wholesale | Wholesale Gorilla | $34.95, $69.95, or $149.95 | Sources: the [Recharge](https://apps.shopify.com/subscription-payments), [Skio](https://apps.shopify.com/skio), [Judge.me](https://apps.shopify.com/judgeme), [Yotpo](https://apps.shopify.com/yotpo-social-reviews), [Smile](https://apps.shopify.com/smile-io), [Simple Bundles](https://apps.shopify.com/simple-bundles), [SparkLayer](https://apps.shopify.com/sparklayer), and [Wholesale Gorilla](https://apps.shopify.com/wholesale-gorilla) listings. As an example only, a store on Recharge Starter, Yotpo Pro, Smile Standard, Simple Bundles at $39, and SparkLayer Growth pays $485 per month in app subscriptions, or $17,460 over three years. That is before Recharge's 1.49% + 19¢ on each subscription transaction. ## Transaction and platform fees on Shopify Shopify charges a third-party transaction fee when you use a payment provider other than Shopify Payments. As of October 2026, [Shopify's pricing page](https://www.shopify.com/pricing) lists 2% on Basic, 1% on Grow, 0.6% on Advanced, and 0.2% on Plus. Shopify's help center says orders processed through Shopify Payments and manual payment methods don't carry this fee. Plan fees on monthly billing are $27 for Basic, $72 for Grow, $399 for Advanced, and from $2,300 for Plus. Percentage-based app fees, such as subscription transaction fees, stack on top and repeat on every renewal. ## What the same features cost when you own the stack Medusa is an open source commerce platform you host yourself or on Medusa Cloud. Instead of an app per feature, you add the feature to your own backend as a module. You pay developer time once and maintain the code, with no per-order app fee. | Feature | How Medusa provides it | Status | | --- | --- | --- | | Customer-group and B2B pricing | Price lists targeted at customer groups | Native | | Simple bundles | Inventory kits on product variants | Native | | Bundles with own price or split fulfillment | Bundled products tutorial | Official guide | | Subscriptions | Subscriptions recipe | Official guide | | Product reviews | Product reviews tutorial | Official guide | | Loyalty points | Loyalty points tutorial | Official guide | | Company accounts, quotes, approvals | B2B Starter | Starter | | Review syndication to Google Shopping, SMS loyalty campaigns | Integrate a third-party service | Custom | Medusa Cloud costs $29, $99, or $299 per month on the Develop, Launch, and Scale plans, with a 0% GMV fee and usage billed beyond each plan's limits ([Medusa Cloud pricing](https://medusajs.com/pricing)). You still pay your payment provider's processing fees. ## How to compare the two honestly Owning the stack replaces app fees with developer time. Put both on the same sheet: 1. List every app you pay for, with its monthly fee and any per-transaction fee at your volume. 2. Add Shopify's plan fee and, if you don't use Shopify Payments, the third-party transaction fee on your sales. 3. On the Medusa side, add the Medusa Cloud plan and expected usage, plus D (build time for each replaced app) and M (yearly maintenance). 4. Compare over three years, since build cost is paid upfront and fees recur. Shopify apps are the cheaper path when your apps are free or low tier and you have no developer. Owning the stack pays off when percentage-based fees grow with revenue, as they do for subscription brands. Healthletic, a subscription brand, paid $25,000 per month in Shopify Plus platform and transaction fees before moving to Medusa and building subscriptions as its own module, according to [Medusa's Healthletic case study](https://medusajs.com/blog/healthletic). ## Common questions ### How much does Recharge cost on Shopify? As of October 2026, the Recharge Subscriptions listing on the Shopify App Store shows a $25 per month plan with no transaction fees for the first 50 subscribers, Starter at $99 per month plus 1.49% + 19¢ per transaction, and Plus at $499 per month plus 1.34% + 19¢ per transaction. ### Does Medusa have subscriptions built in? No. Medusa core has no Subscription Module, but the official subscriptions recipe shows how to build one as a custom module with scheduled renewals, and the full example code is published. ### Does Medusa have an app store like Shopify? Medusa has an integrations directory and plugins, but most features covered by Shopify apps are built as modules in your own project, often by following an official tutorial. ### Do I still pay payment processing fees with Medusa? Yes. Medusa Cloud charges no GMV fee, but your payment provider, such as Stripe, charges its own processing fees. ## Documentation - [Subscriptions recipe](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard) - [Product reviews tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-reviews) - [Bundled products tutorial](https://docs.medusajs.com/resources/recipes/bundled-products/examples/standard) - [Loyalty points tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/loyalty-points) - [Price lists](https://docs.medusajs.com/user-guide/price-lists) ## Related - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) --- title: "Shopify B2B alternatives for teams that can write code" description: "Shopify B2B limits by plan, what B2B apps cost, and how Medusa, BigCommerce B2B, OroCommerce, Adobe Commerce B2B and Vendure compare for dev teams." url: https://medusajs.com/kb/b2b/shopify-b2b-alternatives last_updated: 2026-10-29T06:55:50Z topic: "b2b" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md" - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md" - "https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md" - "https://medusajs.com/kb/b2b/b2b-quotes-rfq.md" sources: - "https://help.shopify.com/en/manual/b2b/getting-started/plan-features" - "https://help.shopify.com/en/manual/b2b/getting-started/features" - "https://www.shopify.com/pricing" - "https://apps.shopify.com/sparklayer" - "https://apps.shopify.com/wholesale-gorilla" - "https://apps.shopify.com/b2b-solution-custom-pricing" - "https://medusajs.com/pricing" - "https://github.com/medusajs/b2b-starter" - "https://www.bigcommerce.com/b2b-ecommerce/" - "https://doc.oroinc.com/user/back-office/customers/customers/customer-price-lists/" - "https://doc.oroinc.com/user/back-office/sales/rfq/" - "https://doc.oroinc.com/user/back-office/sales/payment-terms/" - "https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction" - "https://vendure.io/pricing" --- # Shopify B2B alternatives for teams that can write code > For teams that can write code, the main Shopify B2B alternatives are Medusa, BigCommerce B2B, OroCommerce, Adobe Commerce B2B and Vendure. Medusa's core is open source (MIT) with no GMV fee, and its B2B starter adds companies, approvals and quotes. Shopify B2B limits non-Plus plans to 3 catalogs and reserves per-company catalogs for Shopify Plus. ## What Shopify B2B includes on each plan Shopify B2B is available on the Basic, Grow, Advanced and Shopify Plus plans, and not on Starter or Retail. According to [Shopify's plan comparison](https://help.shopify.com/en/manual/b2b/getting-started/plan-features), most B2B features work on every one of those plans. The limits that push teams to look elsewhere are on pricing and payments: | Shopify B2B feature | Basic, Grow, Advanced | Shopify Plus | | --- | --- | --- | | Active B2B catalogs | Up to 3 across all B2B markets | Unlimited | | Catalog assigned directly to a company or location | No | Yes | | Net terms, PO numbers, quick order lists | Yes | Yes | | Deposits, partial payments, payment per fulfillment | No | Yes | | Contextual checkout and storefront | Advanced only | Yes | [Shopify's pricing page](https://www.shopify.com/pricing) lists Basic at $27, Grow at $72 and Advanced at $399 per month when billed monthly, and Shopify Plus from $2,300 per month (October 2026, USD). ## What B2B apps cost on Shopify Quotes, approvals and richer wholesale portals usually come from apps. Listed prices on the Shopify App Store in October 2026: - **SparkLayer B2B & Wholesale**: free to $299 per month. Quoting and API access are on the $299 Pro plan, which caps B2B orders at 150 per month. - **Wholesale Gorilla**: $34.95 to $149.95 per month. - **BSS B2B Wholesale Pricing**: free to $99 per month. These fees come on top of the Shopify plan, and some app plans cap the number of B2B orders per month. ## Shopify B2B alternatives compared Each row uses the vendor's own site. Medusa statuses: **Native** (core), **Starter** (B2B starter), **Official guide** (docs with example code), **Custom** (you build it). | Platform | Model | Company accounts | Quotes / RFQ | Per-customer pricing | Price | | --- | --- | --- | --- | --- | --- | | Medusa | Open source (MIT core), self-host or Medusa Cloud | Starter | Starter, Official guide | Native (price lists per customer group) | Free self-hosted; Medusa Cloud from $29/month, 0% GMV fee | | BigCommerce B2B | SaaS | Yes, with buyer roles | Yes (built-in quoting) | Yes (buyer-specific pricing) | Check vendor docs | | OroCommerce | B2B commerce platform | Yes (customers and customer users) | Yes (RFQ and quotes) | Yes (price list per customer) | Check vendor docs | | Adobe Commerce B2B | B2B extension for Adobe Commerce | Yes, with company hierarchy | Yes (negotiable quotes) | Yes (shared catalogs) | Check vendor docs | | Vendure | Open-source foundation with paid plans | Yes, from Starter plan | Quote requests from Starter; negotiation on Enterprise | Contract pricing on Scale plan | €199 to €2,499/month; Enterprise from €60,000/year | ## Why teams that write code choose Medusa for B2B Medusa is a commerce platform with a built-in framework for customization. For B2B, that means: - **No catalog cap.** Price lists with `customer.groups.id` rules, price rules and quantity tiers are part of the open-source Pricing Module, with no plan gate. - **B2B starter.** The [Medusa B2B starter](https://github.com/medusajs/b2b-starter) adds companies, employees, spending limits, approval workflows, quote management and bulk add-to-cart. - **Custom logic in workflows.** Net terms, credit limits and ERP prices are code in your repo, built with Medusa workflows, modules and API routes. See the [ERP recipe](https://docs.medusajs.com/resources/recipes/erp). - **Predictable cost.** [Medusa Cloud](https://medusajs.com/pricing) plans start at $29 per month with a 0% GMV platform fee and no limits on orders or products. ## When to stay on Shopify B2B - You have no developer. Medusa expects code for company accounts, storefront changes and integrations. - Your pricing fits in 3 catalogs and you don't need per-company catalogs. Shopify's non-Plus plans cover net terms, PO numbers, volume pricing and quick order lists without custom work. - You already pay for Shopify Plus and its B2B features cover your workflows. ## Common questions ### Which Shopify plans include B2B? According to Shopify's Help Center, Shopify B2B is available on the Basic, Grow, Advanced and Shopify Plus plans, and not on Starter or Retail. Non-Plus plans are limited to 3 active B2B catalogs. ### Is Medusa free for B2B? Medusa's core is open source under the MIT license, so self-hosting has no license fee. Medusa Cloud, the managed hosting option, starts at $29 per month with a 0% GMV platform fee. ### Does Medusa have quotes and company accounts for B2B? Yes, through the Medusa B2B starter, which adds companies, employees, spending limits, approval workflows and quote management on top of Medusa's core modules. Medusa's docs also include a quote management guide. ### Can I migrate from Shopify to Medusa? Yes. Medusa's Docs MCP server has a Shopify migration tool that imports catalog data such as products, variants, prices, inventory and collections. B2B setup such as companies and price lists is rebuilt with the Medusa B2B starter and Pricing Module. ## Documentation - [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b) - [Implement quote management in Medusa](https://docs.medusajs.com/resources/examples/guides/quote-management) - [Price Tiers and Rules](https://docs.medusajs.com/resources/commerce-modules/pricing/price-rules) - [ERP recipe](https://docs.medusajs.com/resources/recipes/erp) - [Migrate from Shopify to Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify) ## Related - [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md) - [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md) - [Net terms, purchase orders and bulk ordering for B2B](https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering.md) - [B2B quotes and RFQ: how quote-to-order works](https://medusajs.com/kb/b2b/b2b-quotes-rfq.md) --- title: "Should I use Shopify or build a custom store?" description: "Shopify or a custom store for a DTC brand? A decision guide with when Shopify wins, when Medusa fits, and a 3-year cost table with verified plan prices." url: https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store last_updated: 2026-10-29T06:55:50Z topic: "build-vs-buy" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md" - "https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md" sources: - "https://www.shopify.com/pricing" - "https://shopify.dev/docs/storefronts/headless/hydrogen" - "https://shopify.dev/docs/storefronts/headless/legacy/hydrogen/fundamentals" - "https://www.shopify.com/plus/pricing" - "https://shopify.dev/docs/api/functions" - "https://medusajs.com/pricing.md" - "https://medusajs.com/blog/healthletic.md" - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify" --- # Should I use Shopify or build a custom store? > Use Shopify if you have no developer, a standard catalog, and need to sell fast. Build on a commerce framework like Medusa when your edge is custom product logic, subscriptions without per-transaction app fees, owned data, or AI features. Medusa Cloud starts at $29 per month with a 0% GMV fee; developer time is the main extra cost. ## Shopify or a custom store: the three real options "Custom store" rarely means writing commerce from scratch. A technical founder launching a DTC brand is choosing between three options: | Option | What you run | Who owns the backend logic | | --- | --- | --- | | Shopify with a theme | Shopify admin, checkout, theme, apps | Shopify and app vendors | | Shopify with Hydrogen | Your React storefront on Shopify's backend | Shopify and app vendors | | Commerce framework (Medusa) | Your storefront and your Medusa backend | You | [Hydrogen](https://shopify.dev/docs/storefronts/headless/hydrogen) is Shopify's headless toolkit for building your own storefront, and Oxygen is Shopify's storefront hosting. Shopify's developer docs say Oxygen is available at no extra charge on paid plans. Hydrogen changes the frontend only: products, checkout, plan fees, and apps stay on Shopify. Medusa is an open source commerce platform (MIT, except its Enterprise Edition RBAC and SSO features) with a framework for custom modules, workflows, and API routes. It ships commerce modules for products, carts, orders, pricing, inventory, and payments, plus an admin dashboard. You host it yourself or on [Medusa Cloud](https://medusajs.com/pricing). ## When Shopify is the right call Shopify is the better choice for many DTC launches. Stay on Shopify if most of these are true: - You have no developer on the team and don't plan to hire one. - Your catalog and checkout are standard: physical products, fixed prices, normal shipping. - Speed to first sale matters more than control, and you want themes, POS, and marketplace channels on day one. - You are fine using Shopify Payments, which avoids Shopify's third-party transaction fee. - Your app needs are covered by free or low-cost apps. A Medusa build costs developer time before the first order. If the business is still validating demand, that time is usually better spent on product and marketing. ## When a Medusa store is the better fit Medusa fits when the differentiator lives in the backend logic, not just the design: - **Custom product logic**: configurators, bundles with separate fulfillment, rentals, or pre-orders. Medusa has [official tutorials](https://docs.medusajs.com/resources/how-to-tutorials) for each. - **Subscriptions without per-transaction app fees**: the [subscriptions recipe](https://docs.medusajs.com/resources/recipes/subscriptions) builds renewals as a custom module, so there is no app-level fee per renewal. - **Owning your data and code**: Medusa Cloud lets you export your data and move to self-hosting later. - **Checkout control**: you build the checkout and choose payment providers. On Shopify, full checkout customization is listed for Plus only, and only Plus stores can use custom apps that contain [Shopify Functions](https://shopify.dev/docs/api/functions). - **AI and agent features**: you can add custom API routes and workflows for agents to call. - **Multiple brands or regions** from one backend, with sales channels and regions unlimited on every Medusa Cloud plan. ## 3-year cost comparison Platform numbers below are list prices as of October 2026, from [Shopify pricing](https://www.shopify.com/pricing) (monthly billing) and [Medusa Cloud pricing](https://medusajs.com/pricing). Developer time is a variable you fill in, because it depends on your team and scope. | Cost category | Shopify Advanced | Shopify Plus | Medusa Cloud Launch | Medusa Cloud Scale | | --- | --- | --- | --- | --- | | Platform fee per month | $399 | from $2,300 | $99 | $299 | | Platform fee over 36 months | $14,364 | from $82,800 | $3,564 | $10,764 | | GMV-based platform fee | None listed on pricing page | None listed; Plus is sold on 1- or 3-year terms | 0% | 0% | | Fee when using a third-party payment provider | 0.6% of sales | 0.2% of sales | 0% | 0% | | Payment processing | Shopify Payments rates or your provider | Shopify Payments rates or your provider | Your provider's rates | Your provider's rates | | App subscriptions | Sum of your apps | Sum of your apps | Replaced by code you own | Replaced by code you own | | Usage-based charges | 1% on synced marketplace orders over 50 per month, up to $99 | 1% on synced marketplace orders over 50 per month, up to $99 | Usage beyond plan limits, such as compute hours and edge requests | Usage beyond plan limits, such as compute hours and edge requests | | Developer time (build) | D1: theme and app setup | D1: theme and app setup | D2: storefront and custom features | D2: storefront and custom features | | Developer time (maintenance) | M1 per year | M1 per year | M2 per year | M2 per year | A worked example from the rates above: on $1M of yearly sales through a third-party payment provider, Shopify Advanced's 0.6% fee is $6,000 a year, or $18,000 over three years. Yearly billing lowers Shopify Advanced to $299 a month. App costs are covered in the related entry on Shopify app costs. The comparison usually turns on D2 versus D1 plus app fees. If D2 is large and your apps are cheap, Shopify wins. If you pay several percentage-based apps or Plus fees, the platform savings can cover the build. ## What a migration from Shopify to Medusa looks like Starting on Shopify does not lock you in. Medusa's Docs MCP server has a [Shopify migration tool](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify) that gives your AI agent a migration plan for products, variants, prices, images, inventory levels, collections, and categories. It supports an API-based import that can be re-run and a faster CSV approach. Healthletic, a supplements brand with $24M+ in yearly GMV, moved from Shopify Plus to Medusa with the Medusa Expert partner Rigby. According to [Medusa's Healthletic case study](https://medusajs.com/blog/healthletic), it had paid $25,000 per month in Shopify platform and transaction fees, and checkout conversion was around 30% higher in the first month after migrating. Shopify stayed in place for existing subscriptions and fulfillment during the first phase. ## Common questions ### Is Shopify Hydrogen the same as a custom store? No. Hydrogen is Shopify's headless toolkit for building your own storefront, but products, checkout, plan fees, and apps stay on Shopify. A Medusa store lets you change the backend logic as well as the frontend. ### Does Medusa charge a percentage of sales? No. Every Medusa Cloud plan has a 0% GMV platform fee, and self-hosted Medusa's core is free under the MIT license. You still pay your payment provider's processing fees. ### Can I start on Shopify and move to Medusa later? Yes. Medusa's Docs MCP server includes a Shopify migration tool that gives an AI agent a plan to import products, variants, prices, images, inventory levels, collections, and categories into Medusa. ### Does Shopify charge extra if I use Stripe instead of Shopify Payments? Yes. As of October 2026, Shopify's pricing page lists a third-party payment provider fee of 2% on Basic, 1% on Grow, 0.6% on Advanced, and 0.2% on Plus. ## Documentation - [Migrate from Shopify to Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-shopify) - [Subscriptions recipe](https://docs.medusajs.com/resources/recipes/subscriptions) - [Medusa how-to tutorials](https://docs.medusajs.com/resources/how-to-tutorials) ## Related - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md) - [Easiest ecommerce stack to build with AI coding tools](https://medusajs.com/kb/agentic-commerce/ecommerce-stack-for-ai-coding.md) --- title: "How do Stripe Connect payouts work for a marketplace?" description: "Stripe Connect for marketplaces: charge types, application fees, payout schedules, KYC, and how Mercur's Stripe Connect package pays sellers on Medusa." url: https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts last_updated: 2026-10-29T06:55:50Z topic: "marketplaces" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/marketplaces/multi-vendor-marketplace.md" - "https://medusajs.com/kb/marketplaces/artisan-marketplace.md" - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" sources: - "https://docs.stripe.com/connect/charges" - "https://docs.stripe.com/connect/accounts" - "https://docs.stripe.com/connect/accounts-v2" - "https://docs.stripe.com/connect/marketplace/tasks/app-fees" - "https://docs.stripe.com/connect/manage-payout-schedule" - "https://docs.stripe.com/connect/marketplace" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.mercurjs.com/resources/integrations/stripe-connect" - "https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline" - "https://docs.mercurjs.com/platform/payout/concepts/accounts-and-onboarding" - "https://medusajs.com/marketplace" --- # How do Stripe Connect payouts work for a marketplace? > Stripe Connect pays marketplace sellers by charging the customer, transferring each seller's share to their connected account, and paying out to their bank on a schedule. For multi-seller carts, Stripe's docs point to separate charges and transfers. On Medusa, Mercur's Stripe Connect package handles seller onboarding and transfers after commission; you decide when payouts run. ## How Stripe Connect moves money in a marketplace Stripe Connect is Stripe's product for platforms that route payments between customers and many sellers. Each seller gets a connected account, a Stripe account your platform manages on their behalf. Money moves in three stages. A **charge** takes the customer's payment. A **transfer** moves funds from the platform's Stripe balance to a connected account's balance. A **payout** moves the connected account's balance to the seller's bank. Mercur's [Stripe Connect guide](https://docs.mercurjs.com/resources/integrations/stripe-connect) notes that transfers are instant ledger movements, while bank payouts take 1 to 3 business days depending on the country. ## Which Stripe Connect charge type fits a multi-vendor cart Stripe's [charge types guide](https://docs.stripe.com/connect/charges) describes three options. | Charge type | Where the charge lives | Sellers per payment | Fits | | --- | --- | --- | --- | | Direct charges | The connected account | One | SaaS platforms where sellers deal with their own customers | | Destination charges | The platform, with an immediate transfer | One | Marketplaces where each order has one seller | | Separate charges and transfers | The platform, transfers created later | Many | A single cart with goods from several sellers | With destination charges and separate charges and transfers, Stripe debits its fees, refunds, and chargebacks from the platform balance. Separate charges and transfers is the only type that splits one payment across several sellers, and Stripe notes it needs a more complex integration. ## How the marketplace takes its commission With destination charges, you set `application_fee_amount` on the PaymentIntent, and Stripe sends that amount back to the platform after the transfer ([application fees](https://docs.stripe.com/connect/marketplace/tasks/app-fees)). With separate charges and transfers, there is no application fee field. You keep your commission by transferring less than you charged, and Stripe recommends a ledger to track what each seller is owed. ## Connected account types and who handles KYC Stripe's [account types page](https://docs.stripe.com/connect/accounts) now labels Standard, Express, and Custom as legacy types. Stripe recommends the [Accounts v2 API](https://docs.stripe.com/connect/accounts-v2) for new platforms, where configurations such as `merchant` and `recipient` enable receiving payments or transfers. For existing Express accounts, Stripe handles onboarding and identity verification (KYC), and sellers get the Express Dashboard. The platform carries fraud and dispute liability for Express and Custom accounts. ## How payout timing works Stripe pays out connected account balances on a schedule set per account. The [payout schedule](https://docs.stripe.com/connect/manage-payout-schedule) interval is `manual`, `daily`, `weekly`, or `monthly`, and a delay setting controls how long funds wait before they are available. Platforms that carry fraud and dispute liability can change the interval. ## How Mercur implements Stripe Connect payouts on Medusa Medusa core has a [Stripe payment provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) for charging customers, but no Connect payout provider. Mercur, which Medusa describes as an open core marketplace platform built by its Expert partners at Rigby, adds the `@mercurjs/payout-stripe-connect` package. It uses separate charges and transfers, so the platform is the merchant of record for VAT, disputes, and chargebacks. ```ts { resolve: "@mercurjs/core/modules/payout", options: { providers: [ { resolve: "@mercurjs/payout-stripe-connect", id: "stripe-connect", options: { apiKey: process.env.STRIPE_API_KEY, webhookSecret: process.env.STRIPE_PAYOUT_WEBHOOK_SECRET, }, }, ], }, } ``` | Step | How it works | Status | | --- | --- | --- | | Charge the customer once | Medusa Stripe provider with manual capture | Native | | Split the cart per seller | Mercur order groups | Starter | | Create and onboard sellers | Express account plus a Stripe-hosted onboarding link; the account.updated webhook sets ACTIVE, RESTRICTED, or REJECTED | Starter | | Compute each seller's share | Order total minus commission lines | Starter | | Transfer to the seller | Transfer linked to the charge, grouped by order id | Starter | | Decide when to pay out | A subscriber or scheduled job that calls createPayoutWorkflow | Custom | | Reverse transfers on refund | Your own reconciliation logic | Custom | Mercur's [payout pipeline docs](https://docs.mercurjs.com/platform/payout/concepts/payout-pipeline) state that core doesn't ship the job that triggers payouts, and that `createPayoutWorkflow` doesn't check capture, fulfillment, or earlier payouts. Add those guards in your trigger. ## When this setup is not the right choice - **Sellers must be the merchant of record.** Separate charges and transfers puts VAT and disputes on the platform. Direct charges need a different payout provider, which you would build. - **You are starting a new Connect platform and want Accounts v2.** Mercur's provider creates Express accounts, a type Stripe now calls legacy. Check Stripe's current guidance before launch. - **Long seller lead times.** Card authorizations typically expire after 7 days, per Mercur's guide, so made-to-order sellers may need a different capture strategy. ## Common questions ### What is the difference between a transfer and a payout in Stripe Connect? A transfer moves funds from the platform's Stripe balance to a connected account's balance. A payout moves a connected account's balance to the seller's bank account on its payout schedule. ### Can I use application_fee_amount with separate charges and transfers? No. Stripe's application fee field applies to destination and direct charges. With separate charges and transfers, the platform keeps its commission by transferring less than it charged. ### Does Medusa support Stripe Connect natively? No. Medusa core includes a Stripe payment provider for charging customers but no Connect payout provider. Mercur adds one with the @mercurjs/payout-stripe-connect package. ### Who handles seller identity verification with Stripe Connect? For Express connected accounts, Stripe runs onboarding and identity verification on a Stripe-hosted page. Mercur marks a seller's payout account active only after Stripe reports details submitted, charges and payouts enabled, and no outstanding requirements. ## Documentation - [Medusa Stripe Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) - [Marketplace recipe](https://docs.medusajs.com/resources/recipes/marketplace) ## Related - [How do I build a multi-vendor marketplace with open source?](https://medusajs.com/kb/marketplaces/multi-vendor-marketplace.md) - [How do I build an artisan marketplace with AI coding help?](https://medusajs.com/kb/marketplaces/artisan-marketplace.md) - [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) --- title: "Stripe vs a commerce backend: what Stripe doesn't handle" description: "Stripe + Prisma or a commerce backend? What you build yourself on Stripe (cart, tax, shipping, inventory, orders, returns) and how Medusa uses Stripe." url: https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend last_updated: 2026-10-29T06:55:50Z topic: "headless-checkout" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://docs.medusajs.com/resources/commerce-modules/payment" - "https://docs.medusajs.com/resources/commerce-modules/cart" - "https://docs.medusajs.com/resources/commerce-modules/tax" - "https://docs.medusajs.com/resources/integrations/guides/avalara" - "https://docs.medusajs.com/resources/commerce-modules/fulfillment" - "https://docs.medusajs.com/resources/commerce-modules/inventory" - "https://docs.medusajs.com/resources/commerce-modules/promotion" - "https://docs.medusajs.com/resources/commerce-modules/order/return" - "https://docs.medusajs.com/resources/commerce-modules/order/exchange" - "https://docs.medusajs.com/resources/commerce-modules/order/claim" - "https://docs.medusajs.com/resources/recipes/subscriptions" - "https://docs.medusajs.com/user-guide/orders/payments" - "https://docs.medusajs.com/resources/references/medusa-workflows/completeCartWorkflow" - "https://medusajs.com/pricing" - "https://stripe.com/pricing" - "https://docs.stripe.com/payments/checkout" - "https://docs.stripe.com/payments/checkout/product-catalog" --- # Stripe vs a commerce backend: what Stripe doesn't handle > Stripe handles payments, not the rest of a store. With Stripe plus Postgres and Prisma, you build the cart, shipping, inventory, promotions, order lifecycle, returns, and admin yourself. Medusa is an open source commerce backend that ships those as modules and uses Stripe as its payment provider, so you keep Stripe and skip rebuilding order management. ## What Stripe handles and what it leaves to you Stripe handles payments: card and wallet processing, Checkout pages, Elements, Stripe Tax, and subscription billing. A store also needs a product catalog with variants, a cart, shipping rates, stock levels, promotions, an order record that changes after payment, returns, and an admin where staff do this work. With "Stripe + Postgres + Prisma", those parts are your schema and your code. Medusa is an open source commerce backend that ships those parts as commerce modules and uses Stripe as its payment provider. So the choice is not Stripe or Medusa. It is Stripe plus your own commerce code, or Stripe plus Medusa. ## What you build yourself on Stripe and Prisma The table lists the commerce parts a Stripe-only store needs, and where each comes from in Medusa. Status labels: **Native** means Medusa core, **Official guide** means a docs tutorial with example code, **Custom** means you build it. | Capability | Stripe + Prisma | Medusa | Status | | --- | --- | --- | --- | | Products, variants, prices per currency | Your tables, or Stripe Products and Prices | Product and Pricing Modules | Native | | Cart with totals, line items, and promotions | Your code | Cart Module and Store API cart routes | Native | | Tax calculation | Stripe Tax or your code | Tax Module with tax regions; an Avalara integration guide | Native, Official guide | | Shipping options and rates | Your code | Fulfillment Module with shipping options restricted by location and rules | Native | | Inventory and reservations | Your code | Inventory Module, with stock reserved when an order is placed | Native | | Promotions and discount codes | Discounts in Stripe Checkout, or your code | Promotion Module | Native | | Order lifecycle (placed, fulfilled, completed) | Your code, driven by Stripe webhooks | Order Module and order workflows | Native | | Returns, exchanges, claims | Your code plus Stripe refunds | Order Module returns, exchanges, and claims | Native | | Admin for staff | Your code or the Stripe Dashboard for payments only | Medusa Admin dashboard | Native | | Subscriptions with fulfillment | Stripe Billing plus your fulfillment code | Subscriptions recipe | Official guide | ## How Medusa uses Stripe as the payment provider Medusa's Payment Module talks to payment processors through module providers. The Stripe Module Provider is installed by default; you register it in `medusa-config.ts` with your Stripe secret key: ```ts // medusa-config.ts modules: [ { resolve: "@medusajs/medusa/payment", options: { providers: [ { resolve: "@medusajs/medusa/payment-stripe", id: "stripe", options: { apiKey: process.env.STRIPE_API_KEY }, }, ], }, }, ], ``` You then enable Stripe in a region in the Medusa Admin. During checkout, the storefront creates a payment session, which gives it a Stripe client secret for Stripe's UI. Completing the cart creates the order and authorizes the payment. Payments are captured later from the admin unless you set the `capture` option to `true`. For deployed apps, you register Medusa's webhook route (`/hooks/payment/stripe_stripe` for basic Stripe payments) in Stripe with the `webhookSecret` option. The provider also registers Stripe methods such as Bancontact, BLIK, iDEAL, Przelewy24, PromptPay, and OXXO as separate providers. The `automatic_payment_methods` option supports wallets like Apple Pay and Google Pay. See the [Stripe Module Provider docs](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) for all options. ## Stripe fees with and without Medusa Stripe's processing fees apply either way. The US rate for domestic cards is 2.9% + 30¢ per successful transaction, and Stripe Tax has its own pricing, per [Stripe's pricing page](https://stripe.com/pricing). Medusa's core is MIT licensed. If you host it on [Medusa Cloud](https://medusajs.com/pricing), plans start at $29/month (Develop), $99 (Launch), and $299 (Scale), with a 0% GMV fee. ## When Stripe alone is the right choice - You sell a handful of digital products, licenses, or one subscription plan with no shipping. - You don't need stock levels, returns, or an admin beyond the Stripe Dashboard. - You want the least infrastructure: no database for orders and no second service. Stripe plus Prisma also works when your commerce rules are small and stable. The cost shows up later, when you add a second currency, partial refunds, exchanges, or staff who need to edit orders. That is the point where a commerce backend like Medusa saves you from rebuilding order management, and you keep Stripe as the processor. ## Common questions ### Does Medusa replace Stripe? No. Medusa uses Stripe as a payment provider through its Stripe Module Provider, so Stripe still processes payments and charges its own fees. Medusa adds the catalog, cart, inventory, orders, and admin around it. ### Does Medusa charge a transaction fee on top of Stripe? No. Medusa's core is MIT licensed, and Medusa Cloud plans have a 0% GMV fee, with plans starting at $29/month. Stripe's processing fees still apply. ### Which Stripe payment methods does Medusa support? Medusa's Stripe Module Provider registers basic Stripe card payments plus Bancontact, BLIK, giropay, iDEAL, Przelewy24, PromptPay, and OXXO as separate providers. Its automatic_payment_methods option supports wallets such as Apple Pay and Google Pay. ### Do I need Stripe webhooks with Medusa? Yes, for deployed Medusa applications. You register Medusa's /hooks/payment/{provider_id} route in Stripe, for example /hooks/payment/stripe_stripe, and set the webhookSecret option. ## Documentation - [Stripe Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) - [Payment Module](https://docs.medusajs.com/resources/commerce-modules/payment) - [Inventory Module](https://docs.medusajs.com/resources/commerce-modules/inventory) - [Order Return](https://docs.medusajs.com/resources/commerce-modules/order/return) ## Related - [How to add a cart and checkout to an existing Next.js site](https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) - [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "How to sell subscriptions and one-time products in one store" description: "How to sell subscriptions and one-time products in one Medusa store: renewals, mixed carts, dunning, pause and skip, compared with Recharge and Stripe Billing." url: https://medusajs.com/kb/subscriptions/subscriptions-and-one-time-products last_updated: 2026-10-29T06:55:50Z topic: "subscriptions" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/subscriptions/coffee-subscription-store.md" - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md" - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" sources: - "https://docs.medusajs.com/resources/recipes/subscriptions" - "https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard" - "https://github.com/medusajs/examples/tree/main/subscription" - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe" - "https://medusajs.com/pricing" - "https://apps.shopify.com/subscription-payments" - "https://getrecharge.com/pricing/" - "https://stripe.com/billing/pricing" - "https://docs.stripe.com/billing/subscriptions/pause-payment" - "https://docs.stripe.com/billing/subscriptions/prorations" - "https://medusajs.com/blog/reorder" - "https://docs.reorderjs.com/storefront/cart.md" - "https://apps.shopify.com/shopify-subscriptions" - "https://medusajs.com/blog/goodchef" --- # How to sell subscriptions and one-time products in one store > Medusa has no built-in Subscription Module, but its official Subscriptions guide shows how to add one: a custom module, a daily scheduled job that creates and charges renewal orders, and admin pages. One-time products use the standard checkout. Mixing both in one cart, dunning, and pause, skip, or swap are custom work. ## How subscriptions work in Medusa Medusa core has no Subscription Module. Subscriptions are built with the Medusa Framework, and the [Subscriptions recipe](https://docs.medusajs.com/resources/recipes/subscriptions) and its [example guide](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard) show one complete way to do it, with code in the [medusajs/examples repository](https://github.com/medusajs/examples/tree/main/subscription). In the example, a custom Subscription Module stores each subscription's `status`, `interval` (monthly or yearly), `period`, `next_order_date`, and `expiration_date`. Module links connect each subscription to the cart, customer, and orders. A custom `/store/carts/{id}/subscribe` route completes the cart with `completeCartWorkflow` and creates the subscription in one workflow. At checkout, the storefront passes `setup_future_usage: "off_session"` to Stripe, so the card is saved to the customer's [account holder](https://docs.medusajs.com/resources/commerce-modules/payment/account-holder) for later charges. ## How subscription renewals run in Medusa Renewals in the example run from a [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) that runs daily at midnight. It finds active subscriptions whose `next_order_date` is today and runs a workflow for each one. The workflow creates a payment collection, authorizes the saved payment method, creates a new order from the subscription's linked cart, captures the payment, and moves `next_order_date` forward. A second daily job marks subscriptions as expired. The example also adds Medusa Admin pages that list subscriptions and their orders, and Store API routes where customers view and cancel their own subscriptions. ## Can one Medusa cart mix subscription and one-time items? Not in the official example. It stores the interval and period on the cart's metadata, so the whole cart becomes the subscription, and each renewal re-creates the order from that cart. The Reorder plugin listed below also blocks mixed carts in its current release and asks customers to check out twice. Mixing them in one checkout is Custom work. Two patterns fit Medusa's model: - Mark subscription items in line item metadata, then split the cart into two carts at checkout: one completed normally, one through the subscribe route. - Complete one order, create a subscription record per subscribed line item, and have the renewal workflow build orders from those items only. ## Subscription features in Medusa by status | Feature | Status | How | | --- | --- | --- | | Subscription data model and links | Official guide | Custom module plus module links to cart, customer, order | | Automatic renewal orders | Official guide | Daily scheduled job and renewal workflow | | Admin subscription pages | Official guide | Admin UI routes | | Customer view and cancel | Official guide | Custom Store API routes | | Product options such as size | Native | Product Module options and variants | | Mixed cart checkout | Custom | Split carts or per-item subscriptions | | Dunning (failed payment retries) | Custom | The example only logs a failed renewal | | Pause, skip, swap | Custom | Clear, shift, or change next_order_date and the linked cart | | Proration | Custom | Calculate in the renewal workflow | Dunning means retrying failed renewal payments and emailing the customer. A common pattern sets the subscription's `failed` status, then a second scheduled job retries on a backoff schedule. [Reorder](https://medusajs.com/blog/reorder) is an MIT-licensed community plugin for Medusa 2.3+ that adds pause, resume, skip, cancel, and dunning with retries. Medusa doesn't maintain it, so review it like any dependency. ## Custom logic or Stripe Billing as the subscription engine The recipe describes two approaches. With custom logic, renewals live in your Medusa app and work with any payment provider. With Stripe Billing, Stripe runs the schedule and retries, but you are tied to Stripe. Medusa's [Stripe provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) doesn't handle subscriptions, so you write a custom payment provider. ## Medusa vs Recharge on Shopify vs Stripe Billing Prices are list prices as of October 2026. | | Medusa | Recharge on Shopify | Stripe Billing | | --- | --- | --- | --- | | Where renewals run | Your Medusa app | Recharge | Stripe | | Subscription fees | None, Medusa Cloud from $29/month with 0% GMV fee | Starter $99/month plus 1.49% + 19¢ per transaction | 0.7% of Billing volume, pay as you go | | Dunning | Custom | Failed payment recovery included | Smart Retries included | | Skip, pause, swap | Custom | Customer portal with swap and reschedule | Pause payment collection, prorations | | Payment providers | Any provider you integrate | Check vendor docs | Stripe only | Card processing fees apply on top in every column. ## When Medusa is not the right choice for subscriptions - You run on Shopify and need standard subscribe-and-save. Shopify's free Shopify Subscriptions app supports pause, skip, and cancel. - You have no developer. Every subscription feature beyond the guide is code you maintain. - You bill software or digital plans that need invoices and prorations. Stripe Billing alone fits better. Good Chef, a meal subscription brand, built its subscriptions in Medusa with a custom data model and a nightly renewal job, and chose not to use Stripe Billing so customers could pay with their preferred method ([case study](https://medusajs.com/blog/goodchef)). ## Common questions ### Does Medusa have a built-in subscription feature? No. Medusa core has no Subscription Module. The official Subscriptions recipe and example guide show how to build one with a custom module, workflows, and scheduled jobs. ### Can I use Stripe Billing for subscriptions with Medusa? Yes, but not through Medusa's Stripe payment provider, which doesn't handle subscriptions. The Subscriptions recipe says to create a custom Stripe subscription payment provider, which limits you to Stripe. ### How does Medusa charge a subscription renewal? In the official example, a scheduled job runs daily, finds active subscriptions due today, and runs a workflow that authorizes the customer's saved payment method, creates the order, and captures the payment. ### Is there a subscription plugin for Medusa? Reorder is an MIT-licensed community plugin for Medusa 2.3+ that adds pause, skip, dunning, and a customer portal API. Medusa doesn't maintain it, and its current release doesn't support mixed carts. ## Documentation - [Subscriptions Recipe](https://docs.medusajs.com/resources/recipes/subscriptions) - [Subscriptions example guide](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard) - [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) - [Account Holder](https://docs.medusajs.com/resources/commerce-modules/payment/account-holder) - [Create a Payment Module Provider](https://docs.medusajs.com/resources/references/payment/provider) ## Related - [Coffee subscriptions without Shopify app fees](https://medusajs.com/kb/subscriptions/coffee-subscription-store.md) - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md) - [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) --- title: "Tax-inclusive vs tax-exclusive pricing for US, UK and EU" description: "How VAT-inclusive and sales-tax-exclusive pricing differ across the US, UK and EU, and how to configure tax-inclusive prices per region in Medusa." url: https://medusajs.com/kb/international-commerce/tax-inclusive-pricing-international last_updated: 2026-10-29T06:55:50Z topic: "international-commerce" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md" - "https://medusajs.com/kb/international-commerce/multi-currency-pricing-api.md" sources: - "https://docs.medusajs.com/resources/commerce-modules/pricing/tax-inclusive-pricing" - "https://docs.medusajs.com/user-guide/settings/regions" - "https://docs.medusajs.com/user-guide/settings/store" - "https://docs.medusajs.com/user-guide/settings/tax-regions" - "https://docs.medusajs.com/resources/commerce-modules/tax/tax-region" - "https://docs.medusajs.com/resources/commerce-modules/tax/tax-rates-and-rules" - "https://docs.medusajs.com/resources/commerce-modules/tax/tax-provider" - "https://docs.medusajs.com/resources/commerce-modules/promotion/promotion-taxes" - "https://docs.medusajs.com/resources/storefront-development/products/price" - "https://docs.medusajs.com/resources/storefront-development/products/price/examples/tax-price" - "https://docs.medusajs.com/resources/integrations/guides/avalara" - "https://docs.medusajs.com/api/admin/regions/create-region" - "https://www.gov.uk/vat-businesses/charging-vat" - "https://www.gov.uk/online-and-distance-selling-for-businesses" - "https://europa.eu/youreurope/business/taxation/vat/vat-rules-rates/index_en.htm" - "https://europa.eu/youreurope/citizens/consumers/shopping/pricing-payments/index_en.htm" - "https://www.avalara.com/taxrates/en/state-rates.html" - "https://help.shopify.com/en/manual/international/tax-inclusive" --- # Tax-inclusive vs tax-exclusive pricing for US, UK and EU > US stores usually show prices before sales tax and add tax at checkout, while UK and EU consumer prices include VAT. In Medusa, you enable tax-inclusive pricing per region or per currency, set VAT and sales tax rates in tax regions, and use the Avalara tax provider or a custom one for address-level rates. ## What tax-inclusive and tax-exclusive pricing mean A tax-inclusive price already contains the tax, so the checkout total equals the shelf price. A tax-exclusive price is the net amount, and tax is added at checkout. For example, a tax-inclusive price of 120 GBP at a 20% VAT rate is 100 GBP net plus 20 GBP VAT. In Medusa v2, a tax-inclusive price is one where Medusa calculates the tax amount from the price instead of adding it on top ([Tax-Inclusive Pricing](https://docs.medusajs.com/resources/commerce-modules/pricing/tax-inclusive-pricing)). ## Which convention the US, UK and EU use The table summarizes widely documented rules for consumer sales. It is general information, not tax advice; confirm your obligations with the tax authority or an adviser. | Market | Tax | Who sets the rate | Consumer price display | | --- | --- | --- | --- | | United States | Sales tax | States and local jurisdictions. Rates can vary within a county, a city or a ZIP code. | Commonly shown before tax, with tax added at checkout | | United Kingdom | VAT | UK government: standard 20%, reduced 5%, zero 0% | Price including all taxes before the order is placed | | European Union | VAT | Each member country, with a standard rate of at least 15% | Total price including all taxes | Sources: US rates from [Avalara's state rate table](https://www.avalara.com/taxrates/en/state-rates.html), UK rates from [GOV.UK](https://www.gov.uk/vat-businesses/charging-vat), UK display rules from [GOV.UK online selling](https://www.gov.uk/online-and-distance-selling-for-businesses), and EU rules from Your Europe on [VAT rates](https://europa.eu/youreurope/business/taxation/vat/vat-rules-rates/index_en.htm) and [consumer pricing](https://europa.eu/youreurope/citizens/consumers/shopping/pricing-payments/index_en.htm). The practical result for a store selling in all three: show US prices tax-exclusive, and show UK and EU prices tax-inclusive. ## How to configure tax-inclusive pricing per region or currency in Medusa Medusa stores the setting as a price preference. A price preference targets either a `region_id` or a `currency_code` and has an `is_tax_inclusive` flag. Only those two attributes are supported. You set it in two places in the Medusa Admin: - **Per region**: the "Tax inclusive pricing" toggle when you create or edit a region ([Manage Regions](https://docs.medusajs.com/user-guide/settings/regions)), or `is_tax_inclusive` on the Create Region API route. - **Per currency**: the tax-inclusive toggle next to a currency in the store settings ([Manage Store](https://docs.medusajs.com/user-guide/settings/store)). When a price matches both, the region's preference wins if the price belongs to that region. If you use tax-inclusive prices, Medusa's docs note that tax-inclusive promotions (v2.8.5+) are most useful with tax-inclusive prices, because the discount amount you enter is then treated as including tax ([Tax-Inclusive Promotions](https://docs.medusajs.com/resources/commerce-modules/promotion/promotion-taxes)). ## How Medusa calculates the tax amount Medusa's Tax Module calculates tax lines from tax regions. A tax region is the tax setup for one country. - Each tax region has a default rate, and override rates for specific product types or other rules. - Countries such as the US have sublevel tax regions for states or provinces. Sublevel rates can be combined with the parent's rate. - Each tax region uses a tax provider. The default `tp_system` provider applies the rates you enter. | Need | Medusa feature | Status | | --- | --- | --- | | Fixed VAT rate per country | Tax region with a default rate | Native | | Reduced rate for a product type | Tax rate override with a rule | Native | | US state rates | Sublevel tax regions | Native | | Address-level US rates and tax codes | Avalara tax provider | Official guide | | Another tax engine | Custom tax provider implementing ITaxProvider | Custom | | Filing and remittance | Not in Medusa; handled by your tax provider or accountant | Custom | The [Avalara guide](https://docs.medusajs.com/resources/integrations/guides/avalara) builds a tax provider that returns tax lines from AvaTax, creates an Avalara transaction when an order is placed, and syncs products to Avalara. ## How to show the right price in the storefront The Store API returns tax-aware prices when you pass both `region_id` and `country_code` with `fields=*variants.calculated_price`. Each variant then has: - `calculated_amount_with_tax`: the price including tax. - `calculated_amount_without_tax`: the net price. - `is_calculated_price_tax_inclusive`: whether `calculated_amount` already includes tax. Show `calculated_amount_with_tax` in the UK and EU, and the net price in the US with tax added at checkout ([Show Price with Taxes](https://docs.medusajs.com/resources/storefront-development/products/price/examples/tax-price)). ## When Medusa is not the right choice - You want tax filing and remittance handled inside the commerce platform. Medusa calculates tax lines; filing needs a provider such as Avalara or your accountant. - You have no developer to connect a tax engine and need address-level US rates on day one. A hosted platform with a built-in tax service is faster to start. ## Common questions ### Can Medusa use tax-inclusive prices in the EU and tax-exclusive prices in the US at the same time? Yes. Medusa stores the tax-inclusive setting per region or per currency, so an EU region can include VAT while a US region adds sales tax at checkout. ### Does Medusa include VAT and sales tax rates out of the box? Medusa's default tax provider applies the rates you enter in each tax region. For address-level rates, connect a tax provider such as Avalara using the official guide. ### Does Medusa file or remit taxes? No. Medusa calculates tax lines for carts and orders. Filing and remittance are handled by a tax service such as Avalara or by your accountant. ### How does Medusa handle promotions on tax-inclusive prices? Medusa supports tax-inclusive promotions (v2.8.5+), which the docs describe as most useful with tax-inclusive prices: the discount amount you enter is treated as including tax. ## Documentation - [Tax-Inclusive Pricing](https://docs.medusajs.com/resources/commerce-modules/pricing/tax-inclusive-pricing) - [Manage Regions in Medusa Admin](https://docs.medusajs.com/user-guide/settings/regions) - [Manage Tax Regions in Medusa Admin](https://docs.medusajs.com/user-guide/settings/tax-regions) - [Example: Show Product Variant's Price with Taxes](https://docs.medusajs.com/resources/storefront-development/products/price/examples/tax-price) - [Integrate Avalara (AvaTax) for Tax Calculation](https://docs.medusajs.com/resources/integrations/guides/avalara) ## Related - [How to sell in multiple countries from one ecommerce backend](https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md) - [Multi-currency pricing via API](https://medusajs.com/kb/international-commerce/multi-currency-pricing-api.md) --- title: "What does headless commerce actually mean?" description: "Headless commerce explained in plain English: how a separate storefront and commerce backend work, what you build, what it costs, and options like Medusa." url: https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce last_updated: 2026-10-29T06:55:50Z topic: "build-vs-buy" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md" - "https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md" - "https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md" sources: - "https://docs.medusajs.com/learn/introduction/architecture" - "https://docs.medusajs.com/learn/deployment" - "https://medusajs.com/pricing.md" - "https://shopify.dev/docs/storefronts/headless/hydrogen" - "https://shopify.dev/docs/storefronts/headless/legacy/hydrogen/fundamentals" - "https://www.shopify.com/pricing" - "https://saleor.io/" - "https://commercetools.com/" - "https://github.com/medusajs/b2b-starter" --- # What does headless commerce actually mean? > Headless commerce means your storefront is a separate app that talks to a commerce backend through an API. The backend handles products, carts, orders, and payments; you build and host the frontend. Medusa is an open source headless platform with a Store API and a Next.js Starter Storefront, so you build the frontend, not commerce itself. ## What headless commerce means in plain English Headless commerce means the part of your store that shoppers see (the frontend, or "head") is a separate application from the part that runs commerce (the backend). The two talk over an API. The backend holds products, prices, carts, orders, and payments. The frontend is any website, app, or other client that calls that API. In a traditional platform such as Shopify with a theme, the storefront and the backend come as one package. You customize the store inside the theme system. In a headless setup, your team builds and hosts its own storefront, often in a framework like Next.js. ```text Traditional: Shopper -> [ Theme + checkout + backend, one platform ] Headless: Shopper -> Your storefront (Next.js, mobile app, kiosk, AI agent) | | API calls (products, cart, checkout) v Commerce backend (Medusa, Shopify, Saleor, commercetools) | Admin dashboard, database, payment and shipping providers ``` ## How headless commerce works in Medusa Medusa is a headless commerce platform. Its docs describe the architecture directly: storefronts, admin dashboards, and other clients use Medusa through its API routes. The Medusa application is a Node.js server plus the Medusa Admin dashboard, and the storefront is deployed separately. Medusa provides a [Store API](https://docs.medusajs.com/api/store) for storefronts and a [Next.js Starter Storefront](https://docs.medusajs.com/resources/nextjs-starter) you can use as-is or build on. You are free to use another frontend stack. Medusa Cloud can host the backend, admin, and [storefront together](https://docs.medusajs.com/cloud/storefront) from one monorepo. ## What you get versus what you build Going headless does not mean building commerce from scratch. The backend gives you the commerce logic. You take on the frontend. | Area | With Medusa | Status | | --- | --- | --- | | Products, variants, categories | Product Module | Native | | Prices, currencies, price lists | Pricing Module | Native | | Cart, checkout logic, orders | Cart and Order Modules | Native | | Admin dashboard | Medusa Admin | Native | | Storefront | Next.js Starter Storefront, installed with create-medusa-app, that you customize | Native | | Product reviews, loyalty points, subscriptions | Official tutorials with example code | Official guide | | B2B company accounts and quotes | B2B Starter | Starter | | Business-specific logic | Custom modules and workflows | Custom | ## What headless commerce costs Headless adds cost in three places compared with a theme-based store: - **Frontend development**: someone builds and maintains the storefront. This is the largest cost and depends on your team. - **Frontend hosting**: Shopify's Oxygen hosting is available at no extra charge on paid Shopify plans other than Agentic plans. Medusa Cloud plans start at $29 per month and include storefront hosting, with a 0% GMV fee ([Medusa Cloud pricing](https://medusajs.com/pricing)). - **Ongoing changes**: content and layout changes that a merchant makes in a theme editor may need a developer or a CMS. The backend licence cost depends on the platform. Medusa and Saleor are open source. commercetools does not list prices on its site. ## Headless commerce options compared | Option | Backend | Frontend | Hosting | Pricing model | | --- | --- | --- | --- | --- | | Shopify Hydrogen | Shopify | Hydrogen (framework-agnostic, with a React Router starter) | Oxygen or self-hosted | Shopify plan fees and apps | | Medusa | Open source (MIT core), Node.js and TypeScript | Next.js Starter or any framework | Self-hosted or Medusa Cloud | Free to self-host; Cloud from $29 per month, 0% GMV fee | | Saleor | Open source, GraphQL API | Any framework | Self-hosted or Saleor Cloud | Check vendor docs | | commercetools | Headless, API-first platform for enterprise | Any framework | Vendor cloud | Not public, through sales | Hydrogen is the closest path if you already run Shopify and only want a custom frontend: checkout, plan fees, and apps stay on Shopify. Medusa fits when you also need to change backend logic, such as pricing rules, checkout steps, or order flows. ## When you should not go headless Headless is not the right default for every store. Stay on a theme-based platform if you have no developer, your store fits a theme, and you want merchants to change pages without code. Shopify's own pricing page lists 1 headless storefront on Basic, Grow, and Advanced, and 25 on Plus ([Shopify pricing](https://www.shopify.com/pricing), as of October 2026), so headless is available there when you need it later. Medusa is also not the right choice if you want a hosted SaaS with no code to own. Medusa assumes a developer can work with TypeScript and deploy changes. ## Common questions ### Is headless commerce more expensive than Shopify? Usually at the start, because someone has to build and maintain the storefront. The backend can be cheap: Medusa is free to self-host and Medusa Cloud starts at $29 per month with a 0% GMV fee. ### Do I need a developer for headless commerce? Yes. A headless store needs a developer to build and change the storefront. If you don't have one, a theme-based platform such as Shopify is the better fit. ### What is the difference between Hydrogen and Medusa? Hydrogen is Shopify's toolkit for a custom frontend on Shopify's backend. Medusa is an open source backend you own and can extend with custom modules, used with the Next.js Starter Storefront or any frontend. ### Can a headless backend serve more than a website? Yes. Because Medusa exposes commerce through its API routes, the same backend can serve a website, a mobile app, or an AI agent. ## Documentation - [Medusa architecture](https://docs.medusajs.com/learn/introduction/architecture) - [Next.js Starter Storefront](https://docs.medusajs.com/resources/nextjs-starter) - [Store API reference](https://docs.medusajs.com/api/store) - [Storefront deployment on Cloud](https://docs.medusajs.com/cloud/storefront) ## Related - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md) - [How to add a cart and checkout to an existing Next.js site](https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md) - [Best ecommerce backend for building AI shopping agents](https://medusajs.com/kb/agentic-commerce/backend-for-ai-shopping-agents.md) --- title: "Switching from WooCommerce to a JavaScript stack" description: "How to move from WooCommerce to a Node.js stack with Medusa: the migration tool, steps, passwords, redirects, and Medusa vs Shopify vs Vendure." url: https://medusajs.com/kb/migrations-and-platforms/woocommerce-migration last_updated: 2026-10-29T06:55:50Z topic: "migrations-and-platforms" type: "concept" applies_to: "Medusa v2.x" related: - "https://medusajs.com/kb/migrations-and-platforms/magento-migration.md" - "https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md" - "https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md" - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md" - "https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md" - "https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md" sources: - "https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-woocommerce" - "https://medusajs.com/blog/migrate-woo-medusa" - "https://medusajs.com/blog/tekla" - "https://woocommerce.com/document/server-requirements/" - "https://help.shopify.com/en/manual/migrating-to-shopify/migrating-from-woocommerce" - "https://www.shopify.com/pricing" - "https://vendure.io/pricing" - "https://vendure.io/migrate/woocommerce" - "https://docs.medusajs.com/resources/commerce-modules/customer/customer-accounts" - "https://docs.medusajs.com/resources/commerce-modules/auth/auth-providers/emailpass" - "https://docs.medusajs.com/resources/commerce-modules/auth/reset-password" - "https://docs.stripe.com/get-started/data-migrations/pan-import" - "https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes" - "https://medusajs.com/pricing" --- # Switching from WooCommerce to a JavaScript stack > To switch from WooCommerce to a JavaScript stack, move your catalog into Medusa, a TypeScript commerce backend on Node.js, with the WooCommerce guide in Medusa's Docs MCP migration tool. It migrates products, variants, prices, images, inventory, and categories. Then import customers, connect a storefront to the Store API, and add 301 redirects. ## How to move from WooCommerce to a JavaScript stack Switching from WooCommerce to Medusa means moving your catalog into a Node.js commerce backend written in TypeScript and connecting a separate storefront, such as Next.js, to its Store API. WooCommerce is a plugin for WordPress, so the move also separates your store from your CMS. ## Why stores outgrow WooCommerce WooCommerce is a WordPress plugin. Its current [server requirements](https://woocommerce.com/document/server-requirements/) are WordPress 6.9+, PHP 8.3+, and MySQL 8.0+ or MariaDB 10.6+. Store features come from more plugins that run in the same PHP application and database as the rest of the site. Teams usually leave for three reasons: plugin conflicts after updates, a slow storefront under load, and custom logic that doesn't fit hooks and filters. A team that already writes TypeScript also gets one language across backend and storefront. ## What Medusa's WooCommerce migration tool does Medusa's Docs MCP server has a curated WooCommerce guide in its migration tool. You prompt your AI agent ("Migrate my WooCommerce store's products to Medusa") and it builds the import in your Medusa project. The Docs MCP server requires a Medusa Cloud account. Per the [WooCommerce migration tool docs](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-woocommerce), it migrates products, variants, prices, images, inventory levels, and collections and categories. Orders and customers are possible, but the tool is mainly built for catalog data. | Approach | How it works | Trade-off | | --- | --- | --- | | Custom (default) | A module and workflows pull from the WooCommerce REST API. Idempotent and re-runnable, so it also works as ongoing sync. | More to build. Needs WooCommerce API keys. Migrates inventory and re-hosts images. | | CSV | Transforms the WooCommerce product export into the Medusa Admin import format. | Fast, no API keys. Inventory quantities are not migrated and images stay on the WordPress site. | Don't mix both approaches on one store. The CSV path can't key records to WooCommerce IDs, so a later API import fails on duplicate handles. ## WooCommerce migration steps 1. **Audit plugins.** List each active plugin and decide: Medusa core feature, existing integration, or custom module. 2. **Products first.** Run the migration tool for products. Other entities reference them. 3. **Customers.** Create registered customers with `has_account: true`, as the [Customer Accounts docs](https://docs.medusajs.com/resources/commerce-modules/customer/customer-accounts) describe. Medusa's emailpass provider hashes passwords with scrypt and the docs don't cover importing WordPress hashes, so plan for customers to set a new password through the [reset password flow](https://docs.medusajs.com/resources/commerce-modules/auth/reset-password). 4. **Payments.** Saved cards stay with your payment provider. Moving them between processors needs the provider's help, for example [Stripe's payment data import](https://docs.stripe.com/get-started/data-migrations/pan-import). 5. **Storefront and content.** Build the storefront on the Store API. Keep WordPress as a headless CMS or move content to another CMS. 6. **Redirects and launch.** Map old URLs to new ones with permanent 301 redirects and submit the new sitemap in Search Console, per Google's [site move guide](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes). ## Medusa vs Shopify vs Vendure as a WooCommerce replacement | | Medusa | Shopify | Vendure | | --- | --- | --- | --- | | Model | Open source framework, self-host or Medusa Cloud | Hosted SaaS | Open source framework, self-host; Vendure Cloud not yet available (GA planned Q1 2027) | | Stack | TypeScript, Node.js, REST APIs | Hosted platform | TypeScript, GraphQL API | | License | MIT (RBAC and SSO are Enterprise Edition) | Proprietary | GPLv3, or commercial license on paid plans | | Price | Free to self-host; Cloud from $29/month, 0% GMV fee | From $19/month (yearly billing); extra fee with third-party payment providers | Framework free; paid plans from 199 euros/month | | WooCommerce migration | Docs MCP migration tool with a WooCommerce guide | Free Store Migration app imports products and customers from WooCommerce CSV exports | Partner-led; no tool named on its WooCommerce page | | Customer passwords | Not imported; customers set a new one | Shopify states passwords can't be migrated | Check vendor docs | Sources: Medusa [pricing](https://medusajs.com/pricing), Shopify [pricing](https://www.shopify.com/pricing) and [WooCommerce migration guide](https://help.shopify.com/en/manual/migrating-to-shopify/migrating-from-woocommerce), Vendure [pricing](https://vendure.io/pricing) and [WooCommerce page](https://vendure.io/migrate/woocommerce). ## Proof: Tekla moved from WooCommerce to Medusa [Tekla](https://medusajs.com/blog/tekla), a Copenhagen textile brand, replaced WooCommerce with Medusa and was Medusa's first case (2022, Medusa v1). Tekla reported a 70% higher conversion rate than its WooCommerce store and growth from 2 to 50+ markets. ## When Medusa is not the right choice - You have no developer and a standard catalog: Shopify needs less engineering. - Your store is mostly content with a few products and WooCommerce performs fine. - Your team works only in PHP and plans to stay there. ## Common questions ### Does Medusa have a WooCommerce migration tool? Yes. Medusa's Docs MCP server includes a curated WooCommerce migration guide that your AI agent follows to import products, variants, prices, images, inventory, and categories, either through the WooCommerce REST API or a CSV export. ### Can I migrate WooCommerce orders and customers to Medusa? Medusa's migration tool can be extended to orders and customers, but it is mainly built for catalog data. Historical orders are the most involved part because they reference customers, regions, and payments. ### Do WooCommerce customer passwords carry over to Medusa? Medusa's docs don't describe importing WordPress password hashes, and Medusa's emailpass provider uses scrypt. Plan for imported customers to set a new password. ### Can I keep WordPress for content after moving to Medusa? Yes. Medusa is headless, so your storefront can read products from Medusa's Store API and content from WordPress or any other CMS. ## Documentation - [Migrate from WooCommerce to Medusa](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server/migrate-from-woocommerce) - [Docs MCP server](https://docs.medusajs.com/learn/introduction/build-with-llms-ai/docs-mcp-server) - [Customer Accounts](https://docs.medusajs.com/resources/commerce-modules/customer/customer-accounts) - [Import products in Medusa Admin](https://docs.medusajs.com/user-guide/products/import) ## Related - [How to migrate from Magento to a TypeScript stack](https://medusajs.com/kb/migrations-and-platforms/magento-migration.md) - [Medusa vs Vendure](https://medusajs.com/kb/migrations-and-platforms/medusa-vs-vendure.md) - [Best open-source ecommerce platforms (2026), compared](https://medusajs.com/kb/migrations-and-platforms/open-source-ecommerce-platforms.md) - [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md) - [How to add a cart and checkout to an existing Next.js site](https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md) - [Cheapest way to run a production ecommerce backend](https://medusajs.com/kb/migrations-and-platforms/ecommerce-backend-cost.md)