Medusa vs Saleor

Medusa suits teams that want a TypeScript commerce framework on Node.js. Saleor suits teams that want a GraphQL-first commerce platform on Python and Django. The choice turns on your team's skills, your extension model and the services you are prepared to run.

On this page

Medusa vs Saleor: when to choose each

If your team already builds in Node.js and TypeScript and wants a commerce framework you extend in code, Medusa is usually the better starting point. If your team wants a GraphQL-first commerce API with a Python and Django back end, plus built-in depth for multi-warehouse fulfillment and promotions, Saleor is the stronger fit. Both are headless, both can be self-hosted, and both are production systems, so the choice comes down to how your team will build and run the platform for years. Choose Medusa when your engineers are fluent in TypeScript and want commerce logic expressed as modules and workflows in the same language as the storefront. Its core is MIT licensed, and its self-hosted deployment is built on PostgreSQL and Redis with two Medusa instances, one in server mode for the API and admin dashboard and one in worker mode for background tasks. That model suits B2B stores, marketplaces and point-of-sale projects that your team intends to customize deeply. Confirm with the vendor which Enterprise Edition features, such as role-based access control, your organization needs, because those require a commercial agreement with MedusaJS, Inc.

Choose Saleor when your team works in Python and Django, prefers an API-first GraphQL model, or needs per-channel pricing, currencies and stock across several warehouses out of the box. Its built-in coverage of split payments, returns, multi-gateway payments and a promotion engine with sales, vouchers, cart rules and gift cards reduces the amount of custom commerce logic you must write. Saleor extends through webhooks, apps and metadata rather than in-process plugins, which keeps upgrades and integrations at arm's length but changes how your developers add behavior. Its license is BSD-3-Clause, so confirm that any extensions you plan to use carry compatible terms.

The decision turns on four questions: which language and framework your team can maintain for the next several years, whether you want an in-process extension model or service-style integrations, which supporting services your operations group is willing to run (Redis and S3 for Medusa, Valkey or Redis and Celery workers for Saleor), and how far the licensing scope reaches into the features you need. Run a short proof of concept against your own catalog, channels and fulfillment flows before committing, and get the full service list and Enterprise scope in writing.

Which platform fits which scenario

This table maps common team situations to the platform that fits them better and the condition that tips the decision. Read each row as a starting point, then confirm the named features and editions with the vendor against your own requirements.

ScenarioBetter fitCondition that makes it so
TypeScript product team building a B2B or marketplace storeMedusaYour engineers work in Node.js and TypeScript end to end, and you want commerce modules you can customize in the same language as your storefront.
Python shop with Django experienceSaleorYour team already runs Python and Django in production, so the Django stack and GraphQL API match existing skills and hiring.
Multi-warehouse retailer with per-channel pricingSaleorYou need per-channel pricing, currencies and stock across multiple warehouses, which Saleor documents as core functions. Confirm the exact fulfillment and routing behavior you need with the vendor.
Team that needs enterprise role-based access controlDepends on editionMedusa names RBAC as an Enterprise Edition feature requiring a commercial agreement, so budget for that agreement. Confirm which Saleor features sit behind its paid tiers before comparing.
Team that wants a managed cloudEither, after checking plansMedusa Cloud and Saleor Cloud are both offered as managed hosting. Compare included services, usage limits and data residency with each vendor before deciding.
Team that expects to run its own infrastructure with minimal extra servicesConfirm with your platform teamMedusa needs PostgreSQL, Redis and two instances (server and worker). Saleor needs the API, Dashboard, PostgreSQL, Valkey or Redis and Celery workers. Compare these service counts against your operating capacity.
Team that extends commerce through in-process pluginsMedusaMedusa's module model lets developers build custom modules inside the application. Saleor extends through webhooks, apps and metadata, which keeps extensions outside the core process.

How each platform is built and deployed

Medusa and Saleor both run as headless commerce backends that a self-hosting team must operate alongside a database and a cache. The cards below set out the stack, the services each one needs, the production setup and what those choices mean for day-to-day operations.

