Skip to content

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.

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
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:

Terminal window
pnpm --filter @nexus/vendure-sdk codegen

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.

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
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

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
Terminal window
# Worker entry point
node dist/index-worker.js

Migrations run via TypeORM CLI:

Terminal window
pnpm --filter vendure-server migrate

TypeORM manages schema evolution. The Vendure DB is separate from the scheduler DB (different Neon project).

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.