The EmailPlugin creates and sends transactional emails based on Vendure events. It uses an MJML-based email generator to generate the email body and Nodemailer to send the emais.


yarn add @vendure/email-plugin


npm install @vendure/email-plugin


import { defaultEmailHandlers, EmailPlugin } from '@vendure/email-plugin';

const config: VendureConfig = {
  // Add an instance of the plugin to the plugins array
  plugins: [
    new EmailPlugin({
      handlers: defaultEmailHandlers,
      templatePath: path.join(__dirname, 'vendure/email/templates'),
      transport: {
        type: 'smtp',
        host: '',
        port: 587,
        auth: {
          user: 'username',
          pass: 'password',

Email templates

In the example above, the plugin has been configured to look in <app-root>/vendure/email/templates for the email template files. If you used @vendure/create to create your application, the templates will have been copied to that location during setup.

If you are installing the EmailPlugin separately, then you’ll need to copy the templates manually from node_modules/@vendure/email-plugin/templates to a location of your choice, and then point the templatePath config property at that directory.

Customizing templates

Emails are generated from templates which use MJML syntax. MJML is an open-source HTML-like markup language which makes the task of creating responsive email markup simple. By default, the templates are installed to <project root>/vendure/email/templates and can be freely edited.

Dynamic data such as the recipient’s name or order items are specified using Handlebars syntax:

<p>Dear {{ order.customer.firstName }} {{ order.customer.lastName }},</p>

<p>Thank you for your order!</p>

<mj-table cellpadding="6px">
  {{#each order.lines }}
    <tr class="order-row">
      <td>{{ quantity }} x {{ }}</td>
      <td>{{ productVariant.quantity }}</td>
      <td>{{ formatMoney totalPrice }}</td>

Handlebars helpers

The following helper functions are available for use in email templates:

  • formatMoney: Formats an amount of money (which are always stored as integers in Vendure) as a decimal, e.g. 123 => 1.23
  • formatDate: Formats a Date value with the dateformat package.

Extending the default email handlers

The defaultEmailHandlers array defines the default handlers such as for handling new account registration, order confirmation, password reset etc. These defaults can be extended by adding custom templates for languages other than the default, or even completely new types of emails which respond to any of the available VendureEvents. See the EmailEventHandler documentation for details on how to do so.

Dev mode

For development, the transport option can be replaced by devMode: true. Doing so configures Vendure to use the file transport (See FileTransportOptions) and outputs emails as rendered HTML files in the directory specified by the outputPath property.

  devMode: true,
  handlers: defaultEmailHandlers,
  templatePath: path.join(__dirname, 'vendure/email/templates'),
  outputPath: path.join(__dirname, 'test-emails'),
  mailboxPort: 5003,

Dev mailbox

In dev mode, specifying the optional mailboxPort will start a webmail-like interface available at the /mailbox path, e.g. http://localhost:3000/mailbox. This is a simple way to view the output of all emails generated by the EmailPlugin while in dev mode.


class EmailPlugin implements OnVendureBootstrap, OnVendureClose {
  static init(options: EmailPluginOptions | EmailPluginDevModeOptions) => Type<EmailPlugin>;




static method