Vendure Knowledge Patch
Use this skill when implementing or upgrading a Vendure server, Shop or Admin
API, Dashboard extension, storefront integration, payment or email integration,
or operational tooling. Check the breaking-change notes first, then open only
the reference that matches the work.
Reference index
| Reference |
Topics |
| security-and-access.md |
Security fixes, production credentials, external login linking, API keys, row-level access, proxy and password policy, customer assignment |
| catalog-assets-and-search.md |
Channels, stock, shared options, assets, search and list filters, custom fields, translation fallbacks |
| orders-checkout-and-payments.md |
Cart mutations, order strategies and atomicity, promotions, tax, payments, shipping, order events |
| dashboard-and-project-tooling.md |
CLI, scaffolding, Dashboard packaging and builds, routing, extensions, forms, tables, merchant workflows |
| platform-configuration-and-operations.md |
Settings Store, migrations, lifecycle hooks, jobs, telemetry, GraphiQL, public exports, direct dependencies |
| integrations-and-observability.md |
Email, Mollie, Stripe, Sentry |
Breaking changes and upgrade checks
Replace legacy asset MIME names
The unreleased line upgrades file-type to ^21.3.1. In explicit
assetOptions.permittedFileTypes lists, replace the former x- names with:
audio/flac
video/matroska
application/vnd.apache.arrow.file
application/vnd.apache.parquet
The default wildcard list is unaffected.
Remove the default production password
From 3.7, production startup fails while the default superadmin password is
configured.
Review email templates and transports
In 3.7, the email plugin moves from MJML 4 to 5 and nodemailer 6 to 9. Review
custom templates and transports for compatibility.
Declare health-check dependencies directly
From 3.7, @nestjs/terminus is no longer supplied transitively. Custom health
checks must declare it directly.
Account for case-insensitive coupon matching
From 3.7, promotion coupon matching is case-insensitive. This breaks stores
that treated case variants as distinct coupon codes.
Replace deprecated Dashboard compatibility mode
DashboardPlugin is exported from @vendure/dashboard; the old AdminUiPlugin
compatibilityMode is deprecated.
Security-critical upgrade notes
- 3.7.2 closes unauthorized draft-line adjustment, administrator
password-reset privilege escalation, cross-channel Promotion and FacetValue
deletion, and cross-channel Asset and StockLocation writes.
- 3.6.5 addresses Dashboard XSS, SQLite list-query denial of service, and Shop
API list-data exposure.
- 3.6.4 addresses asset-import SSRF.
- 3.6.2 addresses
languageCode and Postgres-search SQL injection.
- 3.5.3 addresses native-auth timing enumeration.
Read security-and-access.md when the work
touches authentication, authorization, channel boundaries, proxy trust,
password validation, or customer assignment.
Required migrations
- The 3.4 Settings Store requires a new table.
- 3.4 adds indexes for
Order.orderPlacedAt and JobItem.createdAt.
- DefaultCachePlugin users upgrading through 3.2 need
precision(3) on
CacheItem.expiresAt.
- 3.6 provides
migrateAssetTranslationData() for the asset-translation
change.
Authentication and authorization
External account linking
A custom AuthenticationStrategy must return verified: true for a
provider-verified email before an external login can link to an existing
account. Creating a new account is unaffected.
API keys and entity access
3.6 adds core API-key authentication and Dashboard key management. API-key
sessions resolve their Administrator through the key owner.
EntityAccessControlStrategy is the extension point for row-level access
control.
Settings Store
3.4 introduces SettingsStore for global and scoped configuration. Read and
write permissions are added later, and a Dashboard management page arrives in
3.6.
Since 3.4.2, prefer the context-first service signatures; the old order remains
temporarily accepted:
SettingsStoreService.get<T>(ctx, key)
SettingsStoreService.getMany(ctx, keys)
SettingsStoreService.set<T>(ctx, key, value)
SettingsStoreService.setMany(ctx, values)
Channel-aware catalog rules
- Product lookup by slug is channel-scoped.
assignProductsToChannel assigns the Product and its variants.
- Assigning a variant to a channel seeds a
StockLevel.
- New variants inherit every channel of their Product.
- Numeric
stockOnHand writes target the active channel's stock location.
- In 3.6,
ProductOptionGroup and ProductOption are shared, channel-aware
entities; CSV import supports shared option groups, and the Dashboard has an
Option Groups management page.
Order and checkout behavior
- The Shop API adds
addItemsToOrder and a mutation for changing the active
order's currency.
AddPaymentToOrderResult can return
CouponRemovedDuringCheckoutError when checkout invalidates a coupon.
OrderTaxCalculationStrategy configures order-level tax calculation.
OrderLineDiscountDistributionStrategy controls discount proration.
OrderMergeStrategy may be asynchronous.
OrderService.mergeOrders() is atomic and concurrency-safe.
- State-machine transitions roll back atomically when a hook fails.
Read orders-checkout-and-payments.md
before changing promotion usage, tax, payment eligibility, shipping, or order
event handling.
Dashboard entry points
- New projects include the React Dashboard and can optionally scaffold a
Next.js storefront.
- Generated Dashboard configuration uses API URL
auto.
- Scaffolded projects read the server port from
VENDURE_SERVER_PORT.
- Dashboard builds support Vite 7, user stylesheets, and opt-in pre-bundling
through
useExperimentalBundle.
- Extensions can add unauthenticated routes, TanStack Router
validateSearch,
router-plugin options, bearer-token authentication, and custom React
providers.
Open dashboard-and-project-tooling.md
for shell extension points, permissions, forms, queries, tables, bulk actions,
saved views, and merchant workflows.
Operations and integration entry points
ApiOptions accepts trustProxy.
BootstrappedEvent signals server readiness, and onBeforeAppListen
exposes the Nest application immediately before listening starts.
- Scheduled tasks can be triggered manually, receive a
RequestContext, and
include a built-in database job-cleanup task.
- Job options support priority; BullMQ honors configured Redis prefixes for
queue and buffer storage.
- 3.3 introduces
@vendure/telemetry-plugin and tracing across services,
cache, scheduled tasks, and job queues.
- Email generators may be asynchronous, and
SMTPTransportOptions accepts
pooled-SMTP settings.
1---2name: vendure-knowledge-patch-23description: Vendure4license: MIT5---6789# Vendure Knowledge Patch1011Use this skill when implementing or upgrading a Vendure server, Shop or Admin12API, Dashboard extension, storefront integration, payment or email integration,13or operational tooling. Check the breaking-change notes first, then open only14the reference that matches the work.1516## Reference index1718| Reference | Topics |19|---|---|20| [security-and-access.md](references/security-and-access.md) | Security fixes, production credentials, external login linking, API keys, row-level access, proxy and password policy, customer assignment |21| [catalog-assets-and-search.md](references/catalog-assets-and-search.md) | Channels, stock, shared options, assets, search and list filters, custom fields, translation fallbacks |22| [orders-checkout-and-payments.md](references/orders-checkout-and-payments.md) | Cart mutations, order strategies and atomicity, promotions, tax, payments, shipping, order events |23| [dashboard-and-project-tooling.md](references/dashboard-and-project-tooling.md) | CLI, scaffolding, Dashboard packaging and builds, routing, extensions, forms, tables, merchant workflows |24| [platform-configuration-and-operations.md](references/platform-configuration-and-operations.md) | Settings Store, migrations, lifecycle hooks, jobs, telemetry, GraphiQL, public exports, direct dependencies |25| [integrations-and-observability.md](references/integrations-and-observability.md) | Email, Mollie, Stripe, Sentry |2627## Breaking changes and upgrade checks2829### Replace legacy asset MIME names3031The unreleased line upgrades `file-type` to `^21.3.1`. In explicit32`assetOptions.permittedFileTypes` lists, replace the former `x-` names with:3334- `audio/flac`35- `video/matroska`36- `application/vnd.apache.arrow.file`37- `application/vnd.apache.parquet`3839The default wildcard list is unaffected.4041### Remove the default production password4243From 3.7, production startup fails while the default superadmin password is44configured.4546### Review email templates and transports4748In 3.7, the email plugin moves from MJML 4 to 5 and nodemailer 6 to 9. Review49custom templates and transports for compatibility.5051### Declare health-check dependencies directly5253From 3.7, `@nestjs/terminus` is no longer supplied transitively. Custom health54checks must declare it directly.5556### Account for case-insensitive coupon matching5758From 3.7, promotion coupon matching is case-insensitive. This breaks stores59that treated case variants as distinct coupon codes.6061### Replace deprecated Dashboard compatibility mode6263`DashboardPlugin` is exported from `@vendure/dashboard`; the old AdminUiPlugin64`compatibilityMode` is deprecated.6566## Security-critical upgrade notes6768- 3.7.2 closes unauthorized draft-line adjustment, administrator69 password-reset privilege escalation, cross-channel Promotion and FacetValue70 deletion, and cross-channel Asset and StockLocation writes.71- 3.6.5 addresses Dashboard XSS, SQLite list-query denial of service, and Shop72 API list-data exposure.73- 3.6.4 addresses asset-import SSRF.74- 3.6.2 addresses `languageCode` and Postgres-search SQL injection.75- 3.5.3 addresses native-auth timing enumeration.7677Read [security-and-access.md](references/security-and-access.md) when the work78touches authentication, authorization, channel boundaries, proxy trust,79password validation, or customer assignment.8081## Required migrations8283- The 3.4 Settings Store requires a new table.84- 3.4 adds indexes for `Order.orderPlacedAt` and `JobItem.createdAt`.85- DefaultCachePlugin users upgrading through 3.2 need `precision(3)` on86 `CacheItem.expiresAt`.87- 3.6 provides `migrateAssetTranslationData()` for the asset-translation88 change.8990## Authentication and authorization9192### External account linking9394A custom `AuthenticationStrategy` must return `verified: true` for a95provider-verified email before an external login can link to an existing96account. Creating a new account is unaffected.9798### API keys and entity access991003.6 adds core API-key authentication and Dashboard key management. API-key101sessions resolve their `Administrator` through the key owner.102`EntityAccessControlStrategy` is the extension point for row-level access103control.104105## Settings Store1061073.4 introduces `SettingsStore` for global and scoped configuration. Read and108write permissions are added later, and a Dashboard management page arrives in1093.6.110111Since 3.4.2, prefer the context-first service signatures; the old order remains112temporarily accepted:113114```ts115SettingsStoreService.get<T>(ctx, key)116SettingsStoreService.getMany(ctx, keys)117SettingsStoreService.set<T>(ctx, key, value)118SettingsStoreService.setMany(ctx, values)119```120121## Channel-aware catalog rules122123- Product lookup by slug is channel-scoped.124- `assignProductsToChannel` assigns the Product and its variants.125- Assigning a variant to a channel seeds a `StockLevel`.126- New variants inherit every channel of their Product.127- Numeric `stockOnHand` writes target the active channel's stock location.128- In 3.6, `ProductOptionGroup` and `ProductOption` are shared, channel-aware129 entities; CSV import supports shared option groups, and the Dashboard has an130 Option Groups management page.131132## Order and checkout behavior133134- The Shop API adds `addItemsToOrder` and a mutation for changing the active135 order's currency.136- `AddPaymentToOrderResult` can return137 `CouponRemovedDuringCheckoutError` when checkout invalidates a coupon.138- `OrderTaxCalculationStrategy` configures order-level tax calculation.139- `OrderLineDiscountDistributionStrategy` controls discount proration.140- `OrderMergeStrategy` may be asynchronous.141- `OrderService.mergeOrders()` is atomic and concurrency-safe.142- State-machine transitions roll back atomically when a hook fails.143144Read [orders-checkout-and-payments.md](references/orders-checkout-and-payments.md)145before changing promotion usage, tax, payment eligibility, shipping, or order146event handling.147148## Dashboard entry points149150- New projects include the React Dashboard and can optionally scaffold a151 Next.js storefront.152- Generated Dashboard configuration uses API URL `auto`.153- Scaffolded projects read the server port from `VENDURE_SERVER_PORT`.154- Dashboard builds support Vite 7, user stylesheets, and opt-in pre-bundling155 through `useExperimentalBundle`.156- Extensions can add unauthenticated routes, TanStack Router `validateSearch`,157 router-plugin options, bearer-token authentication, and custom React158 providers.159160Open [dashboard-and-project-tooling.md](references/dashboard-and-project-tooling.md)161for shell extension points, permissions, forms, queries, tables, bulk actions,162saved views, and merchant workflows.163164## Operations and integration entry points165166- `ApiOptions` accepts `trustProxy`.167- `BootstrappedEvent` signals server readiness, and `onBeforeAppListen`168 exposes the Nest application immediately before listening starts.169- Scheduled tasks can be triggered manually, receive a `RequestContext`, and170 include a built-in database job-cleanup task.171- Job options support priority; BullMQ honors configured Redis prefixes for172 queue and buffer storage.173- 3.3 introduces `@vendure/telemetry-plugin` and tracing across services,174 cache, scheduled tasks, and job queues.175- Email generators may be asynchronous, and `SMTPTransportOptions` accepts176 pooled-SMTP settings.