Really, finally winning the Marketo Forms vs. Tracking Protection battle | Community
Skip to main content
SanfordWhiteman
New Participant
November 12, 2019

Really, finally winning the Marketo Forms vs. Tracking Protection battle

  • November 12, 2019
  • 56 replies
  • 40630 views

⚠️ The custom config in this post is no longer necessary post-2021, as the Forms 2.0 library has been updated to load everything from your LP domain.

 

While you should be loading embedded forms from your Marketo LP domain, it turns out just changing the URL is not enough.

 

Using a non-Marketo-owned domain to load forms2.min.js and call loadForm() seems to avoid collateral damage from Tracking Protection (Firefox’s built-in feature or the equivalent plugin for another browser). The form will at least show up on the page if you do that.

 

But – I’m sure you will be dismayed to learn – the form still won’t post under TP! You also need to upload a file to Design Studio and add a tiny bit of JavaScript. Then and only then are you good to go.

 

First, download this file:

 

marketo-xdframe-relative.html

 

(Note: the Marketo Nation site gates files through an “Offsite Link” popup. So click above, then right-click the link + Save Link As. Make sure you get the .html file itself, and don’t end up with a snapshot of this blog post!)

 

Next, upload the file to your Design Studio. To be clear, you’re not creating an LP, you’re uploading the file as static HTML. This may not be something you’ve done before (you probably upload images, CSS, and PDFs) but Marketo actually supports any kind of file.

 

Screenshot after it’s been uploaded to Design Studio:

 

Then replace your embed code with this ever-so-slightly different version:

 

 

<script src="//pages.example.com/js/forms2/js/forms2.min.js"></script> <form id="mktoForm_9999"></form> <script> MktoForms2.setOptions({ formXDPath : "/rs/123-ABC-456/images/marketo-xdframe-relative.html" }); MktoForms2.loadForm("//pages.example.com", "123-ABC-456", 9999); </script>‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

 

Where:

 

  • 123-ABC-456 represents your Munchkin ID
  • pages.example.com represents your Marketo LP domain
  • 9999 is o’course your form ID

 

A live demo (though all the code is above):

 

MktoForms2 :: XDFrame relative path for Tracking Protection

 

The why

Using your LP domain enables forms to show up. But there’s a special asset, only used upon submission, that will still be blocked by default. Naturally, this only reveals itself when you run end-to-end tests.

 

See, embedded forms use an IFRAME message relay (XDFrame) for cross-domain posts (there are other ways to do it, but they’re not as backward-compatible and the IFRAME method works fine + fast in all browsers, even back to IE8).

 

But the IFRAMEd document loads forms2.min.js from an absolute URL with your instance hostname, i.e. app-xxnn.marketo.com:

Oops! Tracking Protection ain’t gonna let that load, for the same reason it doesn’t like a Marketo domain in the main document. (You can’t avoid TP by using an IFRAME, that would be silly.)

 

As you can see, the replacement XDFrame file uses a relative URL (/js/forms2/js/forms2.min.js), so it loads from your Marketo LP domain like the rest of the assets. Presto! No marketo.com for TP to get all paranoid about.

 

NOTES

forms2.min.js inside the IFRAME is only necessary because of its bundled  jQuery library, specifically the MktoForms2.$.ajax wrapper method. While not technically necessary, using jQuery keeps parity with the Forms 2.0 API.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.

56 replies

SanfordWhiteman
New Participant
January 7, 2020

I have not yet blogged about it... might be easier for me to send you a few screenshots. It's literally a 10m setup + test with AWS CloudFront.

Ben_Bordofsky
New Participant
January 7, 2020

Hey @Sanford Whiteman

Thanks for the post and all of your responses to everyone. It's very helpful and greatly appreciated!  

Do you have any suggested resources/readings for how to setup a CDN to avoid the Marketo SSL solution? I'm interested in exploring this route before ponying up for the Marketo SSL. 

SanfordWhiteman
New Participant
January 7, 2020

Open the XDFrame URL, by itself, in your browser. As it redirects to your fallback page, it cannot work.

Michael_Sogunro
New Participant
January 7, 2020

I spoke tooooooooo soon. I tried to resubmit the form and it's not submitting. 

Michael_Sogunro
New Participant
January 7, 2020

It does exist. See the screenshot. 

I changed the code back to "marketo-xdframe" and then cleared my cache and it's working now. 

Thanks for the write up. If I had cleared my cache I would have resolved this yesterday. 

SanfordWhiteman
New Participant
January 7, 2020

Path in your code is

https://page.uschamber.com/rs/432-UWH-935/images/market-xdframe-relative.html 

That page doesn't exist on your Marketo instance, so it's redirected to your main site (fallback page).

Michael_Sogunro
New Participant
January 7, 2020

Ugh. I followed the directions and still cannot get the form to submit. 

I clicked the link for the file and right clicked on the pop-up warning me that I am being directed to another site. I "saved link as" the file in the pop-up and uploaded it to my design studio. 

I then replaced the url in the form embed code with:

/rs/432-UWH-935/images/marketo-xdframe-relative.html

Below is the complete, updated embed code.

<script src="//page.uschamber.com/js/forms2/js/forms2.min.js"></script>
<form id="mktoForm_2155"></form>
<script>
MktoForms2.setOptions({
formXDPath : "/rs/432-UWH-935/images/marketo-xdframe-relative.html"
});
MktoForms2.loadForm("//page.uschamber.com", "462-UWH-935", 2155);
</script>

Before adding the bit below the forms appear and submit in all browsers except in a FireFox Incognito window. 

MktoForms2.setOptions({
formXDPath : "/rs/432-UWH-935/images/marketo-xdframe-relative.html"
});

After adding the bit above the form appears, but does not submit on any browsers. 

Here is where I am testing. 

iFrame Test | U.S. Chamber of Commerce 

Any help would be greatly appreciated. 

New Participant
January 6, 2020

Thank you, @Sanford Whiteman‌. Great advice and instructions as usual

Merrisa_Brown
New Participant
January 3, 2020

Thanks for this, @Sanford Whiteman‌. Your directions were easy to follow and we were able to implement this on our site! 

SanfordWhiteman
New Participant
January 3, 2020

It's fine to use and Marketo is aware of it (I have publishing privileges on the blog b/c of solutions like this).

Wouldn't worry any more about it spontaneously breaking than anything else -- for years upon years the forms lib has worked the same way. There are people (I don't advise this, but it's been done) who even self-host the core JS.

Of course it would be far better if built-in, but there are lots of semi-demi-official client-side hacks that are safe to use (and are used on Fortune 100 sites, fwiw). The key is to stay in the know.