Why this is harder than it looks
Outlook renders email with the Word engine. Anything that behaves in a browser falls apart
there: flexbox does nothing, margins collapse unpredictably, and background images are
ignored outright. Transactional emails get sent more than any other kind — every order, every
login — so a layout that breaks in one client breaks in front of everyone, all day.
These four are nested tables with conditional comments where Outlook needs them, VML buttons,
and a dark-mode block that Gmail and Apple Mail honour and Outlook ignores gracefully. The
receipt’s line items are a plain <table> with inline styles, so your template engine can
loop the rows. The shipped email’s progress bar is three table cells with background
colours — no image to host, nothing for a client to block.
The four emails
- Receipt — order paid: line items, subtotal, shipping, tax, total, delivery address, one
button to the order page, and a returns line.
- Shipped (Pro) — carrier, estimate, tracking number, a three-step progress bar.
- Password reset (Pro) — button, plain-text fallback link, 30-minute expiry, and the
“if this wasn’t you” paragraph with where the request came from.
- Verify email (Pro) — a button and a six-digit code in a monospace block, so one
template serves web and mobile flows.
The free archive is the receipt as compiled HTML. Pro is all four, plus the MJML source with
the shared theme, header and footer, so you change the brand once.
Things done on purpose
No unsubscribe link — these are service emails, and the footer says so; add one back if you
send anything promotional on the same stream. The merge tags are the common {{variable}}
syntax that Postmark, SendGrid, Mailgun and Resend accept directly; the README lists every
tag per email. The sender name and address block are placeholders and must be replaced.
What “partial” means in the table
Gmail on iOS and Android honours the dark theme by inverting colours itself rather than
reading prefers-color-scheme. The result is readable and contrasty, but it is Gmail’s
inversion, not the palette in the source. Nothing breaks; it simply is not identical.