Dark Marketo Alleys: Counting non-Marketo email opens using a “pixel LP”

This trick definitely falls into the Only if you insist… category, but it'll show you a bit about how Marketo LPs work.

N.B. This post isn't about tracking email clicks in non-Marketo emails. Click tracking (via self-associating Visit Web Page events) is a very worthy endeavor and one that's the subject of another long-simmering blog post.

Rather, today's topic is an even further frontier: inserting a Marketo-aware tracking pixel that can count the number of image-enabled opens (like any tracking pixel, it only works if the lead views the HTML version of the email, has images enabled, and doesn't have a firewall that blocks such things).

I was reminded of this technique when this Community post came up. It appears the OP is letting salespeople send their own holiday cards (I assume through some specific vendor) and is wondering if there's any way to tell how many were opened within Marketo.

The immediate response from Marketo master Josh Hill was appropriate: You can't do this. I seconded Josh because overall I think it's good for people to realize just how much more you get by sending everything through Marketo. But strictly speaking, if all you want is the count and not actually who opened the email, you can do something pretty simple to display the number within the Marketo UI.

Get hackin': Go to your favorite registrar

First, I cannot recommend strongly enough that you buy a new domain for this purpose. It doesn't have to be anything interesting or necessarily brand-related, since the lead won't see it. But the domain shouldn't be used for anything else but this hack. Use the domain in as many emails/programs as you want, but only for synthetic open tracking as described here. (I can explain the reasons for this at another time or if someone wonders in the comments.)

Add a Domain Alias in Marketo and point the DNS CNAME to your LP domain as you usually would.

Here, my primary domain is for example.com and I've registered the new domain example.partners:

ss

(.partners is one of the newly registerable gTLDs, mktemail could be any hostname of your choosing.)

Add an LP to serve as your “pixel”

Next, add a blank LP:

ss

You should strive to have the LP have no content at all — base it on a blank template, with no Munchkin, no JS, no CSS, no META tags, no anything. The smaller the HTML source, the more reliable the method.

Embed the pixel in your emails

Now, use that LP as a pixel:

<table border="0" height="1" width="1">
  <td background="http://mktemail.example.partners/plab11_trk" 
    bgcolor="#ffffff" 
    width="1" 
    height="1" 
    valign="top">
    <!--[if gte mso 9]>
    <v:rect xmlns:v="urn:schemas-microsoft-com:vml" 
      fill="true" 
      stroke="false" 
      style="width:1px;height:1px;">
      <v:fill 
        type="tile" 
        src="http://mktemail.example.partners/plab11_trk" 
        color="#ffffff" />
      <v:textbox inset="0,0,0,0">
    <![endif]-->
    <div>
    </div>
    <!--[if gte mso 9]>
    </v:textbox>
    </v:rect>
    <![endif]-->
  </td>
</table>

(Credit to the table background builder at backgrounds.cm) for the cross-browser belts-and-suspenderses.)

Now, you will see the number of people who opened the email as “views” (as spoiled in the previous screenshot)!

Why does it work?

Simply put: *IMGs and background-images are always fetched, even if the URL does not return a displayable image*. It can be a GIF, JPG, PDF, text file, empty response, or a full webpage — or a 404 or 500 error. The browser has no idea, when it makes the request, whether the response is going to be valid. The server gets the hit no matter what the client does with it.

And Marketo counts LP views (under Statistics) at the raw HTTP level, no JavaScript required.

The reason we use a <TD> background image instead of a foreground <IMG> tag is that since the “pixel” doesn't contain real image data, we sure it fails to display silently instead of with any kind of broken image icon (even if it's just a 1x1 icon). Background images have the cool feature of always being quiet when they fail to load and/or render.

What about tracking opens at the lead level?

Actually, that's possible too. But it requires more development, since you need to pass the tracking pixel through your own server and then create a synthetic lead activity. In contrast, the method above is simple and code-free.

There are even more open-tracking tricks you can do with just a “dumb” pixel, but since opens are at best directional (i.e. a upward/downward trend in opens is interesting, but the raw number is a subset of the people who actually read your content) I'll skip 'em for today.