Medusa core stack

Medusa is built with Node.js and TypeScript on PostgreSQL, with modules for carts, orders, product catalogs, pricing and inventory. For a team whose engineers already write TypeScript, the extension work sits in the same language as the storefront. Check that your Node.js and TypeScript skills cover the modules you plan to customize, since those modules, not the database, will decide most of the daily development work.

Medusa services and instances

A self-hosted Medusa deployment needs a PostgreSQL database, a Redis database, and two Medusa instances. One instance runs in server mode for the API and admin dashboard, and the other runs in worker mode for background tasks. Plan for both instances to be deployed, monitored and scaled separately, because a healthy API does not prove that background jobs are running.

Medusa production configuration

Production replaces the development modules with Redis-based caching, event bus, workflow engine and locking, and uses S3 for file storage. The server and worker each need database credentials plus COOKIE_SECRET and JWT_SECRET values, and a deployment is checked through the /health endpoint. Ask your team who owns secret rotation and how the health check feeds your alerting.

Medusa migrations on each startup

Medusa runs database migrations through a predeploy script before each startup. Every release therefore changes the schema as part of deployment, so a failed migration can block a rollout. Test upgrades against a copy of production data and confirm how your deployment pipeline handles a rollback when a migration has already run.

Saleor core stack and services

Saleor is built on Python, Django, GraphQL and PostgreSQL. Running it needs the API, the Dashboard, PostgreSQL, Valkey or Redis, and Celery workers. Every storefront and back-office integration goes through the GraphQL API, so teams that already run Django or Python services will recognize most of the operating model, while teams without those skills should budget for them.

Saleor configuration and local setup

Saleor is configured through environment variables that follow 12-factor app principles, and the Docker Compose setup asks for at least 5 GB of memory for Docker. That memory floor applies to local evaluation and must be checked against your staging and production sizing, not treated as a production estimate. Confirm with your platform team how Dashboard, API and Celery containers will be sized and restarted.

Capability comparison from supplied facts

This table compares how Medusa and Saleor handle the API, stack, data, channels, fulfillment, extensions, hosting and licensing. Where a capability is not covered by our researched sources, the cell tells you what to confirm with the vendor. Use it to narrow the shortlist, then test the rows that matter most to your catalog and operating model.

CapabilityMedusaSaleor
API styleModular commerce framework with its own API and admin dashboard; confirm endpoint coverage against your integrationsEverything exposed through a GraphQL API; the Dashboard is a client of that API
Language and frameworkNode.js and TypeScriptPython and Django
DatabasePostgreSQL, with Redis for caching, event bus, workflows and locking in productionPostgreSQL, with Valkey or Redis and Celery workers
Channels and currenciesMulti-store and B2B support are documented; confirm per-channel pricing depth for your modelPer-channel pricing, currencies and stock across channels
Warehouses and fulfillmentInventory is a core module; confirm multi-warehouse rules for your fulfillment modelMulti-warehouse fulfillment and stock per warehouse
Payments, returns and promotionsConfirm split payments, returns and promotion rules with the vendor for your flowsSplit payments, returns, multi-gateway support, and a promotion engine with sales, vouchers, cart rules and gift cards
Extension mechanismModules and workflows in the TypeScript codebase; confirm upgrade impact of custom modulesWebhooks, apps, metadata and API extensions, not in-process plugins
Configuration modelEnvironment variables including database credentials, COOKIE_SECRET and JWT_SECRET for server and workerEnvironment variables following 12-factor app principles
Managed cloud optionMedusa Cloud managed hosting or self-hostedSaleor Cloud managed hosting or self-hosted with Docker
Core licensingMIT core; Enterprise Edition RBAC features need a commercial agreement with MedusaJS, Inc.BSD-3-Clause for the platform; confirm any paid Saleor Cloud terms with the vendor

How extensions differ in practice

