Health checks
Every quality, deliverability, and accessibility issue your email has — in one drawer, clickable to jump to.
The editor watches your email for problems and surfaces them in two places: small health badges in the preview toolbar (at-a-glance) and a comprehensive Issues drawer (the full list). Click any badge to open the drawer.
The badges
Four chips sit at the right of the preview toolbar, always visible:
| Chip | What it shows |
|---|---|
| Words / size | Total word count and HTML size in KB. Informational. |
| Errors ⚠ | Green dot = clean. Red count = MJML parse errors. |
| Images 🖼 | Green count = all images load and have alt text. Gold = some images are missing alt text. Red overlay = some images don't load at all. |
| Links 🔗 | Green count = all hrefs resolve. Red overlay = broken or placeholder links. |
Hover any chip for a quick tooltip. Click any chip to open the full Issues drawer.
The Issues drawer
A right-side drawer that groups every issue by severity:
- Errors (red) — must be fixed before sending. Examples: MJML parse error, image fails to load, broken link.
- Warnings (gold) — should review but not blocking. Examples: image missing alt text.
- Info (blue) — purely advisory.
Each row shows:
- A coloured severity dot.
- The issue title (e.g. "
mj-imageis missing alt text"). - A one-line explanation of who's affected (e.g. "Recipients using screen readers can't perceive this image").
- The category and (if applicable) line number.
- A Jump button that scrolls the editor to that element and closes the drawer.
Open the drawer any time via a badge click. The drawer auto-refreshes as you edit — fix an issue and it disappears from the list immediately.
What's checked today
Structural (Phase 0)
| Check | Severity | Category |
|---|---|---|
| MJML structural parse errors | Error | mjml |
Image fails to load (<img> or background) | Error | images |
Broken or placeholder link (href="#", malformed URL) | Error | links |
| Image missing alt text | Warning | accessibility |
Subject — emails only
| Check | Severity |
|---|---|
| Subject is empty | Error |
| Subject is < 30 characters | Warning |
| Subject is > 60 characters | Warning |
| Subject is mostly UPPERCASE | Warning |
Subject has excess punctuation (!!, ??, 3+ !) | Warning |
| Subject contains a spam-trigger phrase ("act now", "free money", "click here", …) | Warning |
Deliverability & compliance — emails only
| Check | Severity |
|---|---|
| Body text contains spam-trigger phrases | Warning |
No unsubscribe link or {{unsubscribeLink}} merge tag | Error |
| No postal address detected in footer | Warning |
The unsubscribe check is an error, not a warning: the 2024 Gmail/Yahoo sender rules and CAN-SPAM both require a working unsubscribe option. The footer-address check is a warning because many templates resolve the address from a merge tag, which we can't verify at compose time.
Pre-flight on Send
When you click Send on an email, the Send Wizard's Review step automatically runs the full health check. What happens depends on what was found:
- Errors (red) — the Send button is disabled. Fix the issues, then come back. You can still save the email as a draft; the gating is on actual sending, not on saving.
- Warnings (gold) — the Send button stays enabled. Clicking it shows a confirmation modal listing the warnings, with two choices: Send anyway or Review issues (jumps to the Issues drawer).
- All clear (green) — a "All pre-flight checks passed" confirmation appears in the Review step. Send normally.
This way the editor catches problems before they ship rather than after a recipient sees a broken email.
Image quality
Two extra checks now run on every image alongside the broken/alt checks:
-
Missing dimensions — if the rendered
<img>has neither awidthnor aheightattribute, you get a warning. Outlook desktop is particularly bad at handling these: it renders the image at full intrinsic size and shifts everything around it. We only flag when both are missing — MJML adds a width by default, so the warning only fires for truly under-specified images. -
Oversized (> 1 MB) — the editor fires a
HEADrequest for each image's URL to get its size, and warns when it exceeds 1 MB. Recipients on mobile data thank you for keeping images under 300 KB. Compression and resize tools live in the image editor. When the CDN doesn't allow HEAD or omits content-length, the check silently skips — we don't false-warn on images we can't actually measure.
When an image is broken (URL fails to load), only the broken-image error appears — the alt / dimensions / size checks are suppressed for that image until you fix the URL.
One-click AI fixes
Some warnings have an obvious AI-driven remedy. The Issues drawer shows a Fix button next to those:
- Missing alt text — click Fix and the AI looks at the image, generates a description, and applies it to the image's
altattribute. The image is briefly selected so you can see the change, and the issue disappears from the drawer on the next validation pass.
If the AI's output is off, you can always click the image and edit the alt text manually — the AI fix is a starting point, not a final answer.
Coming soon:
- Rewrite a too-long or spam-tripping subject within the 30–60 char window
- Insert a CAN-SPAM-compliant footer (unsubscribe + postal address) using your project branding
What's coming
- Image-to-text ratio — > 60% image area is a strong spam signal
- Image format — JPEG > 500 KB or PNG photographs (suggest WebP)
- Performance — HTML > 102 KB (Gmail clips your email)
Spam-trigger word list
The trigger phrases are curated for low false-positive rate. Examples: "act now", "buy now", "click here", "free money", "limited time", "no obligation", "winner", "guaranteed", "weight loss", "make money fast". The full list is at editor/lib/health/data/spam-words.json and versioned — corrections are welcome.
If your legitimate copy happens to use one of these phrases (e.g. an actual "limited time" promotion), the warning is intentional — consider rephrasing or accepting the slight inbox-placement risk. You can ignore individual warnings.
Power-user shortcut
Want to see every issue without hunting for a chip? Click any of the three issue-bearing chips (Errors / Images / Links). They all open the same drawer. The drawer shows everything regardless of which chip you clicked.
Why this matters
Most email-builder QA happens in the recipient's inbox — by then it's too late. The Issues drawer surfaces problems while you're editing, with one-click navigation to the source element. Combined with the upcoming pre-flight check on Send, it turns "did I remember to add alt text?" into "the editor told me before I clicked Send."