Gmail’s image caching: How it affects email marketing & how to heal your opens tracking

Gmail started caching images (see and my post on It saves image files from unique URLs temporarily and changes the image URLs in newsletters so that they point to the cached images on The user’s browser then loads and displays Gmail’s cloned images. For marketers, this may lead to reduced tracking and marketing opportunities. Here is why.


Marketing issues from Gmail’s image caching

When Gmail loads images into the cache, the user’s device and geo information gets lost. An open will originate from a Mountain View IP address like And the user agent, which normally holds the user’s device information, looks like ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv: Gecko/2009021910 Firefox/3.0.7 (via’. This messes up your geo reporting map. It also limits opportunities to display customized banners to users on different devices (e.g. iOS versus Android) and users from different parts of the world (e.g. IP from Germany versus IP from the US).

Furthermore, images lie now static in Gmail’s cache- for hours or forever. Exchanging images on your webspace will not be visible to Gmail users until the cache is renewed. Think for example of offers, which are no longer valid, and of broken or wrong images that you want to switch. You can’t.

This also affects real time multivariate creative optimization and open tracking. When the tracking pixel is cached, another open from one tracking URL hits the cache, not the tracking server of your mailing software. This may lead to a decreasing number of total opens or, in extreme cases, to counting unique opens only.

Healing multiple opens tracking

As reported by Andrew from, reduced open tracking does not affect every service. CampaignMonitor for example seems to be immune, whereas MailChimp tracks only unique opens as long as the tracking pixel lives in Gmail’s cache.

What do both do different? One could think of using different or additional means to track opens like requesting a CSS file or a sound file. But both seem to use just an invisible tracking image, which is placed at the end of an email.

Here is the HTTP header information from a CampaignMonitor tracking pixel:

HTTP/1.1 200 OK
Server: csw
Cache-Control: private
Date: Sat, 07 Dec 2013 14:46:13 GMT
Content-Length: 0

Here is the header information from a MailChimp tracking pixel:

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 07 Dec 2013 14:49:19 GMT
Content-Type: image/gif
Content-Length: 35
Connection: keep-alive

I think the crucial difference is that the MailChimp server returns a resource of type ‘image’. That’s what Gmail is looking for. And that’s what Gmail caches. The CampaignMonitor server does – at first glance – not return an image. Gmail ignores it, and every call hits the CampaignMonitor server so that every open is counted.

Ergo: If you want to measure your total opens, don’t let your tracking URL return a resource of type ‘image’ with a predefined content-length greater than zero.


Oops, my bad. Seems as if it was the content-length that mattered in my little test, not necessarily the content-type. Returning type ‘image’ with a length of 1 gets cached. Returning type ‘image’ with zero length is not cached. The same may work with undefined content-lengths. According to Andrew, SmartFocus and Lyris are not affected either. Their tracking pixels return a resource of type ‘image’ (see lyris, see SmartFocus), but no content-length header information. Anyway, tracking multiple opens is still possible. You’ll find out how, I’m not nerd ‘nough to nail it. 😉

Update 2014-03-10:

Gmail changed their caching procedures in the past days. As Movable Ink points out, senders should be able to track multiple opens by transmitting a no-cache header, now.

Enjoyed this one? Subscribe for my hand-picked list of the best email marketing tips. Get inspiring ideas from international email experts, every Friday: (archive♞)
Yes, I accept the Privacy Policy
Delivery on Fridays, 5 pm CET. You can always unsubscribe.
It's valuable, I promise. Subscribers rate it >8 out of 10 (!) on average.

23 Responses to Gmail’s image caching: How it affects email marketing & how to heal your opens tracking

  1. Pingback: Gmail Tracking Changes: The Fix! | What You Need to Know | EmailExpert

  2. Pingback: Gmail Breaks Email Marketing? | EmailExpert

  3. As far as I can tell CampaignMonitor indeed returns nothing. It is not a valid image and therefore the image cache didn’t cache anything and calls the url each time the email is being opened.
    Lyric and SmartFocus might just see, that the Google cache expires after several minutes. Also when opening the same email on a different client (e.g. mobile phone) I’ve noticed additional non-unique opens.

    • yea that’s true, CM returns nothing. (And my cache-safe fake-pixel, too.) I can’t rewrite/remove the content-length header to see, if this makes a differences. But rendering-wise, I’d feel better returning an image as “promised”. 😉

  4. Pingback: Help! Gmail beperkt mogelijkheden marketeer | Statistieken, CMS, E-mail Marketing, Mobiele website

  5. We need to generate unqiue image link for each email we sent at that time i think , google will request every time for the image , we wont be able to track the ip of the user but still be able to know who has opened our emails. Security wise users will be more happy and Tracking wise i think we will get much better tracking reports.

  6. Pingback: Email analytics and Gmail image caching: the 5 things you need to know | All That I Know About Marketing Technology

  7. Pingback: The Death of Email Open tracking? Long live Email Open tracking. | intelligentproductdesign

  8. Pingback: Gmail adota cache de imagens. Qual o impacto no Email Marketing?

  9. …Does the http fix also resolve the issues with geolocation and user agent?

  10. I’m a bit confused, sorry to beat a dead horse. Doesn’t the tracking pixel give info related to geolocation and user agent?

    • and if one uses the content-length = 0 hack, which causes the pixel to be loaded each time it’s viewed, wouldn’t the other info follow along? …

  11. Hi,

    I set the Content-Length to 0, dispatch a Newsletter to 11 different Gmail accounts an opened them.
    Unfortunately I got only the Google-user-Agent. Is it sure, that setting the content-lenght to 0 is working?

    My Header:
    Content-Type:image/gif; charset=utf-8
    Date:Thu, 02 Jan 2014 10:12:36 GMT

    • If the http request returns ‘nothing’, then Gmail doesn’t cache the result. This works for me. I.e. this way, I can continue counting multiple opens. This of course is no solution to getting the user’s user agent and IP.

  12. Thanks for helping

  13. As far as I could test, gmail is already caching CampaignMonitor’s tracking image. Inspecting a test I’ve sent to my email, the url for the tracking image was

    • Interesting. However, each call still hits so that every open is counted. I just sent me a test mail and had a look. (Also interesting: images had been blocked by default for this email.)

  14. How can I make a fake-pixel? I made a header with content-type: image/gif, but without any image and content-length, when I send a campaign in the body of message the “fake pixel” goes with error 500. Can you help me?

  15. Pingback: Gmail auto unsubscribe and pilot FBL |

  16. Pingback: Problems with Open Tracking in Gmail, after changing its image caching. | Moosend

  17. Pingback: Gmail’s recent changes to image displays and the impact on email tracking | nadworks

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.