🚨 Announcing Vendure v2 Beta

← Back to the blog

Announcing Vendure v1.8

Author avatar
October 25, 2022
Michael Bromley

Version 1.8 of the open-source headless commerce framework Vendure is available now! This release includes some long-requested features that bring a new level of power and capability to your Vendure projects.

v1.8.0 Changelog

Codename: Montpellier

As we recently announced in our blog post on our new product roadmap, each minor release is now named after a city. This release is Montpellier, a beautiful city in the south of France rich in history, culture and boasting an enviable Mediterranean climate. It is also the location of Swile, one of Vendure’s largest users with a team of active contributors, including contributions to this release!

Place de la Comédie, Montpellier

Place de la Comédie, Montpellier

Upgrading from v1.x.x

This minor release contains no breaking schema or GraphQL API changes, so updating should be a matter of changing all @vendure/... dependencies in your package.json file to 1.8.1.

  "dependencies": {
-    "@vendure/admin-ui-plugin": "1.7.4",
-    "@vendure/asset-server-plugin": "1.7.4",
-    "@vendure/core": "1.7.4",
-    ... etc
+    "@vendure/admin-ui-plugin": "1.8.1",
+    "@vendure/asset-server-plugin": "1.8.1",
+    "@vendure/core": "1.8.1",
+    ... etc
  "devDependencies": {
-    "@vendure/testing": "1.7.4", 
+    "@vendure/testing": "1.8.1",

Also see the Updating Vendure guide for more information.

Draft orders

Draft orders allow your administrators to create an order on behalf of a customer via the Admin UI. Common reasons to create draft orders include:

  • Manually create an order when a customer calls or arrives in person
  • Creating an order on behalf of a customer for a quote-based workflow
  • Testing out promotions

A draft order is created using the new “create draft order” button in the Admin UI order list view.

From there you’ll be taken to a screen from which you can populate the order with products and set the customer, shipping and billing details. Once complete, the order can transition to the ArrangingPayment state from which a payment may be added.

Draft order editor

Draft order editor

Note: the draft order feature works by defining a new state in the order state machine. If you have customized your order process, you may not see the “draft” options in the Admin UI. In this case, you must alter your custom order state definition to enable a transition from Created to Draft.

Rich text table & embeds support

The rich text editor used for product & collection descriptions now supports HTML tables as well as iframe embeds.

To insert a table, use the “insert” menu item in the rich text controls area. You will also notice that each “block” in the editor now features a context menu icon in the top left corner. Clicking this icon will bring up available actions for the given block. If the cursor is inside a table cell, then you will see table-related actions. All blocks also feature an “edit html” context menu item, which allows you to directly edit the block’s HTML content.

Note that not all HTML tags are supported, but with this update we now support the <iframe> tag, which allows you to embed videos and other interactive content directly into your descriptions.

Adding a table to a rich text input

Adding a table to a rich text input

Bulk Actions

You’ll now notice that the products, facets & collections list views in the Admin UI feature checkboxes to allow you to select multiple items. Once selected, a new bulk action menu will become visible at the top of the list. This list contains context-aware actions that can be performed on the selected items, such as bulk deletion or assigning to other channels.

Adding a table to a rich text input

Adding a table to a rich text input

Furthermore, it is possible to define your own custom bulk actions, including custom UI components to control how they behave. This feature unlocks a whole world of possibilities including things like:

  • Sending multiple products to a 3rd-party localization service
  • Exporting selected products to csv
  • Bulk-updating custom field data

To find out more about how to create custom bulk actions, see our new Bulk Actions documentation page.

Channel assignment for Facet & Collection

Building on top of the new Bulk Actions feature, it is now possible to control assignment of facets and collections to other channels via the Admin UI.

If you have multiple channels set up on your Vendure server, you should see channel assignment options in the bulk actions context menu for products, facets and collections.

Promotion API improvements

Vendure’s powerful promotions API has seen a couple of big additions:

First of all, we’re launching a brand-new “side effects API” which can be used by PromotionActions to define additional behavior apart from just modifying the price. The motivating use-case was how to elegantly and robustly support the very common requirement of adding a free gift to an order. This is achieved by defining the new onActivate and onDeactivate functions on a PromotionAction, which perform the work of adding the free gift to the order when a promotion becomes active, and removing it once the promotion is no longer active.

A full code listing for this can be found in the new Free gift promotions example docs.

Note: the new side effect API functions are marked as experimental. Due to the rather complex nature of this mechanism, we want to provide a period of testing before we settle on a final API design. The current design will only change if it is found to be unworkable for some reason. Experimental APIs are a new initiative which allows us to ship new features faster for those developers who are happy to opt in to testing them out.

Secondly, all PromotionCondition & PromotionAction functions now have access to the associated Promotion entity, which is passed as the final argument to the check and execute functions. This addition unlocks some more advanced types of promotions, for instance, where a particular promotion may only be applied to a single OrderLine.

Other notable changes

  • The Admin UI collection detail view now displays a full breadcrumb of the current collection, making it easier to find the context and jump to parent collections.
  • Numerous improvements have been made to the EmailPlugin: languageCode can now be overridden; custom EmailGenerators and EmailSenders are now injectable; the SMTP transport now supports the full range Nodemailer options.
  • The MolliePlugin now supports pre-selecting the payment method type, which can make for a smoother checkout experience for your customers.
  • The ElasticsearchPlugin has been optimized to use much less memory when performing a reindex operation.


I’d like to thank the wonderful Vendure community who contribute their ideas, bug reports, and code to the project daily. This release includes code contributions by:

  • Alexander Shitikov:
    • refactor(core): Use existing function to update product variant price (#1762)
    • feat(core): Pass order arg to OrderItemPriceCalculationStrategy and ChangedPriceHandlingStrategy (#1749)
  • Alexis Vigoureux:
    • fix(core): Export TranslatorService helper from core (#1826)
    • perf(elasticsearch-plugin): Reduce memory usage when deleting products (#1838)
    • perf(elasticsearch-plugin): Reduce memory usage when indexing products (#1839)
  • Artem Danilov:
    • fix(create): Fix default migration path of scaffold (#1759)
    • feat(core): Add Facet/Collection Channel assignment mutations
  • Conor Burns:
    • fix(core): Password change checks pw validity (#1745)
  • Gustavo Alves:
    • fix(core): Fix delete order method when called with id (#1751)
  • Harrison Bowers:
    • fix(core): Order fixed discount considers channel pricesIncludeTax (#1841)
  • Hendrik Depauw:
    • feat(email-plugin): Allow to override email language (#1775)
    • feat(core): Export prorate function (#1783)
    • feat(email-plugin): Use full Nodemailer SMTPTransport options (#1781)
  • Karel Van De Winkel:
    • fix(core): Persist customField relations in PromotionService (#1822)
  • Martijn van de Brug:
    • fix(testing): Correctly apply beforeListen middleware on TestServer (#1802)
    • feat(payments-plugin): Add Mollie paymentmethod selection (#1825)
  • William Pain:
    • fix(core): ‘productVariantId’ in group statement is ambiguous (#1793)
Author avatar
Written by
Michael Bromley
Michael is the creator of Vendure. He lives in Vienna, Austria.
Twitter logo GitHub logo