Why does your email look broken in dark mode?

Dark mode email failures cluster into 7 patterns: vanishing logos, rewritten brand colors, dead buttons, image halos. What causes each and how to fix it.

Close-up of a smartphone screen glowing in a dark room

Because there is no dark mode standard in email, and the failures cluster into seven patterns: logos that vanish, brand colors that get rewritten, text that ends up low contrast on a transformed background, buttons that lose their fill or their border, images that show halos and light corners, sections that only half convert, and client-specific behavior nobody previewed. Six of the seven are build problems you can fix in the HTML. The seventh is a QA problem, and it is the one that ships, the kind campaign production management is meant to catch before send.

The useful mental model is three behavior families, not a list of clients. Some surfaces leave your message body alone and just darken the app shell around it. Some apply selective rewriting, closer to contrast repair than a mathematical invert. Some force an aggressive transform that flips your palette outright. One send gets all three treatments.

Why does my logo disappear in dark mode?

The symptom: logo-navy.png is a transparent PNG with dark artwork.

On a darkened surface the artwork and the background sit at nearly the same value, and the logo is gone. Same failure in reverse for a white knockout logo when a client lightens a dark section.

Where it happens: any partial or full invert surface, so Gmail iOS, Gmail Android, Outlook.com, Outlook mobile. The mechanic is that the client preserves your image while transforming the color around it.

The fix is to stop shipping a logo that depends on the background behind it. Give the mark 20 to 30 pixels of padding in a color that reads on both light and dark, add a thin keyline, or sit it on a controlled backing shape. A light and dark image swap using display:none plus max-height works in standards-friendly clients, but classic Outlook has known display:none inheritance bugs and Gmail may reveal both assets, so treat the swap as an enhancement. The fallback that always holds: pick a logo treatment with acceptable contrast on both #FFFFFF and #111111.

Why do my brand colors get rewritten?

You built a hero on #0B1F3A. In Gmail iOS it comes through as a washed pale blue. Already-dark designs carry the highest risk here, because a forced-dark transform can flip a dark section into a light one.

Where it happens: Gmail iOS and classic Outlook for Windows are the two aggressive surfaces. Neither gives you a reliable authored path out. Gmail does not support prefers-color-scheme as a practical targeting API, and classic Outlook renders through the Word engine with no dependable media query support.