Medusa extends in process. Custom behavior is written as TypeScript modules that plug into the framework's module system for carts, orders, product catalogs, pricing and inventory, and multi-step business logic runs on its workflow engine. Because that code lives in the same codebase as the framework, a team that adds a custom discount rule or a B2B approval step changes code it builds and deploys itself. A self-hosted deployment runs one instance in server mode for the API and admin dashboard and one in worker mode for background tasks, and each release runs the predeploy migration script before startup. An upgrade therefore means merging framework changes into your modules, rerunning migrations and testing both instances together. Medusa is the stronger fit when one TypeScript team owns the storefront, backend and extensions and wants commerce logic in one codebase.

Saleor extends from outside the core process. Webhooks notify your service when events occur, apps run as separate services that call the GraphQL API, and metadata stores your own fields on core objects. Your extensions do not sit inside Saleor's Python and Django code, so an upgrade mainly tests the API contract and webhook payloads your services depend on. The cost is that checkout logic which waits on an extension inherits that service's latency, timeouts and failure modes. Before relying on a webhook in checkout, confirm which events block the flow, how the app behaves on timeout and retry, and which GraphQL schema changes each release notes. Testing shifts toward contract and integration tests against a running stack, and the apps can be written in Python or in any language that speaks GraphQL and HTTP.

What the license and editions cover for each platform

Medusa is an open-core project. The core commerce framework is released under the MIT license, so teams can self-host, modify and deploy it inside their own infrastructure without a license fee for that core. The paid boundary sits around Enterprise Edition features based on role-based access control, which require a commercial agreement with MedusaJS, Inc. Medusa Cloud is the managed hosting option and is offered alongside self-hosting rather than replacing it.

  • MIT core: The framework code that handles carts, orders, product catalogs, pricing and inventory is MIT licensed, which permits internal modification and commercial use under the license terms.
  • Enterprise RBAC features: Role-based access control features in the Enterprise Edition need a commercial agreement with MedusaJS, Inc. If your access model depends on those features, that agreement is a dependency for your go-live plan.
  • Medusa Cloud: Managed hosting is available as Medusa Cloud. Ask whether your data residency, network and backup requirements can be met on the managed service or only on a self-hosted deployment.
  • Self-hosted operation: Self-hosting needs PostgreSQL, Redis and separate server and worker instances. The license is free, but your infrastructure, upgrades and security operations are your cost.
  • Upgrade exposure: Check how Enterprise features are versioned against core releases, such as the v2.21.2 line released on September 28, 2026, so you know which upgrades touch licensed code.

Before you commit, request the written license and edition terms from MedusaJS, Inc., including what the Enterprise agreement covers, how it is priced and renewed, and what support is included. Confirm in writing which features your access model needs.

What drives the running cost of each platform

Running cost for Medusa and Saleor comes from the same few places: the services you host, the people who operate and extend them, and how you pay for the vendor features and support you need. The cards below separate what is one-time from what recurs, and name who gets paid in each case so you can build a like-for-like quote.

Infrastructure footprint

A self-hosted Medusa deployment needs PostgreSQL, Redis, and two Medusa instances: one in server mode for the API and admin dashboard and one in worker mode for background tasks. Production also means S3 for file storage. Saleor needs the API, the Dashboard, PostgreSQL, Valkey or Redis, and Celery workers, and its Docker Compose setup asks for at least 5 GB of memory for Docker. Count each process and managed service in both designs, then price them at your expected peak, not in development.

Engineering skills and staffing

Medusa is built on Node.js and TypeScript, so teams with frontend or Node engineers can extend it in the same language they already use. Saleor is Python and Django with a GraphQL API, which favors teams with Python backend experience. Staffing cost is usually the largest recurring line, so estimate who builds customizations, who handles upgrades, and who is on call for the workers and queues in each option.

Enterprise agreement for RBAC

Medusa's core is MIT licensed, but Enterprise Edition features based on role-based access control require a commercial agreement with MedusaJS, Inc. If your access model needs RBAC, that fee recurs and belongs in the comparison. Saleor's licensing does not carry a comparable gated feature in the sources reviewed here, so confirm with Saleor which access controls you need and whether they are in the open release or a paid offering.

Managed cloud versus self-hosted operations

