1. Outlook is Word, not a browser
Every other client you test in is a browser engine wearing a mail client's clothes. Gmail's web app, Apple Mail, Yahoo, Outlook.com — all of them parse your HTML with something descended from a rendering engine built for the web, then strip a documented list of things they do not allow.
Classic Outlook for Windows is different in kind, not degree. Since Outlook 2007, Microsoft has rendered HTML email using the Word layout engine — the same one behind .docx. It was a deliberate choice about security and authoring consistency, and the practical consequence is that your email is being laid out by a word processor that has never heard of the last fifteen years of CSS.
If a layout technique feels modern, Word does not have it. Flexbox, grid, position, max-width, border-radius, box-shadow, CSS background images, SVG — all absent. What Word does have is tables, fixed widths, and flow.
2. Which Outlook are we talking about?
This is where most "but it works for me" arguments come from. "Outlook" is at least four different renderers sharing one brand, and only some of them are the problem.
| Client | Engine | What it means for you |
|---|---|---|
| Outlook 2007–2019 & classic Microsoft 365 desktop (Windows) | Microsoft Word | The hard one No modern CSS. Build for this and the rest follow. |
| "New Outlook" for Windows | Web (Edge/Chromium-based) | Behaves like webmail Renders much closer to Outlook.com. |
| Outlook.com (browser) | Web | Behaves like webmail Also does its own dark-mode colour swapping. |
| Outlook for Mac / Outlook mobile | WebKit-based | Behaves like a browser Rarely the source of a rendering complaint. |
So when a client says "it's broken in Outlook", the useful first question is which one. If the screenshot shows square corners where you drew rounded ones and Times New Roman where you specified a brand font, you are looking at the Word engine — and everything below applies.
3. The properties Word silently drops
Nothing errors. Nothing warns you. The declaration is simply not applied, and your email renders as though you never wrote it. These are the nineteen properties our Outlook profile strips, because the Word engine does not honour them:
| Property | What Outlook does instead |
|---|---|
| border-radius | Draws square corners. Your pill button becomes a rectangle. |
| box-shadow | No shadow. Cards lose their separation from the background. |
| max-width | Ignored — only fixed width attributes rule. This is the big one. |
| min-width / max-height / min-height | Ignored. |
| position | No CSS positioning at all — tables and normal flow only. |
| float | Ignored on most elements. Two columns become one. |
| opacity | Ignored. A 50%-tinted overlay renders at full strength. |
| transform | Ignored. Rotated or scaled elements sit flat. |
| transition / animation | Ignored. There is no motion in the Word engine. |
| filter | Ignored. |
| text-shadow | Ignored. |
| object-fit | Ignored. Images do not crop to their box. |
| gap | Ignored — it belongs to layout modes Word does not have. |
| overflow | Ignored. Nothing is clipped or scrolled. |
| background-size / background-position | Ignored without a VML fallback (see §6). |
Read that list again with one question in mind: how much of my layout depends on any of these? If the answer is "the whole card component", that component needs a table-based twin for Outlook.
4. The Times New Roman trap
This is the single most reported Outlook surprise, and the mechanism is worth understanding because the fix is one line.
Outlook resolves font-family against fonts Word knows. Our Outlook profile keeps only these, and drops everything else from the stack:
Arial, Helvetica, Helvetica Neue, Verdana, Tahoma, Georgia, Times, Times New Roman, Courier, Courier New, Trebuchet MS, Segoe UI, Calibri, Cambria, Garamond, Book Antiqua, Palatino — plus the generic families sans-serif, serif, monospace and cursive.
Now the trap. If your stack is font-family:'Brand Sans', 'Brand Sans Fallback' and neither name survives, Outlook does not pick a reasonable default sans-serif. It renders Times New Roman. Your clean modern email arrives looking like a 1997 memo, and only in Outlook — so it passes every other check you ran.
/* breaks in Outlook — no Word-safe name anywhere in the stack */ font-family: 'Brand Sans', 'Brand Sans Text'; /* survives — the last two names are always resolvable */ font-family: 'Brand Sans', Arial, Helvetica, sans-serif;
Web fonts are a separate matter: Outlook, Gmail and Yahoo do not load @font-face or fonts.googleapis.com at all. Declare them if you like, but the fallback is what most of your list will actually see — so choose it as deliberately as you chose the brand face.
5. Layout: why your div collapsed
Three separate behaviours combine into the classic "my beautiful two-column layout stacked and lost all its spacing" bug report:
display:flexanddisplay:gridfall back toblock. Every child stacks full width, in source order. No columns, no alignment, nogap.- Padding on a
<div>,<p>or<span>is dropped. Word applies padding to table cells. Your careful 24px interior spacing vanishes and the text runs to the edge. max-widthis ignored. A fluid container that relies onmax-width:600pxto stop growing will happily fill the whole reading pane.
The rules that survive all three are unglamorous and completely reliable: lay out with nested tables, set widths with the HTML width attribute as well as CSS, and put your padding on <td> elements.
<!-- padding on the div: gone in Outlook --> <div style="max-width:600px;padding:24px;">…</div> <!-- padding on the cell, width declared twice: renders everywhere --> <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" style="width:600px;"> <tr><td style="padding:24px;">…</td></tr> </table>
role="presentation" is not decoration. It tells screen readers this table is a layout device, not data — see the accessibility article for why that one attribute changes how the whole email is announced.
6. Background images need VML
A CSS background image is not a background image to Word. Both background-image:url(…) and the url() half of the background shorthand are dropped outright. If you set a hero image as a background and put your headline on top of it, Outlook shows the headline on a blank area — and if you never set a background colour, that headline may be white text on white.
The fix is VML: Vector Markup Language, an old Microsoft vector format the Word engine still draws. Wrapped in an Outlook-only conditional, it paints the image behind your content for Outlook while every other client uses your normal CSS.
<td background="hero.jpg" bgcolor="#0d3f9e" style="background-image:url('hero.jpg');background-size:cover;"> <!--[if gte mso 9]> <v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" style="width:600px;height:320px;"> <v:fill type="frame" src="hero.jpg" color="#0d3f9e" /> <v:textbox inset="0,0,0,0"><![endif]--> <div>…your headline and CTA…</div> <!--[if gte mso 9]></v:textbox></v:rect><![endif]--> </td>
Note the bgcolor and the color on the fill. Always set a solid colour behind a background image anyway — it is what shows when the image is blocked, which in Outlook is the default state.
Our Outlook preview activates VML the way Outlook does, but a browser cannot draw VML shapes — so an email that leans heavily on it may show blank areas in the simulated view where real Outlook would paint the image. The tool says so on screen when it detects v: markup, rather than letting you read a blank box as a bug.
7. Conditional comments and ghost tables
Conditional comments are the escape hatch that makes all of the above workable. They are ordinary HTML comments to every client except Outlook, which reads them as instructions:
<!--[if mso]> … <![endif]-->— content only Outlook sees. Every other client treats it as a comment and skips it.<!--[if !mso]><!--> … <!--<![endif]-->— content everyone except Outlook sees.
The most common use is the ghost table: a fixed-width table that exists purely to give Outlook the container it needs, wrapped around a fluid div that every modern client uses instead. This is the fluid-hybrid pattern, and it is how one build serves both worlds.
<!--[if mso]> <table role="presentation" width="600" cellpadding="0" cellspacing="0"><tr><td> <![endif]--> <div style="max-width:600px;margin:0 auto;">…</div> <!--[if mso]> </td></tr></table> <![endif]-->
Look closely at that markup and you will see the trap: the opening <table><tr><td> and its closing tags live in two different comments, with your content between them. The HTML is only valid once Outlook activates both blocks and the fragments meet. Get the count wrong — one opening ghost table, no closing block — and Outlook renders a broken tree while every other client, which ignored both comments, looks perfect.
Because of that split, an unbalanced conditional is invisible in every preview you have. It is one of the checks the Email QA tool runs: it counts opening and closing mso blocks and flags a mismatch before the send, not after.
8. SVG, GIF and the first-frame rule
Two image behaviours catch people out on the day of the send.
SVG does not render in the Word engine — at all. An <img src="logo.svg"> becomes an empty box the size of its declared dimensions, showing the alt text if you wrote any and nothing if you did not. Inline <svg> markup is stripped too (Gmail strips it as well). Export logos and icons to PNG for email, however tempting a crisp vector is.
Animated GIFs show only their first frame in Outlook 2007–2019. Not a fallback image — literally frame one of the animation. If your GIF builds to the offer over four frames, Outlook subscribers see the setup and never the punchline. Put the offer, the price and the CTA in the first frame, always.
9. mso-hide and your preheader
One Microsoft-only property genuinely works, and it matters: mso-hide:all actually hides an element in Outlook. That is how hidden preheader text — the line that shows in the inbox list next to the subject, but not in the email body — stays hidden there.
A preheader typically stacks several tricks so that every client hides it: display:none, a zero or 1px font size, zero max-height, opacity:0, white-on-white colour, and mso-hide:all for Outlook. That combination is deliberate, not a bug — worth remembering when a checker flags white text on a white background. Ours deliberately does not: hidden blocks are excluded from the contrast check for exactly this reason.
10. The rules, as a checklist
Everything above, compressed into the things to actually do:
- Lay out with nested tables, not
divs with flexbox. Addrole="presentation"to every layout table. - Declare width twice — the HTML
widthattribute and CSSwidth— and never rely onmax-widthalone. - Put padding on
<td>, never on thedivor paragraph inside it. - End every font stack with a web-safe face and a generic family, or Outlook hands you Times New Roman.
- Build buttons as tables, not as CSS-rounded links — square corners in Outlook are the giveaway that you did not.
- Give every background image a VML fallback and a solid
bgcolorunderneath it. - Balance your
[if mso]blocks, and count them — the failure is invisible outside Outlook. - No SVG. First frame of every GIF carries the message.
- Inline your CSS. Outlook drops linked stylesheets and
@import, and reads none of your@mediaqueries on the desktop client. - Check the email, not the design — run the built HTML through a pre-flight before it reaches a real inbox.
Paste your HTML and see what Outlook keeps.
Our free Email QA tool runs 40 pre-send checks and flags the Outlook-unsupported CSS it finds, then re-renders your email through a rule-based Outlook profile that lists exactly what the Word engine stripped. Rule-based simulations built from documented CSS support — not real screenshots, and no substitute for a real render farm.
The Outlook, Gmail and dark-mode views are simulations: your HTML re-rendered through each client's documented CSS support, with a list of every change made. They are not screenshots from real copies of those clients, and they cannot be. Where you need true inbox rendering across dozens of real clients and devices, that is what Litmus and Email on Acid are for — we say the same on our comparison page.
Most creative processing happens locally in your browser. Files are uploaded only when you explicitly use sharing, transfer or team features.
Frequently asked questions
Why does my email look fine in Gmail but broken in Outlook?
position, linked stylesheets). Outlook for Windows renders your HTML with the Microsoft Word layout engine, which has no modern CSS at all — no flexbox or grid, no border-radius, no max-width, no CSS background images without a VML fallback. A layout that leans on any of those looks correct everywhere else and collapses in Outlook.Which versions of Outlook actually use Word?
Do I still need table-based layout in 2026?
display:flex and display:grid fall back to block, and padding on a <div> or <p> is dropped because Word pads table cells. The common compromise is a fluid-hybrid build: a <div> with max-width for every modern client, wrapped in an Outlook-only "ghost table" inside <!--[if mso]> conditionals.Why did my font turn into Times New Roman?
font-family with a web-safe face (Arial, Helvetica, Georgia, Tahoma, Verdana) and a generic family.Can I test this without buying Litmus or Email on Acid?
Do these tools use credits or tokens?
Stop finding Outlook bugs in the inbox.
Run the pre-flight before you send — free, in your browser, nothing uploaded. Or hand the build to the team that codes these for agencies every day.