-
Accept the constrained model before writing markup. Email is built with HTML tables for
layout (not divs/flex/grid), inline CSS on every element (a <style> head block is a
progressive enhancement, not the foundation, because Gmail and others strip or partially
honour it), a single root table at a fixed max width (typically 600px), and presentational
attributes (role="presentation", cellpadding, cellspacing, border="0",
align/valign) that Word-engine Outlook still needs. State this constraint, then design
within it — do not design a web layout and hope. See references/email-bulletproof-patterns.md
§1 (the model) and §2 (the boilerplate document head with the Outlook MSO conditionals and
meta tags).
-
Build the responsive layout as fluid or hybrid, not container-query-driven. Email cannot
use the container queries that responsive-and-adaptive-layout centres on. Choose one:
(a) Fluid — a single width:100%; max-width:600px table that simply narrows; simplest, but
multi-column content squeezes. (b) Hybrid / "spongy" — columns built as
display:inline-block cells wrapped in MSO <td> ghost tables so Outlook holds the columns
while non-Outlook clients let them wrap and stack with no media query at all; the most robust
responsive email pattern, since Gmail strips @media in several configurations. (c)
Mobile-first media queries as a progressive enhancement on top, never the load-bearing
layer. Carry the doctrine principle from responsive-and-adaptive-layout §8 — re-decide the
focal point at narrow width; never let the email collapse into an undifferentiated stack — but
implement it with stacking cells, not grid. Patterns in
references/email-bulletproof-patterns.md §3.
-
Write the preheader first, and hide it correctly. The preheader is the preview text the
inbox shows after the subject — prime real estate that decides opens. Place a hidden inline
element as the first node inside <body>, before any visible content, then pad it with
a zero-width-space + non-breaking-space run so the client does not pull the first body copy
("View in browser…") into the preview. Hide it with the combined
display:none; max-height:0; overflow:hidden; mso-hide:all; + the entity padding pattern. The
wording is a ux-writing-and-microcopy decision; the placement and hiding is this skill.
See references/email-bulletproof-patterns.md §4.
-
Build bulletproof buttons — not an image, not a bare styled <a>. A button must be
clickable, correctly sized, and visible even in Word-engine Outlook (which ignores
padding/border-radius on links) and with images off. Use the padded-table / anchor
pattern: an <a> with inline background-colour, padding, and mso-padding-alt, wrapped so
Outlook honours the hit area; for rounded/filled buttons in Outlook add the VML roundrect
conditional (<v:roundrect>). Never make the button a background-less image (it vanishes when
images are blocked) and never rely on CSS padding alone (Outlook drops it). Give it a real text
label (image-off safe) and ≥ 44×44px touch target per
doctrine/references/wcag-2.2-criteria.md
§2.5.8. Full VML + anchor recipe in references/email-bulletproof-patterns.md §5.
-
Choose type knowing the webfont will usually be dropped — so the fallback IS the design.
Email webfont support is partial and uneven: Apple Mail, iOS Mail, and Outlook.app can load a
linked/@font-face webfont, but Gmail (all platforms), Outlook desktop, Yahoo, and many
others strip it and fall straight to your fallback. Therefore design the email so it looks
right in the web-safe fallback first, then layer the webfont as an enhancement for the
clients that honour it. Pick a non-banned brand webfont per doctrine/design-doctrine.md §2 and
references/ai-slop-banned-fonts.md (e.g. a Fraunces display face or a Source Serif /
Spectral body face — never Inter, Roboto, Open Sans, Lato, Arial, Geist, Space Grotesk), but
commit a real web-safe stack that carries the same voice when it loads instead: a
serif-voiced email falls back to Georgia, 'Times New Roman', serif; a grotesque-voiced one to
'Helvetica Neue', Helvetica, Arial, sans-serif (Arial is acceptable as a fallback tier, not
as the stated primary). Declare the webfont with an @media-guarded @font-face and an MSO
conditional that forces Outlook to the fallback, so Outlook never tries to render the webfont and
reflow. Web-safe options, the fallback-pairing table, and the Outlook-guard snippet are in
references/email-bulletproof-patterns.md §6.
-
Plan for dark mode explicitly — colours get rewritten under you. Three behaviours coexist:
Apple Mail / iOS may fully invert the palette; Outlook (Windows/Mac/app) often fully
inverts; Gmail does a partial/forced inversion of light backgrounds you cannot fully
control. Design a dark-mode treatment: use @media (prefers-color-scheme: dark) with
[data-ostype]/color-scheme and <meta name="color-scheme" content="light dark"> +
supported-color-schemes to opt in; provide a dark logo swap (a transparent PNG with a
light mark, shown via the dark media query) because a dark logo on an inverted dark background
vanishes; never rely on a transparent PNG icon that disappears on dark — give it a safe halo or
a background plate; and check that button fill keeps ≥ 4.5:1 / 3:1 contrast
(wcag-2.2-criteria.md §1.4.3/1.4.11) after inversion. Patterns and the logo-swap recipe in
references/email-bulletproof-patterns.md §7.
-
Make it resilient with images off. Many clients block images by default until the reader
opts in, so the email must communicate with zero images loaded. Every <img> gets
meaningful alt text (a decorative spacer gets alt=""), styled alt text where the client
honours it (inline colour/size on the <img> shows readable text in the broken-image box), a
live HTML text version of any headline or CTA that currently lives in an image (never put
the only copy of the headline or the button label inside an image), and a sensible
background colour on image containers so the layout does not collapse to white boxes. Keep a
healthy text-to-image ratio (heavily image-only emails read as broken and hurt the inbox
impression). See references/email-bulletproof-patterns.md §8.
-
Make the markup semantic and accessible. Set lang on <html>, role="presentation" on
every layout table so screen readers skip the scaffolding (and announce real content in reading
order), use real heading tags for hierarchy, keep a logical source order (mobile reads the
DOM top-to-bottom — order the cells so the stacked single column reads correctly), ensure body
text ≥ 4.5:1 and large text/UI ≥ 3:1 contrast per wcag-2.2-criteria.md §1.4.3/1.4.11,
give links discernible names (not "click here"), and size touch targets ≥ 44px. Provide a
visible "View in browser" and (for marketing) unsubscribe link. Accessibility checklist
in references/email-bulletproof-patterns.md §9.
-
Run the email anti-slop + render checklist (below), then test on real clients — at
minimum desktop Outlook (Word engine), Gmail web + app, Apple Mail (light and dark), and one
mobile webview — plus an images-off pass and an inbox-preview (preheader) check. Automated
render previews catch layout; only a real Outlook and a real dark-mode pass catch the two
things that break most often.