When I run maizzle build [environment], should CSS be inlined? Should my HTML be minified? Do I need to make some data available to the templates?

You might want to use different settings when developing locally versus when building the production-ready emails.

For example, you don't need CSS inlining or code indentation when developing on your computer, but you'll want both enabled for the final, production-ready emails.

Maizzle makes it easy to define as many build scenarios as you need, by using distinct configuration files that enable their own build command.

We call these Environments.

Default Environments

Maizzle comes with two config files, each enabling its own build command:

config.jsmaizzle build
maizzle serve
config.production.jsmaizzle build production
maizzle serve production

You probably noticed the link between config.production.js and maizzle build production - the keyword in the config file name enables its own build command.


You may use the maizzle.config.js configuration file naming pattern if you prefer:

maizzle.config.jsmaizzle build
maizzle serve
maizzle.config.production.jsmaizzle build production
maizzle serve production

Data merging

Any new Environment configuration file that you create will be merged on top of the base config.js when you run the build command for that particular Environment.

With the example above, when running the maizzle build production command, config.production.js will be merged on top of the base config.js: if the same key is present in both files, the value from config.production.js will be used.

Environment builds

To build your emails for a specific Environment, pass its name as an argument to the maizzle build command:

maizzle build production

The Starter's config.production.js is configured to output production-ready emails in a build_production folder at the root of the project.

Custom Environments

You may create as many Environments as you need, and name them as you like.

For example, you might create a config file named config.shopify.js that you would use to build only the templates from the src/templates/shopify folder:

module.exports = {
build: {
templates: {
source: 'src/templates/shopify',
destination: {
path: 'build_shopify'

The build command for it would be:

maizzle build shopify

Config variables

Maizzle exposes a page object that you can access through expressions in your HTML.

This object contains:

  • your Template config (config.[env].js merged with Front Matter variables)
  • the compiled Tailwind CSS (page.css)

This makes it possible to define variables in config.js:

module.exports = {
doctype: 'html'

... and use them in your markup:

<p>doctype is: {{ page.doctype }}</p>

Current Environment

The current Environment name is globally available under the page.env variable.

You can output content in your emails based on the Environment that you're building for:

<if condition="page.env === 'production'">
This will show only when running `maizzle build production`

Top-level variables

If you need to define variables outside of the page object, you can use the locals key in your config.js:

module.exports = {
locals: {
company: {
name: 'Spacely Space Sprockets, Inc.'

Now, you can access company properties directly:

Company name is {{ page.company.name }}
Company name is {{ company.name }}
Copyright © 2024 Maizzle SRLBrand policy
Edit this page on GitHub