Both vendors offer a managed cloud option alongside self-hosting. Managed hosting shifts server operations to the vendor and adds a subscription. Self-hosting removes that subscription but keeps patching, backups, scaling and monitoring with your team or your implementation partner. Ask each vendor what the managed plan includes, which usage limits apply, and what happens to your data and configuration if you move off it later.

Upgrade and migration effort

Each release changes migrations, APIs or extension points, so upgrades recur. Medusa runs database migrations through a predeploy script before each startup, which makes migration timing part of your release process. Saleor extends through webhooks and apps rather than in-process plugins, so custom logic may need rework when the API changes. Budget a regular upgrade cycle for either platform, and ask for the upgrade path in writing.

Support and retainer options

Support can be bought from the vendor, from a hosting provider, or from an implementation partner. DeployOpen plans, implements, integrates, upgrades and supports self-hosted open-source platforms in the client's own infrastructure, and ongoing support, upgrades and continuous testing are available as retainers. Most engagements are fixed-scope with scope, deliverables and timelines agreed in writing. Ask every bidder to split one-time build work from monthly or annual retainer work.

Moving from one platform to the other

The sequence below moves a live Medusa or Saleor store to the other platform without losing catalog, customer, order or payment continuity. It ends with a cutover you can verify and roll back.

  1. Inventory the store and its integrations

    The commerce team and the platform engineers list every catalog attribute, product variant, price list, channel, warehouse, customer group, order status, promotion and payment gateway in use today. They also list every webhook, subscriber, scheduled job, custom API route and third-party integration that reads or writes commerce data. The output is a written inventory that marks each item as data to move, logic to rebuild or behavior to retire. The step is done when the business owner signs off on that list.

  2. Decide what transfers as data

    Sort the inventory into records that can be exported and imported, such as products, categories, customers, addresses and historical orders, and configuration that must be recreated by hand. Check each platform's data model for the matching objects, since channel pricing, warehouse stock and promotion rules rarely map one to one. Test a sample import in a non-production instance and record which fields lose meaning or need transformation. The step is done when a sample migration reconciles product counts, prices and stock against the source.

  3. Rebuild extensions as modules, apps or webhooks

    Medusa extends commerce through its own module and workflow model, while Saleor extends through webhooks, apps, metadata and API extensions rather than in-process plugins. Platform engineers redesign each custom behavior from the inventory to fit the target model, which is usually the largest rebuild cost in either direction. Plan payment, tax and fulfillment logic for the target model, and confirm it in writing with the team that owns each integration. The step is done when every retired or rebuilt extension has a named owner and a passing test.

  4. Rewrite storefront and client API calls

    Storefront and mobile developers replace existing calls with the target platform's API. Saleor exposes everything through GraphQL, so queries, fragments and client code are written against its schema. Medusa's storefront contracts follow its own API structure, so any client that depends on the current endpoints needs a matching update and contract tests. Keep a mapping document from old endpoints to new ones so reviewers can trace each change. The step is done when the storefront passes end-to-end checkout tests against the new API in a staging environment.

  5. Migrate customers, orders and payment connections

    Move customer accounts and historical orders according to the data decisions made earlier, and confirm how payment gateways, stored payment tokens and refund paths work on the target platform before any live transaction runs there. Involve the payment provider and the compliance owner, because token portability and card data handling often limit what can be moved directly. Record which open orders remain on the source system until fulfillment closes. The step is done when test payments, refunds and order lookups succeed on the target platform with reconciled records.

  6. Run both platforms in parallel

    Operate the source and target stores side by side for a period the business agrees in writing, with new orders and catalog changes checked against both systems. Compare order totals, tax, stock levels and promotion results daily, and log every discrepancy with its root cause. Keep the source store writable until the team is satisfied with reconciliation, and document who can approve each change. The step is done when discrepancy logs show no unexplained differences for the agreed observation window.

  7. Cut over and verify the live store

    Freeze catalog and order changes on the source, run a final incremental data sync, switch DNS, payment callbacks and webhooks to the target, and confirm health checks on each running service. Medusa's self-hosted setup expects a server instance, a worker instance and a /health check, and Saleor expects its API, Dashboard and Celery workers to be running and reachable before traffic moves. Keep a tested rollback path to the source until the store has processed live orders cleanly. The step is done when live transactions, fulfillment and reporting run on the target and the rollback path is retired by written approval.