There is a known workaround for Gmail accounts: declaring a surface as a one-color gradient, linear-gradient(#663399,#663399), survives the transform more often than a plain background color. It is a repair, not a theme. Gmail Android has been observed rewriting inline gradient values into broken CSS, and Gmail with a non-Google account strips most of the embedded CSS these hacks depend on. The reliable move is a mid-tone palette that stays on brand after a transform.

Why is my text unreadable after inversion?

Background color and text color are evaluated independently, which explains most contrast failures.

A client can darken a card and leave #666666 body copy where it was, or lighten a colored panel and leave your #FFFFFF headline on top of it.

Where it happens: Gmail iOS is the worst case for white text on a brand color. Outlook web produces the subtler version, where a section darkens and the copy inside it survives at the wrong value.

Two fixes. First, avoid pure #000000 on pure #FFFFFF as your only contrast strategy and avoid light gray body copy, because both sit where a transform makes things worse. Second, for specific Gmail iOS failures with white text on a colored surface, the community blend-mode pattern nests mix-blend-mode: screen and mix-blend-mode: difference wrappers inside a gradient surface to push blackened text back toward white. Test it before production and keep the email readable without it.

Why do my buttons break in dark mode?

Two different failures, one symptom. In classic Outlook for Windows, a VML button fill and the HTML layer inside it are transformed through different paths, so you get a dark rectangle sitting behind the label, or a fill and a stroke that no longer match. Everywhere else, the fill changes but the one-pixel border, arrow, or icon stops separating the button from the surface behind it.

Keep the VML fallback scoped to classic Windows Outlook inside an MSO conditional, and keep the inner Outlook-only link background transparent so the two layers cannot disagree. New Outlook, Outlook web, and Outlook mobile are not VML clients, so do not reuse that pattern there. For the general case, do not rely on a thin border for legibility. Use a padded cell with bgcolor and an inline background-color, and pick a fill with enough contrast that the button reads even if the border is rewritten.

Why do my images have halos or light corners?

Three variants. A hero exported as a JPEG with a white background becomes a white slab floating in a dark email. Rounded corners cut as image slices stay light while the CSS background around them darkens, so the card visibly tears apart. And anti-aliased edges on transparent PNGs show a pale fringe once the surface behind them changes.

Outlook.com and Outlook web reliably reproduce the sliced-corner version: CSS colors get rewritten while image content is preserved.

The fixes are unglamorous. Use real CSS border-radius instead of image corners. Export artwork with genuine transparency rather than a baked white background. Keep a single flat background color behind image blocks so there is one color to reason about. Where an image has to carry a background, match it to a mid-tone that survives in both modes.

Why does only part of my email go dark?

Because at least one major surface is doing contrast repair rather than inverting.

Community inspection of Outlook web behavior points to a 4.5:1 contrast threshold and a lightness remap in CIELAB before it rewrites inline colors. That is why a card darkens while the #EEEEEE divider inside it stays bright, or a table cell keeps its bgcolor while its parent changes: each value is judged on its own.

Outlook.com also stores your original values in data-ogsc, data-ogsb, data-ogac, and data-ogab attributes, which is what makes [data-ogsc] and [data-ogsb] selectors useful as an override hook. Expect Outlook.com to write its own inline !important on top of yours, and expect your dark CSS to sometimes stay active after a recipient hits "Turn on the lights."

Practical rules: put backgrounds on tables and cells rather than only on body, pair bgcolor with background-color, use softer or semi-transparent dividers instead of a hard #EEEEEE rule, and always ship literal color fallbacks if you use CSS custom properties.

Why does it look fine in Gmail web but broken on my phone?

Because Gmail web is mostly a no-change surface.

It darkens the interface around your email and leaves the message body close to how you authored it. Checking dark mode there and calling it tested is why most dark mode bugs reach an inbox.

Treat these as separate targets, because they behave differently:

SurfaceBehaviorAuthored dark CSS
Apple Mail (macOS, iOS)Honors scheme declarationscolor-scheme plus prefers-color-scheme
Gmail webBody largely unchangedNo reliable path
Gmail iOSFull invert riskNo reliable path
Gmail AndroidAlgorithmic partial darkeningNo reliable path
Gmail with non-Google accountReduced CSS, hacks strippedNo
Outlook.com and Outlook webPartial invert, contrast repair[data-ogsc], [data-ogsb]
Classic Outlook for WindowsFull invert risk, Word engineMSO and VML fallbacks only
New Outlook for WindowsWebView-based, verify per buildTest required

Two caveats worth internalizing. color-scheme and supported-color-schemes meta tags are a signal that Apple-family clients honor, not a switch that opts you out of recoloring elsewhere. And recipients have their own controls, including light reading panes and background toggles, so part of your list sees the light version no matter what your HTML says.

How do you make dark mode part of QA, not a surprise?

Dark mode is not a separate test pass. It is a second row per client in the matrix you already maintain. If you have not built that matrix yet, start with which email clients are actually worth testing and pull the client and device split from your own opens.

Then make the checks explicit rather than leaving them to whoever opens the screenshots.

What a dark mode check actually verifies

  1. The logo is visible against both the light and dark version of the surface
  2. The CTA label reads clearly against its fill color
  3. No content block has become a light slab on a dark background
  4. No divider, border, or icon has gone invisible, or is glowing at the wrong value

Those checks belong in the same pre-send checklist as your link and merge field checks, not in someone's head, alongside the rest of our production guides for that same sequence.

The last piece is where the evidence lives. A dark mode failure spotted in a Slack thread at 6pm on Thursday has a habit of being fixed in v4 and forgotten by v6. In LaunchSign, QA is a blocking validation phase on the markup deliverable: the checklist is recorded against the sealed version, comments are pinned directly on the render, and the campaign cannot reach client sign-off until that phase closes.

If that sounds like the gap in your current process, see how the production workflow handles it.

FAQ

Can I force my email to always render in light mode?

No. You can declare color-scheme and supported-color-schemes, which Apple-family clients honor, and you can build a defensive palette. Outlook web writes its own inline styles, classic Outlook for Windows applies transforms ordinary CSS cannot block, and recipients have their own toggles.

Does prefers-color-scheme work in Gmail?

Not as a dependable targeting path for HTML email. Gmail supports a useful CSS subset, but dark mode there is a resilience problem rather than a theming one. Reserve authored dark CSS for Apple Mail and treat Gmail as something to survive.

Should I build a separate dark version of every email?

Only if a meaningful share of your opens come from clients that honor authored dark styles, which in practice means the Apple Mail family. For everyone else the return is higher on a light palette that transforms gracefully.

How much does dark mode add to testing cost?

Roughly one extra render per dark-capable client. A 15-client set becomes 20 to 22 rows if you add dark checks everywhere. Most teams get the coverage they need by adding dark rows only to their top five surfaces plus classic Outlook.

Share

See how LaunchSign handles this in practice

Book a 30-minute walkthrough of the full campaign production workflow, from brief to client sign-off.

Book a demoStart free → 30 days Pro

Keep reading

All posts →
Close-up of a person checking their phone next to a morning coffee cupCampaign QAHow do you set email personalization fallbacks?Give every merge field a template-level fallback, then test with rows that fake missing data. Syntax for SFMC, HubSpot, Braze, Klaviyo and Mailchimp.Close-up of a smartphone home screen showing the Gmail app icon among other communication appsCampaign QAWhich Email Clients Should You Actually Test?Testing 90 email clients is procrastination. How to build a render matrix from your own open data, which clients earn a permanent slot, and what to skip.A hand using a stylus to tick checkboxes on a checklist on a tabletCampaign QAWhat goes on an email pre-send checklist?Generic QA lists fail because nobody reads item 23. The 10 checks that actually catch errors, adapted by campaign type, with one named owner.