Gmail started caching images (see wordtothewise.com and my post on emailmarketing.de): It saves image files from unique URLs temporarily and changes the image URLs in newsletters so that they point to the cached images on googleusercontent.com. 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 126.96.36.199. 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:188.8.131.52) Gecko/2009021910 Firefox/3.0.7 (via ggpht.com)’. 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 emailexpert.org, 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 P3P: CP="OTI DSP COR CUR IVD CONi OTPi OUR IND UNI STA PRE" 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. 😉
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.
Pingback: Gmail Tracking Changes: The Fix! | What You Need to Know | EmailExpert
Pingback: Gmail Breaks Email Marketing? | EmailExpert
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”. 😉
Pingback: Help! Gmail beperkt mogelijkheden marketeer | Statistieken, CMS, E-mail Marketing, Mobiele website
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.
Yup, that’s how it works. Gmail is aware of that:
Pingback: Email analytics and Gmail image caching: the 5 things you need to know | All That I Know About Marketing Technology
Pingback: The Death of Email Open tracking? Long live Email Open tracking. | intelligentproductdesign
Pingback: Gmail adota cache de imagens. Qual o impacto no Email Marketing?
…Does the http fix also resolve the issues with geolocation and user agent?
Nope. I doubt there will be a solution to this soon. The ‘fix’ prevents Gmail from caching a web bug.
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? …
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?
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.
Thanks for helping
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 https://ci5.googleusercontent.com/proxy/ugT5b0lfOEqGc7nidgQHqO50ErM2ydbHzaw0MKcQEoDfBV8DJhlkIw_jZSBNwQQXj8z2CSJ6IvxgA0ug3EH2cCn7obs=s0-d-e1-ft#https://cmail2.com/t/r-o-pfhhik-tiliklvq/o.gif
Interesting. However, each call still hits cmail2.com 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.)
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?
Pingback: Gmail auto unsubscribe and pilot FBL | blog.inboxplacement.com
Pingback: Problems with Open Tracking in Gmail, after changing its image caching. | Moosend
Pingback: Gmail’s recent changes to image displays and the impact on email tracking | nadworks