Blog/Publisher

Newsletter Ad Not Showing? Why the Slot Comes Back Blank

A blank newsletter ad slot is either an image the reader's client never loaded or a deliberate 1×1 from the ad server. In the first hours of logging every exit, 243 of 247 requests were tag problems, not demand. How to tell which, and who fixes each.

MT
MailAdx Team
Published 3 Oct 2026·15 min read
Newsletter Ad Not Showing? Why the Slot Comes Back Blank

When a newsletter ad slot shows up empty, one of two very different things happened. Either the reader's email client never loaded the image, or it loaded it perfectly and the ad server deliberately sent back a blank. Almost every troubleshooting guide covers the first case: images turned off, a blocked domain, a broken URL. In our logs the second case is far more common, and it has a different set of causes and a different person who can fix each one.

The quickest way to tell them apart: open the ad's image URL in a browser. A broken-image icon or an error means the image never arrived. A blank page with nothing visible usually means a 1×1 transparent image came back on purpose. That second response almost always means one of four things. The tag reached the ad server without a subscriber to decide for. It was a preview or a web copy where there is no subscriber at all. No ad was eligible for that reader. Or an ad was chosen but its creative could not be delivered.

This post goes through each cause, how to recognise it and who fixes it. It ends with the one diagnostic I now check before anything else.

Why we started logging every blank

For a long time, the MailAdx ad server recorded what it served and very little about what it did not. A request that ended in a blank left a warning in a log file and nothing anyone would look at. When a publisher asked why their slot was empty, the honest answer was that we would have to go and find out.

So we built a ledger that records how every serving request ends: every exit from the code, filled or not, counted in 15-minute buckets. In the first hours after it went live, 243 of 247 display requests ended at the same exit, "email hash missing". The tag was reaching us, but without the subscriber identifier it needs, so there was no reader to choose an ad for. Not one of those requests was a demand problem. Every one was a template problem that nobody could see.

That distribution is the argument of this post. When an ad slot is blank, the instinct is to look at demand: not enough advertisers, floor too high, campaigns paused. Sometimes that is right. Much more often, in our experience, the slot never got as far as an auction.

Step one: did the image load at all?

Start on the reader's side, because it is the quickest thing to rule out.

Images turned off. Some email clients do not download remote images until the reader allows it. Outlook for Windows has historically blocked them by default for senders not on the reader's safe list, and many corporate mail setups enforce the same. Gmail shows a "Display images below" bar in some cases. A reader with images off sees no ad and also no images anywhere else in the email, so this case is easy to spot: if the logo and header are missing too, it is not an ad problem.

Blocked by an extension or network. Ad and tracker blockers in the browser, corporate web filters and some security software block image requests to domains they classify as advertising. Same signature: the image request never leaves the reader's device, so the ad server never sees it.

Clipped by Gmail. Gmail clips messages whose HTML exceeds roughly 102KB and shows a "[Message clipped] View entire message" link. Anything below the clip, including an ad placed near the end of a long issue, is not loaded until the reader clicks through. If your ad is near the bottom and your issues are long, this is worth checking before anything else. Moving the slot higher, or trimming the template's HTML, fixes it. Our ad unit placement guide covers where slots tend to perform.

All three of these share one property: the ad server never receives a request. If your serving reports show requests for the issue but readers report a blank slot, the image did load, and the cause is further along.

Step two: did the tag reach the ad server intact?

An open-time ad tag is an image whose URL carries three things the ad server needs: who the publisher is, which slot this is, and which subscriber is reading. If any of them is wrong or missing, the server cannot make a decision and returns a transparent 1×1 image rather than guessing. The open-time ad serving explainer covers why the decision happens at the open rather than at the send.

The setup failures, in the order we see them:

