Skip to main content
Extensibility & APIs

Plugins, custom data, and GraphQL extensions. In TypeScript, no forking.

The same TypeScript primitives on Vendure Core and Platform, self-hosted or on Cloud. Plugins as NestJS modules, strategy patterns, custom fields and entities, GraphQL schema extensions.

~/projects/my-shop
loyalty.plugin.ts
custom-fields.ts
import { VendurePlugin, PluginCommonModule } from '@vendure/core';
import { LoyaltyService } from './loyalty.service';
import { LoyaltyAccount } from './loyalty-account.entity';
import { OrderCodeStrategy } from './order-code.strategy';
import { shopApiExtensions } from './loyalty.resolver';
 
@VendurePlugin({
imports: [PluginCommonModule],
providers: [LoyaltyService],
entities: [LoyaltyAccount],
shopApiExtensions,
configuration: config => {
config.customFields.Customer.push({
name: 'loyaltyPoints',
type: 'int',
});
config.orderOptions.orderCodeStrategy = new OrderCodeStrategy();
return config;
},
})
export class LoyaltyPlugin {}
shop-api schema
extend type Customer {
loyaltyPoints: Int!
}
 
type LoyaltyAccount {
id: ID!
balance: Int!
tier: LoyaltyTier!
}
 
enum LoyaltyTier {
BRONZE
SILVER
GOLD
}
 
extend type Mutation {
redeemPoints(points: Int!): LoyaltyAccount!
}
Product hero visual showing the Vendure extension model in an editor and the GraphQL API it produces.

The trade-off Vendure refuses

Closed SaaS gives you "extensibility" as a sandboxed scripting hook and a webhook contract. DIY composable stacks give you primitives to assemble yourself, and a long roadmap of glue you'll write and maintain forever.

Vendure refuses the trade-off. Plugins are first-class NestJS modules in the same backend as the core, with the same access to services, data, and APIs the core itself uses.

Same extension model on Core and Platform, self-hosted or on Cloud

You pick your edition (Core or Platform) for the capabilities that ship out of the box, and your runtime (self-hosted or Cloud) for operational fit. Code targeting Core runs unchanged on Platform, and the same plugins run identically self-hosted or on Vendure Cloud. The extension API stays the same on every combination.

The model your team writes against is what Vendure's enterprise plugins are also built on. The enterprise suite is proof at scale that the model holds up under production-grade features.

Extension primitives

What you change, and how

Five primitives cover most of what a real commerce business needs to model and customise. Each one is plain TypeScript, typed end to end, and works the same way on Core or Platform, self-hosted or on Cloud.

Plugins as NestJS modules

A Vendure plugin is a TypeScript class with a decorator on top of a regular NestJS module. Services, resolvers, entities, event handlers, scheduled tasks, all in one unit your engineers already know how to write.

Strategy patterns

Replace default behaviour without forking the core. Order codes, tax calculators, shipping eligibility, stock allocation, asset storage, password hashing. Swap the default, keep the upgrade path.

Custom fields

First-class on every core entity: order, customer, product, variant, and the rest. They propagate automatically into the GraphQL schema and the admin dashboard, with auto-rendered forms for each field type.

Custom entities

Model your own tables alongside Vendure's. Entities live next to the core, share the same migration tooling, and resolve through the same dependency injection your services use. New entity, new GraphQL types, no separate data layer to maintain.

Events, lifecycle, and jobs

Subscribe to typed commerce events. Hook into NestJS lifecycle. Schedule background work on Vendure's job queue and recover crashed jobs through the workflow engine.

Your plugin is your API

Every plugin extends the same GraphQL surface the core exposes: one introspectable schema, one codegen pipeline. The Admin API and Shop API are both extensible, both type-safe, both consumed the same way as the rest of Vendure.

Customisations live next to the core, not inside it

Plugins are your code, in your repo. The Vendure core is upgraded as a dependency, the way your team upgrades anything else. Type-safety catches breaking changes at compile time, in the plugin you wrote, not at runtime in production.

No permanent fork to rebase, no upgrade you skip because the cost is too high. Your business logic moves forward with the platform.

What enterprise looks like, built on the same model

Vendure Platform's enterprise plugins are concrete instances of the same extension API your team uses. A few shipping today:

  • Enterprise SSO. OIDC, SAML, and SCIM for admin and storefront, built on the same authentication strategy pattern your team would use to wire up a custom identity provider.
  • Audit logging. Tamper-evident records of admin actions and commerce data changes, captured through the same event bus and entity hooks any plugin can subscribe to.
  • Advanced search. Elasticsearch-backed merchandising and faceting, shipped as a search strategy plus dashboard extensions, the same primitives a custom catalogue plugin would compose.
Browse the plugin overview
Public and proven

An extension API used in production, in the open

8,100+ stars

Developers and engineering teams evaluating, prototyping, and extending Vendure.

View on GitHub

270+ contributors

From one-line fixes to entire subsystems, including extension primitives.

50K+ monthly downloads

@vendure/core pulled from npm every month, every install ready to be extended.

GPLv3 licence

Free to use, fork, and self-host under GPLv3. Vendure Platform adds a commercial licence, the enterprise plugin suite, and commercial support.

Read about the licence

Trusted by complex B2B commerce and enterprise retail.

Why teams pick Vendure

What engineering leads say about extending Vendure

Three engineering leads on the same question: can my team realistically own and extend this codebase long-term?

What convinced me about Vendure is its fundamentally well-architected codebase. It's clear, intuitive, and easy to extend, making it adaptable to virtually any use case.

Daniel Biegler from Chimpify GmbH
Daniel Biegler
CTO, Chimpify GmbH

Vendure is a breath of fresh air. Built with developers in mind, easy to extend, and well-documented. It embraces the need for customization and enabled me to deliver on time, within budget. The community support is fast and incredibly helpful.

Ludwig Göbkes from eCube
Ludwig Göbkes
Senior Software Developer, eCube

Our peer-to-peer sharing marketplace builds on proven e-commerce components, but only Vendure offered the flexibility to seamlessly integrate our complex business logic. Its modern tech stack and use of established frameworks enable us to work efficiently and build a maintainable long-term solution.

Kevin Mattutat from Fainin GmbH
Kevin Mattutat
CTO, Fainin GmbH
FAQ

What engineering leads ask before they bet on the extension model

Common questions from engineering and platform teams evaluating Vendure for a project they will extend heavily.

Ready when you are
Create a Vendure app, write your first plugin

Install Vendure locally in minutes, write a plugin with full TypeScript types, and see the same extension API the enterprise suite is built on.