What implementing each platform involves and where projects run long

A Medusa build starts with two deployable Node.js processes: one in server mode for the API and admin dashboard, and one in worker mode for background tasks. Both connect to the same PostgreSQL database and a Redis instance. In production, Redis takes over caching, the event bus, the workflow engine and locking, and S3 holds uploaded files, so the team must provision and secure both before the first deploy. Custom behavior lives in TypeScript modules and workflows, which means the team needs developers comfortable with that model. Migrations run through a predeploy script before each startup, so decide how schema changes are reviewed and how a failed migration is rolled back. Confirm in writing who owns worker sizing, the S3 bucket policy and the rotation process for COOKIE_SECRET and JWT_SECRET. The Medusa deployment documentation is the reference for these components.

A Saleor build centers on the GraphQL API, which the storefront and integrations call, plus the Dashboard, PostgreSQL, Valkey or Redis, and Celery workers. Extensions go through webhooks, apps and metadata, not in-process plugins, so most custom logic becomes a separate service that the team must version, deploy and monitor. Django and Python skills are needed for model-level changes and app development, and Celery queues need their own decisions on retries, concurrency and monitoring. The Saleor Docker Compose setup asks for at least 5 GB of memory for Docker, which describes a local starting point and says little about production capacity. Ask the implementer to show the production topology, where each service is hosted, and how configuration is passed through environment variables under 12-factor practice.

Projects usually run long in four places: payment and tax integrations, data migration, custom promotion rules and identity integration with the client's existing directory. Saleor's promotion engine covers sales, vouchers, cart rules and gift cards, so the open question is whether the required rules fit those types or need custom code. Medusa's pricing and cart modules raise the same question, and bespoke rules become custom TypeScript work on either platform. Each payment gateway, split payment flow and tax engine needs sandbox testing and reconciliation. Migrating catalogs, customers and order history is often the hardest estimate to make. Directory integration determines how administrators sign in and which roles they receive, so it needs a named owner on both sides. Before work starts, require a written scope that lists each dependency, its system owner, the test environment and the acceptance criteria.

Questions buyers ask before choosing Medusa or Saleor

How much does it cost to self-host Medusa or Saleor?

Both codebases are free to use under their licenses, so the cost is mostly infrastructure and labor. Medusa's MIT core carries no license fee, and Saleor is BSD-3-Clause. Recurring costs come from the cloud account or data center, PostgreSQL, Redis or Valkey, file storage, and the people who run upgrades. Medusa needs a separate worker instance, and the Saleor Docker Compose setup asks for at least 5 GB of memory for Docker. Paid features differ: Medusa's Enterprise Edition RBAC requires a commercial agreement with MedusaJS, Inc. No supplied fact gives hosting or support prices, so ask each vendor for current pricing. In a written quote, request a bill of materials for every instance and service, a list of what is one-time versus recurring, and the upgrade and support items included.

How long does a Medusa or Saleor implementation take?

No researched duration is available for either platform, so any timeline should come from a written scope. The main drivers are the number of sales channels, warehouses, payment gateways and tax or shipping rules, the volume of product data to migrate, and the custom modules or apps you need. Saleor includes split payments, returns, multi-warehouse fulfillment, multi-gateway payment support and a promotion engine, so configuration work can grow quickly. Medusa's B2B, marketplace and point-of-sale needs add similar scope. Fixed-scope engagements from DeployOpen agree scope, deliverables and timelines in writing before work starts. Ask for milestones, acceptance tests for each integration, and a named list of out-of-scope items.

What skills does an in-house team need to run Medusa or Saleor?