What arrived                         What it means                    Who fixes it
──────────────────────────────────── ──────────────────────────────── ────────────
eh= empty                            No subscriber value at send      Publisher
eh={{something}} literally           ESP did not fill the merge tag   Publisher
eh=null / undefined                  Merge field empty for reader     Publisher
eh= a 32-char value or an ID         Wrong kind of identifier         Publisher
pub= not an active publisher         Wrong or stale tag               Publisher
pk= not a known ad unit              Wrong slot key in the tag        Publisher
Ad unit paused                       Slot switched off                Publisher
URL that cannot be parsed            Usually an unfilled merge tag    Publisher

Every row on that list is a template or configuration problem, and every one is fixed on the publisher's side. That is not a criticism of publishers. Most of these failures are invisible from the publisher's side unless someone shows them.

Wrong publisher or slot

A tag copied from an old campaign, a tag from a different publication on the same account, or a slot key typed by hand. The fix is to copy the tag again from the source for the slot it belongs to, rather than editing an old one. If the slot exists but is paused, it returns blanks until it is resumed. That is intended behaviour, and it surprises people who paused a unit for one issue and forgot.

The subscriber identifier

This is the big one. MailAdx identifies a reader by the SHA-256 hash of their lower-cased email address, passed in the tag as eh=. The hash is what makes frequency caps, targeting and click attribution work without the address itself appearing in the URL. Our post on email hash audience targeting explains why it is a hash and lists the merge tag for each email platform.

That merge tag is where most integrations go wrong, because email platforms differ a lot in what they can do at send time. Some, such as Klaviyo, beehiiv and Brevo, can produce a SHA-256 hash directly in the template. Others, including Mailchimp and Kit, have no hashing function at all. Publishers on those platforms have to store the hash in a custom field, and that field has to stay filled.

That second requirement is where the "email hash missing" flood comes from. A publisher imports their list, fills the hash field for every existing subscriber, puts the field's merge tag in the ad tag and sees ads serve. Then new subscribers arrive. Nothing fills the field for them, the merge tag renders empty, and the slot is blank for exactly the readers who just joined, the ones most likely to be reading closely. A Kit publisher who wrote to us recently had this exact problem, made harder by a merge tag our own documentation had got wrong. We have since corrected the docs.

There are three ways out, depending on the platform:

  • Use the platform's own hash function where it has one. Nothing to maintain.
  • Keep the custom field filled automatically, through the platform's API or an automation that runs when someone subscribes.
  • Pass the subscriber's email address in the same eh= slot, URL-encoded, and let the ad server hash it on arrival. MailAdx supports this for its display and click endpoints, and stores only the hash. The trade-off is that the address travels in the image URL to our server before it is hashed, so it passes through any image proxy the reader's mail provider uses. Decide whether that fits your privacy commitments to readers before choosing it.

One more subtle variant: a hash of the right length in the wrong format. Upper-case hex, a value with spaces trimmed incorrectly, or an MD5 (32 characters) produced by a platform whose "hash" merge tag uses a different algorithm. All of them look plausible in a template and all are rejected, because a wrong identifier would break frequency caps and attribution for that reader. The platform-specific guides for Mailchimp, Klaviyo, beehiiv and Kit cover each one.

Encoding problems

Email is often sent with quoted-printable encoding, which wraps long lines and escapes certain characters, including =. Most email clients decode it correctly before fetching images. When something in the chain does not, or when an editor has inserted a line break or a soft hyphen inside the URL, the tag arrives mangled. The symptom is a request we can identify as ours but cannot read. The fix is to keep the ad tag on a single line in the template and to check, in the received email's source, that the image URL arrived exactly as written. Do not base64-encode or otherwise transform the hash.

Step three: was there a subscriber to decide for?

Two cases produce blanks that look like failures and are not.

Editor previews. When you look at an issue in your email platform's editor or preview pane, merge tags have not been filled yet, because filling them is part of sending. The tag reaches the ad server with an unfilled tag where the subscriber should be, and the ad server correctly declines to serve. This is the most common source of "my ad is not showing" messages from publishers setting up for the first time. Test by sending the email to a real address on your list, not by previewing it.

