Skip to content
MailHaap
[01]Template builder

The document is JSON. That is why it can be free.

The drag-and-drop email builder, free forever, with no watermark and no signup required to build, preview, test-send or export. Ninety sector templates included, RTL first-class, and a linter that catches Gmail clipping before you send.

  • #Drag-and-drop
  • #MJML
  • #Dark-mode
  • #RTL
  • #Linter
  • #Export
[02]What you get

Sixteen block types

Sections with up to four columns, text, headings, images, buttons, dividers, spacers, social rows, video thumbnails, product cards, repeaters bound to a data array, countdowns, menus, QR codes, an HTML escape hatch, and an unsubscribe block that cannot be deleted on the campaign plane.

One compiler, two runtimes

The same TypeScript compiles the preview in your browser and the final HTML on our servers. If preview and send-time output ever diverged the product would be broken, so they share code rather than being kept in sync.

Undo, autosave, versions

A hundred steps of history with per-block granularity, autosave to local storage every three seconds and to the server every fifteen, and named version snapshots with a diff and restore.

RTL is first-class, not an afterthought

dir="rtl", mirrored padding and correct alignment throughout, verified in Arabic and Turkish. Translating a template preserves the structure rather than re-laying it out.

Outlook, handled

Tables for layout, all CSS inlined, MSO conditional comments, VML for background images and rounded buttons, explicit mso-line-height-rule, retina images at 2×, and a fluid-hybrid technique for the clients that ignore media queries.

Export without an account

Inlined HTML ready to paste anywhere, MJML source, the JSON document, a PDF preview, or a ZIP with the images. No watermark. Import works too: paste HTML and anything unconvertible is preserved in an HTML block rather than dropped.

[03]How it works

Open it, build something, take it with you.

  1. [01]

    Start from a sector template

    Ninety of them, each with a filled sample-data set, a suggested subject and preheader, a plaintext version and a note on when to use it.

  2. [02]

    Drag, drop, reorder

    From the palette, between columns, and by keyboard — arrow keys move a selected block, because a tool marketed as the best cannot skip accessibility.

  3. [03]

    Watch the linter

    It runs continuously in a side panel. Errors block a send; warnings need an acknowledgement that is recorded.

  4. [04]

    Export or send

    HTML, MJML, JSON, PDF or ZIP — or connect a domain and send it as a campaign.

[04]The linter

It tells you before the receiver does.

Linter checks and their severity
CheckSeverityWhy
Compiled size above 102 KBerrorGmail clips the message — and the unsubscribe link often falls below the clip.
No plaintext-visible unsubscribeerrorA campaign-plane message cannot be sent without one.
Broken merge tag referenceerrorA campaign whose sample render leaves an unresolved tag is blocked.
Link to a blacklisted domainerrorChecked against Spamhaus DBL and SURBL at lint time, not send time.
Missing alt textwarningScreen readers skip the image and spam filters score it worse.
Image-to-text ratio above 70%warningA spam signal, and the message is unreadable with images blocked.
Contrast below WCAG AAwarningMeasured on the compiled output, in both light and dark rendering.
Missing preheaderwarningThe inbox shows the first line of body text instead, which is rarely what you want.
Background image usedinfoBreaks in Outlook desktop. The compiler offers a VML fallback.
Web font usedinfoOutlook ignores it. The compiler always emits a fallback and names the clients that will use it.
Subject above 60 charactersinfoShown with a mobile truncation preview so you can see where it cuts.
[04b]The block schema

JSON in, email-safe HTML out.

Storing the document as a block tree rather than HTML is the single most important decision in the builder. It gives deterministic re-rendering when we improve the compiler, safe merge-tag substitution, per-block validation, diffable version history, and translation without re-layout.

  • Section
  • Divider
  • Spacer
  • Heading
  • Text
  • Button
  • Menu
  • HTML
  • Image
  • Video
  • Social
  • QR code
  • Product
  • Repeater
  • Countdown
  • Unsubscribe
document.json
{
  "version": 2,
  "settings": {
    "width": 600,
    "backgroundColor": "#f4f4f5",
    "fontFamily": "Inter, Arial, sans-serif",
    "fallbackFont": "Arial, sans-serif",
    "darkMode": "adaptive",
    "direction": "rtl",
    "language": "ar"
  },
  "blocks": [
    {
      "id": "b_01",
      "type": "section",
      "props": { "padding": [24, 24, 24, 24] },
      "columns": [
        {
          "width": "50%",
          "blocks": [
            { "id": "b_02", "type": "image",
              "props": { "src": "hero", "alt": "Required" } }
          ]
        },
        {
          "width": "50%",
          "blocks": [
            { "id": "b_03", "type": "text",
              "props": { "text": "{{ first_name | default: \"there\" }}" } }
          ]
        }
      ]
    }
  ]
}
[05]Numbers
Editor bundle, gzipped
Under 280 KB
Preview re-render after an edit
Under 60 ms
Compile a 40-block document
Under 120 ms
Autosave round trip
Under 200 ms
Gallery page LCP
Under 1.2 s
Undo history
100 steps
Max nesting depth
3
Max columns per section
4
Compiled size
Warned at 90 KB, blocked at 200 KB
Content width
600 px, fluid-hybrid on mobile
Merge tag language
A restricted Liquid subset, evaluated in our own sandbox
Render limits
1,000 loop iterations, 250 ms total render time

Free forever. No watermark. No account to export.

An email builder is a commodity feature that every provider gates behind a paid plan. Making ours free, better and exportable is worth more to us as an acquisition channel than it would ever be as a line item — and the marginal cost of a free user is a few hundred kilobytes of object storage.