VE

Vendure

Headless commerce framework built on Node.js

E-commerce Platforms ★ 8.5k stars Medium setup MIT

Vendure is an open-source, headless commerce framework written in TypeScript on top of NestJS and GraphQL. It is designed to be highly extensible for building custom B2B and B2C storefronts.

Key features

  • GraphQL-based headless API
  • Plugin-driven extensibility
  • Admin UI included
  • Multi-vendor marketplace support

Pros & cons

Strengths

  • Strong TypeScript developer experience
  • Well-documented plugin system

Trade-offs

  • Requires building your own storefront
  • Less out-of-the-box than hosted SaaS

Vendure replaces

Last reviewed Aug 26, 2026 · 760 words

The trap with Vendure is reading "open-source alternative to Shopify" and expecting a store. What you get after npx @vendure/create my-shop is an admin dashboard, two GraphQL APIs and a job queue. There is no customer-facing shop until you build one, or adapt one of the storefront starters. That is the deal: a TypeScript developer gets a commerce backend that is genuinely pleasant to extend, and a merchant without a developer gets nothing they can use.

What is in the box and what is not

Included: product catalogue with variants and facets, orders, customers, promotions, shipping and tax calculation, multi-channel and multi-currency, a role-based admin UI, and a plugin system that touches every one of those. The Admin API and the Shop API are both GraphQL, both typed, and both documented from the schema. Official plugins cover email, asset storage, Elasticsearch search, and payments through Stripe, Braintree and Mollie, with more from the community.

Not included: the storefront. Vendure publishes starters (Remix, Next.js, Angular and Qwik have all been offered at various points) that talk to the Shop API, and they are a decent day-one skeleton, but you own the checkout page, the product pages, the SEO and the design. If "I need a shop by Friday" is the brief, WooCommerce or PrestaShop get there; Vendure gets there in a few weeks with a developer who enjoys the work.

Two processes, one database

A Vendure deployment is a server process and a worker process. The server answers API requests; the worker runs the job queue for things like search index rebuilds, email sending and any long tasks a plugin adds. Running both in one container works for development and falls over in production the first time a bulk import blocks the API. Keep them separate:

services:
  server:
    build: .
    command: node dist/index.js
    ports: ["3000:3000"]
    environment: { DB_HOST: db, DB_NAME: vendure }
  worker:
    build: .
    command: node dist/index-worker.js
    environment: { DB_HOST: db, DB_NAME: vendure }
  db:
    image: postgres:16
    volumes: ["./pgdata:/var/lib/postgresql/data"]

The API listens on port 3000 by default, with the admin UI served at /admin. Vendure supports Postgres, MySQL and SQLite through TypeORM; use Postgres for anything you intend to keep, and treat the catalogue's 1,024 MB RAM minimum as the floor for server plus worker with Elasticsearch left out. Add Elasticsearch and you are at 3 GB before the first order.

Plugins are the whole point

A plugin in Vendure is a NestJS module that can add entities, extend the GraphQL schema, register admin UI extensions, subscribe to events and add jobs to the queue. That is a lot of power, and the documented patterns hold up: I have seen a "gift wrapping" custom field, a loyalty-points plugin and a marketplace split-payment flow all built without forking core. Multi-vendor marketplaces specifically are supported by channels plus the seller and order-splitting primitives, and the project ships a worked example. If your business model is odd, this is where Vendure beats the hosted platforms; you write the odd part rather than paying for a workaround app.

The cost of that flexibility is coupling. Every plugin you write pins you to Vendure's version of NestJS and TypeORM, and major upgrades have required migration work. Budget a day or two per major release for a store with a handful of custom plugins.

Where it fits against the neighbours

Medusa is the closest rival: also headless, also TypeScript, REST rather than GraphQL, with a similar "you build the storefront" stance. Saleor is GraphQL-first too but Python underneath. I lean Vendure when the team is already NestJS-literate or wants the admin UI extensible without a rewrite, and Medusa when the team prefers REST and a larger plugin marketplace. None of the three is a fit for a solo shop owner; the ecommerce category has the monolithic options for that person.

What I'd do

If you have a TypeScript developer and a product catalogue with any quirk a SaaS platform charges extra for, run Vendure on Postgres with the server and worker in separate containers behind Caddy, start from a storefront starter, and write plugins rather than forking. Give the first version 4 to 6 weeks including checkout and email. If nobody on the team writes TypeScript, do not self-host Vendure at all; put the same money into a hosted plan or WooCommerce and keep the developer time for things that make sales.

Compare Vendure

22 head-to-head comparisons.

Similar e-commerce platforms apps