Web and archive copies. When an issue is opened as a web page, through "view in browser" or a public archive, there is no subscriber attached. The ad server cannot apply frequency caps or targeting to nobody, so the slot is blank. If archive monetisation matters to you, it needs a different kind of tag, and the post on inventory beyond the broadcast issue discusses why archive pages are inventory at all.

Our serving reports separate both of these from genuine tag problems, so a publisher who previews an issue twenty times does not see a tag health warning for it.

Two further cases are intended. A reader who has opted out of ads through Ad Choices receives a blank, permanently, which is the point of the opt-out. And a second request for the same reader and slot within a few seconds re-serves the same ad rather than running a new auction, so one open is not counted twice.

Step four: was there an ad for this reader?

Only now are we in demand territory. The tag was intact, the subscriber was known, and the auction ran. It found nothing eligible.

That is a real outcome and not always a bad one. Every campaign carries rules that exclude readers, and a slot is blank for a reader when every campaign excluded them. The usual exclusions:

  • Targeting. The reader is outside every live campaign's audience, location or topic.
  • Frequency caps. The reader has already seen each eligible campaign as often as its cap allows. Across several publishers this compounds, as covered in cross-publisher frequency capping.
  • Fatigue. The reader has seen a campaign repeatedly without clicking, and the system has stopped showing it to them for a while. This one is covered in depth in newsletter ad fatigue, including a bug in our own fatigue counter that once made this exclusion permanent.
  • Budget and pacing. The campaign has spent its daily budget, or pacing is holding it back to last the flight.
  • Dates. The flight has not started or has ended.
  • Price. No eligible demand met the slot's floor.

The fixes here are commercial rather than technical. More demand sources in the waterfall, a floor set against real bids rather than hopes (floor CPM guide), or a house ad as the last resort so an unsold slot promotes your own paid tier or referral programme instead of collapsing. The fill rate guide goes through these in order.

One caution. If no-fill rises suddenly while nothing about your demand changed, look at frequency and fatigue rules before anything else. A rule that excludes more readers than intended looks, in an aggregate report, exactly like advertisers losing interest.

Step five: was the ad chosen but not delivered?

The last group is the most frustrating, because the auction worked. An ad won. The reader still saw nothing.

  • The winning creative has no image. An image tag can only show an image. A creative built as HTML only cannot be served into an image slot. The fix is on the advertiser's side: supply an image version. Our creative specs list what works in email.
  • The creative's image could not be fetched. A hosting URL that expired, moved or returns an error. The ad server tries, fails and returns a blank rather than a broken image.
  • A programmatic win with nothing deliverable. An external buyer won the auction but its response contained no plain image an email can display. Email cannot run the scripts most programmatic creative depends on.
  • The surrounding frame timed out. Where a slot has an "Ad" label or an AdChoices mark around it, those are separate small images. If the ad decision is not made within about two seconds of the frame image being requested, the frame hides itself, so readers never see an empty labelled box.

These are rare compared with the earlier groups, but they cost the most per occurrence, because demand was there and was lost.

A test you can run in ten minutes

When a publisher tells us their slot is blank, this is the sequence we go through with them.

  1. Send, do not preview. Send the issue to a real address that is on your list, with the subscriber record complete. Open it in a normal mail client.
  2. Check the other images. If the logo is missing too, it is the reader's client, not the ad.
  3. Read the tag that arrived. View the received email's source and find the ad image URL. Check that the publisher, slot and subscriber values are filled in, that the subscriber value is 64 lowercase hex characters (or the URL-encoded address if you use that option), and that the URL is on one line.
  4. Open that URL in a browser. An ad image means serving works and the problem is on the reader's side. A blank means the server declined, and the reason is in your reports.
  5. Read the reason. In MailAdx, the publisher portal's Tag Health view groups your recent ad requests by how they ended, says what to change for each tag problem, and keeps previews and web copies out of the problem count. The publisher tools page describes the rest of the portal.

