vendure-server + vendure-worker
apps/vendure-server is a Vendure 3.6.3 (NestJS)
headless commerce server. apps/vendure-worker is its paired BullMQ job
processor. Together they handle the e-commerce layer: catalog, cart, checkout,
orders, and Stripe payments.
Overview
Section titled “Overview”| Attribute | Value |
|---|---|
| Framework | Vendure 3.6.3 (NestJS) |
| Port | 3001 |
| ORM | TypeORM on PostgreSQL (Neon in prod) |
| Queue | BullMQ on Redis (shared) |
| GraphQL | /shop-api (storefront) + /admin-api (ops) |
| Assets | Cloudflare R2 (MinIO locally) |
| Auth | Vendure’s built-in auth + WorkOS session mapping |
GraphQL surfaces
Section titled “GraphQL surfaces”| Endpoint | Consumer | Description |
|---|---|---|
/shop-api |
@nexus/vendure-sdk, sites |
Storefront: products, cart, checkout, orders |
/admin-api |
vendure-sdk (admin ops), convergence activities |
Catalog management, order admin |
The @nexus/vendure-sdk package wraps both surfaces with GraphQL Codegen +
React Query hooks. Schemas are introspectable from a live server:
pnpm --filter @nexus/vendure-sdk codegenMulti-tenancy via channels
Section titled “Multi-tenancy via channels”Vendure uses channels as its multi-tenancy primitive. Each tenant/business maps to one or more channels, scoping which products, orders, and pricing they see.
Key plugins
Section titled “Key plugins”| Plugin | What it does |
|---|---|
@vendure/asset-server-plugin |
File upload + serving (proxied to R2/MinIO) |
@vendure/email-plugin |
Transactional emails (order confirm, etc.) |
@vendure/job-queue-plugin |
BullMQ integration |
@vendure/payments-plugin |
Stripe payment provider (multi-currency) |
| Admin UI plugin | Embedded admin panel at /admin |
Data in / out
Section titled “Data in / out”graph LR
subgraph "Inbound"
Sites[site-* / vendure-sdk]
SA_IN[scheduler-api\nconvergence activities]
Webhooks[Stripe webhooks]
end
VS[vendure-server]
subgraph "Outbound"
NV[(Neon\nVendure DB / TypeORM)]
RD[(Redis / BullMQ)]
R2[(R2 / MinIO\nassets)]
STR[Stripe API]
VW[vendure-worker\n← queued jobs]
end
Sites --> VS
SA_IN -->|GraphQL mutations| VS
Webhooks --> VS
VS --> NV
VS --> RD
VS --> R2
VS --> STR
VS --> VW
vendure-worker
Section titled “vendure-worker”The worker process runs separately (apps/vendure-worker/) and consumes the
same Redis queues as vendure-server. It handles:
- Email sending — order confirmations, fulfillment updates
- Catalog indexing — search index updates when products change
- Fulfillment processing — async order state transitions
# Worker entry pointnode dist/index-worker.jsDatabase migrations
Section titled “Database migrations”Migrations run via TypeORM CLI:
pnpm --filter vendure-server migrateTypeORM manages schema evolution. The Vendure DB is separate from the scheduler DB (different Neon project).
Relationship to scheduler-api
Section titled “Relationship to scheduler-api”Vendure and scheduler-api are kept in sync by the convergence flow.
When a booking is confirmed in scheduler-api, a convergence workflow can create
a matching Vendure order. When a Vendure order ships, the scheduler mirrors
the status. They do not share a database.