The skills follow the stack each platform uses. For Medusa, the team needs:

  • Node.js and TypeScript for the server, worker and custom modules
  • PostgreSQL, Redis and S3 administration for production
  • Deployment practice, since migrations run through a predeploy script before each startup

For Saleor, the team needs:

  • Python and Django for backend changes, plus GraphQL for integrations
  • PostgreSQL, Valkey or Redis, and Celery worker operations
  • Docker and environment-variable configuration under 12-factor principles

Both platforms need someone who can manage secrets. A Medusa deployment requires COOKIE_SECRET and JWT_SECRET values for each server and worker. Confirm storefront skills separately, since the supplied facts do not cover them.

Can a small team run Medusa or Saleor on its own?

A small team can run either platform alone if it has the skills above and accepts the operating load. Medusa requires a PostgreSQL database, a Redis database, a server instance and a worker instance. Saleor requires its API, Dashboard, PostgreSQL, a cache, and Celery workers. Each adds components to monitor, back up and patch. A practical runbook should cover database backups, failed migrations, rollback steps, and health checks, including Medusa's /health endpoint. Managed hosting from Medusa Cloud or Saleor Cloud removes some of that operating load, but it changes control and cost. DeployOpen offers ongoing support, upgrades and continuous testing as retainers, which can cover a team that needs help after launch. Confirm the on-call expectations with the vendor before you commit.

How is identity and SSO usually added to Medusa or Saleor?

The supplied facts do not document SSO support for either platform, so confirm it in each vendor's current documentation before design work starts. Medusa's role-based access control sits in the Enterprise Edition, which requires a commercial agreement, so ask whether staff access and role mapping are included in that agreement. Saleor extends through webhooks, apps and metadata, which is the usual place to connect an external identity service, but confirm how staff sign-in and permissions are handled. Write the requirements down: which identity provider, how staff roles map to store permissions, how sessions expire, and how admin actions are logged. Both platforms rely on secrets for session handling, so include those values in the security review.

How hard is it to switch away from Medusa or Saleor later?

Both platforms store commerce data in PostgreSQL, so a database export is a starting point, but the custom code is usually the harder part. In Medusa, custom modules, workflows and storefront calls are written in TypeScript against Medusa's framework. In Saleor, integrations are built on GraphQL, webhooks, apps and metadata, which keeps much logic outside the core and can make replacement of individual integrations simpler. Switching effort also depends on order history, promotions, per-channel pricing, tax rules and payment gateway tokens, which may not move cleanly. Before you commit, ask for an exit plan in the written scope: export formats, order and customer history retention, and an inventory of every custom extension and integration.

How DeployOpen helps choose, implement or migrate

DeployOpen plans, implements, integrates, hardens, documents and supports self-hosted open-source platforms inside your own cloud accounts, data centers or air-gapped networks. For Medusa vs Saleor, we start from your team's language skills, hosting constraints and integration needs, then agree the work in writing before anything is built.

How we scope

  • Written scope names the storefront, channels, payment gateways and warehouses in play for your Medusa or Saleor deployment.
  • We record which Medusa or Saleor services you will run, such as PostgreSQL, Redis or Valkey, and background workers.
  • Engagements are fixed-scope, so deliverables and timelines are agreed in writing before work starts.

How we build

  • We deploy Medusa server and worker instances, or the Saleor API, Dashboard and Celery workers, in your environment.
  • We configure secrets, environment variables and storage, then wire your extensions through the chosen model for each platform.
  • We run security testing on the APIs and admin surfaces before go-live, and report findings with fixes in scope.

How we hand over

  • Deliverables include architecture notes, runbooks for migrations, backups and upgrades, and a record of configuration decisions.
  • We document the extension points your developers will maintain, so the team understands what each customization depends on.
  • Handover sessions walk your operators through health checks, release steps and rollback procedures for your platform.

How we support

  • Ongoing support, upgrades and continuous testing are available as retainers after handover.
  • Retainers can cover version upgrades, such as tracking new Medusa or Saleor releases, against your own change process.
  • Compliance readiness work prepares systems and evidence for an assessment, but independent auditors issue any audit report or certification.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.