If the reason is a no-fill rather than a tag problem, the question becomes commercial, and your fill and revenue reporting is the place to start.

The one number I check first

After building the ledger, I changed what I look at when a publisher's revenue is lower than expected. Before fill rate, before eCPM, before demand, I look at one split: of the requests that ended blank, how many ended blank because of the tag, and how many because there was no ad.

Those two numbers have different owners. Tag blanks are fixed in the publisher's template, usually in minutes, and they recover revenue that demand was already willing to pay. No-fill blanks are fixed by adding demand or changing rules, which takes longer and is less certain. A publisher with a 60% blank rate made up almost entirely of tag problems does not have a demand problem. They have a merge tag problem, and it is the cheapest revenue they will ever recover.

This is also why a headline fill rate on its own misleads. A slot that is "80% filled" might be losing most of its remaining 20% to a merge tag that fails for new subscribers, which is invisible in the aggregate and obvious in the split. The same logic applies to the clicks that ads receive once they are shown, where our analysis of bot and scanner clicks separates machine activity from readers before anyone reads the rate.

If you are setting up a newsletter for ads for the first time, the integrations page lists the platforms we have guides for, and the help centre answers the setup questions we get most often.

Frequently asked questions

Why is my newsletter ad not showing?

Either the reader's email client did not load the image, or the ad server deliberately returned a blank. Open the ad image URL in a browser to tell them apart. If an ad appears, the problem is on the reader's side, such as images turned off or a blocker. If the response is blank, the server declined to serve, most often because the tag reached it without a valid subscriber identifier, or because no campaign was eligible for that reader.

Why does my ad show in a test send but not in the preview?

Previews in an email platform's editor show the email before merge tags are filled, so the ad tag has no subscriber value in it. The ad server cannot decide an ad for nobody and returns a blank. Always test newsletter ads by sending the email to a real address on your list.

What does "email hash missing" mean?

The ad tag reached the ad server with an empty subscriber value. The merge tag was in the template but rendered as nothing for that reader, usually because a custom field holding the hash was never filled for them. It most often affects subscribers who joined after the field was populated. Use your platform's own hash function where one exists, keep the field filled automatically, or pass the email address for hashing on arrival.

Why is my newsletter ad blank in the web version of the email?

A web or archive copy of a newsletter has no subscriber attached, so frequency caps, targeting and attribution cannot apply. The ad server returns a blank rather than serving an ad it cannot account for. This is expected behaviour, not a setup error.

Can Gmail hide an ad at the bottom of a newsletter?

Yes. Gmail clips messages whose HTML exceeds roughly 102KB and shows a link to view the entire message. An ad placed below the clip point is not loaded unless the reader clicks through. Moving the ad slot higher or reducing the template's HTML size avoids it.

Why is my ad slot blank even though I have advertisers?

Because every eligible campaign excluded that reader. Targeting, frequency caps, fatigue rules, daily budgets, flight dates and price floors each remove campaigns for specific readers. If blanks rise suddenly without any change in demand, check frequency and fatigue settings first, since an over-strict rule looks like falling demand in aggregate reports.

Should a newsletter ad slot ever be empty?

Occasionally, yes. Previews, web copies, readers who opted out of ads and readers with no eligible campaign should all receive a blank rather than a wrong ad. What matters is the reason. Blanks caused by the tag are worth fixing immediately; blanks caused by a lack of demand are better filled with a house ad promoting your own offer than left empty.

Stay ahead of the newsletter ad space

Get weekly articles on email monetisation, ad tech, and platform updates.

Subscribe + request demo →
MT
MailAdx Team

Editorial & Product

2026-10-03·15 min read

Related articles

Ready to monetise your newsletter?

See how MailAdx fits your setup in a personalised 30-minute demo.

No credit card required
Setup in 30 minutes
Dedicated onboarding