MJML alternatives: where teams go after mj-* markup

By Mara Levin · Updated October 7, 2026 · Docs and prices checked that day

Teams usually leave MJML for components and logic (Maizzle with Vue and Tailwind, or React Email), or for a visual editor so that non-developers can edit. Many should stay. This page covers what pushes people out, where they land and what has to be rewritten.

The short answer

Move to Maizzle if your team writes Vue and wants variables, loops and Tailwind in the template, and to React Email if the product is already React. Choose a visual editor (Stripo from $20 a month, Beefree from $30, or Mailjet's own editor, free on its $0 plan) if marketers need to change copy without a developer. Stay on MJML if your backend is not JavaScript or if one compile step in CI already works.

Why teams leave MJML

MJML's pitch is that you drop table nesting and client-specific CSS and write mj-section and mj-column instead. The friction shows up later, and the MJML documentation describes most of it itself.

  • There are no variables or conditions. The docs tell you to use mj-raw for a templating language, and their own example splits one condition across two tags, because an mj-raw is an ending tag that cannot contain other MJML components. A guard around an entire section looks like this:
<mj-raw>
  <!-- htmlmin:ignore -->
  {% if foo < 5 %}
  <!-- htmlmin:ignore -->
</mj-raw>
<!-- Some mjml section -->
<mj-raw>
  {% endif %}
</mj-raw>

The htmlmin:ignore comments exist because the minifier can choke on the < character. Once a template has several of these, you are maintaining two languages and reading both.

  • Includes are off by default. The docs say mj-include tags are "silently ignored unless you opt in", and the current docs go further with a sandbox: only files under filePath or an includePath root are allowed, and absolute paths, UNC paths and drive letters are rejected. Safer, but a shared header that vanished from your output is a common first surprise, and a monorepo needs the setup below.
mjml template.mjml \
  --config.filePath /project/templates/newsletter \
  --config.allowIncludes true \
  --config.includePath '["../_common","../vendor"]'

That command is the CLI example from the MJML documentation.

  • Known limits sit in the reference. The docs warn that mj-button "won't be fully clickable because of client support", and that background images on mj-wrapper, mj-section and mj-hero have Outlook desktop caveats: a background on a wrapper plus one on its child section is unsupported, and without a background-size the no-repeat setting is ignored. You can live with these, but they are the reason people start comparing frameworks.
  • The output is far from the source. The docs show a single mj-button expanding to a nested table with inline styles. When a client misrenders, you debug the compiled HTML and then work backwards to the tag that produced it.
  • Marketers cannot edit it without learning the syntax. Even MJML's online editor takes markup as input. The documentation points to an online editor and plugins for Visual Studio Code and Sublime Text, but a marketer who wants to change a headline either learns the syntax or files a ticket.

Who should not leave

MJML's documentation lists ports and bindings for Rust (MRML), .NET, Elixir, Ruby, Python, Django and Laravel, and a free-to-use MJML API. That reach is the strongest argument for staying: if your backend is Rails or Laravel, neither Maizzle nor React Email fits without adding a Node build. A template library that compiles in CI and ships as static HTML is not broken just because newer frameworks exist, and switching resets your client-testing history. Before deciding, read the CSS and client notes in our CSS in email and client compatibility guides.

The alternatives at a glance

Tool What you write Prices listed Leave MJML for it when
MaizzleVue components with Tailwind CSSNo plan prices on its siteYou want logic and Tailwind in the template
React EmailReact components in TSXMIT licence, freeThe product is already React
Mailjet's editorDrag-and-drop, built on MJMLFree $0, Starter $9, Essential $19, Premium $29 a monthMarketers edit and Mailjet also sends
ParcelHTML in a hosted editor with previews$0, $29 and $56 per user a monthYou want previews and checks without building them
StripoVisual editor, exports HTMLFree $0; Basic $20; Medium $45; Pro $125 a monthMarketers build and export to an ESP
BeefreeVisual editorStarter $0; Professional $30; Business $160 a monthYou need approvals and brand controls
Unlayer or TopolEmbeddable visual builderUnlayer from $250; Topol plugin from $70 a monthThe editor must live in your own product

Maizzle: the nearest vocabulary, with logic

Maizzle's migration guide opens by saying that once you switch your mental model to Vue syntax "you'll find a lot of familiar concepts". Its component map pairs mj-section with Section, mj-column with Column, mj-group with Row, mj-text with Text, mj-button with Button and mj-image with Img. mj-title becomes the useHead() composable, mj-preview becomes Preheader and mj-style becomes a style block inside Head. mj-table becomes a plain table with Tailwind classes, and mj-include becomes a custom Vue component. The guide also lists components MJML never had, among them Outlook, NotOutlook, OutlookBg, WithUrl, QrCode and a Plaintext component for the text version.

Maizzle's installation page describes three ways to run it: as a standalone project, in a monorepo, or as a Vite plugin inside an app. To try it, the page gives two commands to scaffold and serve:

npx maizzle new
cd project-name
npx maizzle serve

Those are from the Maizzle installation guide, and the mapping above comes from its guide for MJML users. The docs show version 6.x, so check a tutorial's version before copying it. Maizzle's site lists no plan prices. For a head-to-head on code, build tooling and sending, see Maizzle vs MJML.

React Email: when the product is already React

React Email's docs include a page called Migrating to React Email with a section titled From MJML. Its four steps are to remove the mjml package and install react-email, find every template ending in .mjml and convert it to a .tsx or .jsx component, replace MJML standard tags with React Email tags such as Text, Img and Button where possible, and turn custom MJML components written in .js into React components. The setup in the manual setup guide is two install commands and a script entry:

npm install @react-email/ui -D -E
npm install react-email react react-dom -E

Add "email:dev": "email dev" under scripts in package.json, run it, and the guide has you open localhost:3000. Both steps come from the manual setup guide; the migration steps are on its migration page. React Email is open source under the MIT licence, and its documented integrations include Resend, Nodemailer, Mailgun, SendGrid, Postmark, AWS SES and Brevo. For the MJML comparison in detail read MJML vs React Email, and for React teams in general see email for React developers.

Mailjet's own editor: MJML with a visual layer

MJML stands for Mailjet Markup Language, so Mailjet is the one vendor whose editor and pricing are tied to it. Its Email Editor page says its "MJML email builder ensures emails are inherently responsive", offers drag-and-drop with HTML code blocks for people who code, and adds Brand Kit and lockable Saved Sections. Mailjet's pricing page lists the Advanced Email Editor and an MJML row among its Create features, and its Free plan costs $0 for 6,000 emails a month, with a 200-a-day limit and 1,000 contacts. Starter is $9 for 8,000 emails and 2,000 contacts, Essential is $19 for 15,000 emails with unlimited contacts and 500 email previews a month, and Premium is $29 for 15,000 emails with 2,000 previews and automations.

Mailjet pricing page, captured Oct 2026
Mailjet pricing page as of Oct 7, 2026. Source: https://mailjet.com/pricing

This is the lowest-friction exit for a team that wants to keep MJML templates and add a place for marketers to work. The catch is that you are choosing a sender, not just an editor: Mailjet's plans are measured in emails and contacts, so confirm your volume fits before you decide.

Visual editors and Parcel

If MJML is being retired because nobody on the team wants to write markup, the editors are the answer. Stripo's pricing page lists Free at $0, Basic at $20 and Medium at $45 a month, and Beefree's lists Professional at $30. Both are builders that export HTML rather than send; our Stripo alternatives page covers seats, export caps and what each plan excludes. For a team that wants an editor inside its own product, Unlayer lists Launch at $250 a month, and Topol's plugin plans start at $70 and list an "MJML rendering engine", so output stays portable.

Parcel sits between the two worlds. Its pricing page lists Community at $0, Pro at $29 per user a month and Business at $56, with HTML problem checking, test sends, previews and accessibility testing on every tier. MJML's own docs list Parcel under community contributions, so check Parcel's documentation for exactly how it handles MJML source before relying on it.

What converts and what you rewrite

MJML piece Maizzle React Email Visual editor
Section, column, text, button, imageMapped to componentsText, Img, Button; layout rebuiltRebuilt as blocks
mj-attributes defaultsConfiguration or Tailwind classesProps and shared componentsBrand settings
mj-include partialsCustom Vue componentImported React componentSaved or locked blocks
Accordion, carousel, hero, navbar, socialNot on the migration map; rebuildNot in the component list; rebuildDepends on the editor
Templating inside mj-rawVue logic replaces itJavaScript replaces itThe editor's merge tags

The pattern is that basic layout converts easily and the interactive components do not. MJML ships mj-accordion, mj-carousel, mj-hero, mj-navbar and mj-social, but none appears on Maizzle's migration map or in React Email's component list. Count how many of your templates use them before estimating the rewrite. Also check your validation level before you port anything: MJML defaults to soft, which raises no exception and only returns problems in the errors list, so an old template can compile cleanly while still carrying mistakes.

What the switch costs

A newsletter to 3,000 contacts, four sends a month. That is 12,000 emails. Mailjet Free covers 6,000 emails and 200 a day, and Starter covers 8,000 emails and 2,000 contacts, so both fall short. Essential at $19 covers 15,000 emails and unlimited contacts, and includes the editor and 500 previews a month.

A developer and a marketer sharing templates. Stripo Basic at $20 and Beefree Professional at $30 each include room for two people, while Parcel Pro for two users is 2 x $29 = $58. Maizzle and React Email add no licence fee, but neither gives the marketer a canvas.

Three developers who want previews. Parcel Pro is 3 x $29 = $87 and bundles checks, while Mailjet's Premium at $29 includes 2,000 previews a month if you also send there. Frameworks alone leave client testing as a separate bill.

Leave MJML if…

  • You need real logic, such as loops and optional blocks you are tired of splitting across mj-raw tags.
  • Your templates share code with a Vue or React app.
  • Marketers wait on developers for copy edits.

FAQ

Is MJML dead, or only unfashionable?

MJML's documentation as read on October 7 still describes new options: the includes section covers a filePath and includePath sandbox, and the CLI lists sanitizeStyles and templateSyntax for people mixing templating with CSS. What has changed is the competition, since Vue and React tooling now offers props and logic that MJML leaves to a second templating step. Leave if that gap costs you time; otherwise there is no pressing reason.

What is the closest drop-in replacement for MJML?

Maizzle, because its migration guide maps almost every MJML tag to a component: mj-section to Section, mj-column to Column, mj-button to Button and mj-include to a custom Vue component. It still means rewriting each template in Vue syntax, so "drop-in" describes the vocabulary and not the files.

Can I keep MJML and still give marketers a visual editor?

Yes. Mailjet's own editor is built on MJML and its pricing page lists a $0 Free plan that includes an Advanced Email Editor. Topol's plugin plans list an "MJML rendering engine", so a visual editor can sit on top of the same standard your developers already use.

Do Maizzle or React Email render better in Outlook?

Neither vendor promises it. Maizzle's Button has props that add padding for classic Outlook, and React Email says it tested components across Gmail, Apple Mail, Outlook and other clients. MJML documents its own Outlook limits, such as background images on mj-wrapper. Send your real template through a client preview before you conclude anything.