Skip to main content

Our email CSS engine is open source. Give it a star on GitHub 

Emailens
Blog

Outlook Ghost Tables: Multi-Column Emails That Don't Break

Wrap your inline-block columns in a table that only Outlook Classic reads, inside <!--[if mso]> comments, so Word gets fixed-width columns while every other client lets them wrap on narrow screens.

max-width

Works in 20 of 21. Partial in Outlook Classic.

The fix for Outlook Classic

Use a fixed-width table wrapper for Outlook

after
<!--[if mso]>
<table role="presentation" width="600" cellpadding="0"
  cellspacing="0" border="0" align="center"><tr><td>
<![endif]-->
<div style="max-width: 600px; margin: 0 auto;">
  Content here
</div>
<!--[if mso]>
</td></tr></table>
<![endif]-->
Show the original
before
<div style="max-width: 600px; margin: 0 auto;">
  Content here
</div>

The checker needs a computer screen.

A free account opens all 21 clients and keeps your checks for 7 days. Create a free account →

Real installs

Philippe Kam, founder of Emailens · Published 19 Jul 2026 · Updated 28 Oct 2026

@emailens/engine 0.18.22 · data last changed 10 Nov 2026

Part of the HTML email guide · all guides

You build a clean two-column email, it looks right everywhere, and then Outlook on Windows stacks the columns, blows out the width, or ignores them entirely. The fix for multi-column layouts in Outlook is a technique with an unfortunate name: the ghost table. Here is what it is, how it pairs with fluid hybrid columns, and the full code.

Why multi-column emails break in Outlook

Outlook Classic on Windows renders email with Microsoft Word, not a browser engine (the Outlook CSS support guide explains why). Word supports little of what you would reach for to build responsive columns:

Give it <div>s with max-width and it renders them full-width, stacked. What Word does understand is tables with fixed pixel widths. So the trick is to hand Outlook, and only Outlook, a table, while every other client gets the modern markup.

What an Outlook ghost table is

A ghost table is a table written inside MSO conditional comments, <!--[if mso]> ... <![endif]-->. Outlook Classic reads it; every other client sees a comment. How those comments work, and the [if !mso] form that does the reverse, is in MSO conditional comments and mso- CSS.

ghost-table.html
7 lines
<!--[if mso]>
  <table role="presentation" width="600"><tr><td>
<![endif]-->
  ...content everyone sees...
<!--[if mso]>
  </td></tr></table>
<![endif]-->

That table exists only for Outlook. It is a "ghost": present in the source, but invisible to the clients that do not need it.

The fluid hybrid pattern: columns that stack without media queries

The modern half of the layout uses display:inline-block boxes that are width:100% up to a max-width:

fluid-column.html
4 lines
<div style="display:inline-block;width:100%;max-width:300px;
            vertical-align:top;">
  ...column...
</div>

On a 600px-wide screen, two 300px-capped boxes sit side by side. On a narrow phone, they can't both fit, so the second wraps, and the columns stack. No media query required. It's called "fluid hybrid" (or the Campaign Monitor pattern) because it adapts to the available width on its own, and layers the ghost table underneath for Outlook. Media queries and the wider responsive strategy are in responsive email design.

A complete two-column ghost table

Put the two halves together and each column is an inline-block box for every client and a fixed-width table cell for Outlook Classic:

two-column-ghost-table.html
21 lines
<!-- Two columns: inline-block for every client, a ghost table for Outlook Classic -->
<div style="font-size:0; line-height:0; text-align:center;">
  <!--[if mso]>
  <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0"><tr>
  <td width="300" valign="top">
  <![endif]-->
  <div style="display:inline-block; width:100%; max-width:300px;
              vertical-align:top; font-size:16px;">
    ...left column...
  </div>
  <!--[if mso]>
  </td><td width="300" valign="top">
  <![endif]-->
  <div style="display:inline-block; width:100%; max-width:300px;
              vertical-align:top; font-size:16px;">
    ...right column...
  </div>
  <!--[if mso]>
  </td></tr></table>
  <![endif]-->
</div>

Two mistakes that misalign ghost table columns

  • The inline-block gap. Whitespace between inline-block elements renders as a visible gap. Set font-size:0 on the container and reset it on each column, and the gap disappears.
  • Ghost table widths must match. The <td width="..."> values in the ghost table have to equal your column max-widths, or Outlook's columns won't line up with the design everyone else sees.

Generate the ghost table instead of hand-writing it

The pattern is fiddly: matching widths, nesting the conditionals, getting the font-size:0 reset right. Rather than assemble it by hand, generate it: the Outlook ghost table generator builds a fluid-hybrid layout for 1-4 columns with a live preview and copy-paste HTML.

Questions

What is an Outlook ghost table?

A ghost table is an HTML table wrapped inside Microsoft MSO conditional comments (<!--[if mso]> ... <![endif]-->). It is parsed strictly by Microsoft Word's rendering engine in desktop Outlook, giving it fixed pixel columns while remaining completely invisible to all modern email clients.

Why do columns stack on mobile without media queries?

The fluid hybrid pattern applies display:inline-block and max-width:300px to each column container. When the viewport narrows below 600px, the available horizontal width cannot fit both boxes, forcing the second column to wrap and stack automatically.

How do I remove the horizontal gap between inline-block columns?

Browsers and webmail render whitespace (line breaks and spaces) between inline-block tags as a 4px gap. Eliminate it by setting font-size: 0; line-height: 0; on the outer container, and restoring font-size: 16px; on the column containers.

Does the New Outlook for Windows still require ghost tables?

Not for the new Outlook itself. In the engine's data (its Outlook (New) cells are the engine's mapping), display:flex works in Outlook (New). display:flex is not supported in Outlook Classic. The ghost table is for readers still on Outlook Classic, and every other client reads it as a comment.

Your next question

Also useful: Outlook Ghost Table Generator · max-width in Outlook Classic: the fix · CSS Grid in Outlook Classic: the fix

Paste the email that broke.

The checker needs a computer screen.

Every account includes one free real-device check in classic Outlook, Outlook for Mac and Apple Mail, after you verify your email and run one preview, while this month's free capacity lasts. How real-device checks work →

Get new email CSS fixes by email, or follow by RSS.