Capturing Search Engine and PPC info on Landing Pages

Please ensure that you have access to an experienced JavaScript developer.
Marketo Technical Support is not set up to assist with troubleshooting JavaScript.

Here's our recommendation for how you can collect keyword, search engine, and PPC info in Marketo.  It takes a bit of work, and you'll definitely need to know your Javascript.

1. Create custom fields

You'll need to create some new fields to store the additional data.

If you want these fields to be visible in Salesforce, create them on both Lead and Contact records.

All of these should be of type String:

  • Search String -- to store the query that drove the lead to your web page

  • Search Engine -- the search engine or URL which provided the lead your web page

  • Pay Per Click Keyword -- if the link was a PPC (ex. AdWords), the PPC keyword for that link

2. Add the fields to your forms

Go to the Design Studio and edit any forms where you want to capture this information.  Add the fields you created as hidden fields set to a default value (as opposed to set from a cookie or URL parameter). You'll probably want to leave the default value as blank -- that is, the lead did not come from a PPC -- but feel free to put in another value if appropriate (Making a Field Hidden on a Form)

This solution will not update the Lead Source for leads who come to your site via PPC.  If you want the lead source updated for PPC leads, you'll need to do that via a Smart Campaign or by adding it as a hidden field to your forms.

3. Put Javascript on your landing pages

You MUST edit the Javascript below or it will not work!The code below sets cookies with the search engine, search term, and PPC info as long as it came from a domain outside your website.

The script then populates the form fields using the cookie values. The reason for using cookies is because your leads may not fill out your form when they first hit your landing page; they may click your AdWords ad, browse around, and then go to your form.  Cookies retain those values for when they're needed -- when the leads complete your form.Using cookies also lets you capture this info on non-Marketo pages too.  See step 4 if you're interested in that.If you want this on a single landing page, add it as a Custom HTML block.  If you want this on several or all your landing pages, add it to your Landing Page Template.You'll need to change the following variables/strings, highlighted in the Javascript below:

VariableDescription
excludedReferrersAll domains where you don't want to check referrers as in "company.com" -- typically these are your own website domains. If you need to exclude multiple domains, separate them with commas.
cookieDomainThe base domain of your landing pages without any subdomians (like "www." or "pages.").  This will be used to store cookie values.  If your landing pages are on "pages.yourcompany.com" then this should be "yourcompany.com".
payPerClickParameterThe URL Parameter with the keyword depending on how you set up your your pay per click URLs. Typically "keyword" or "kw".
searchStringField
searchEngineField
payPerClickKeywordField
IDs of the hidden form fields where the cookie values should be inserted. Find them by following the instructions in this article:
Setting or Getting a Form Field Value via Javascript on a Landing Page

<script src="/js/public/jquery-latest.min.js" type="text/javascript"></script>

<script src="/js/public/jquery.cookie.js" type="text/javascript"></script>

<script src="/js/public/jQueryString-2.0.2-Min.js" type="text/javascript"></script><script type="text/javascript">

var $jQ = jQuery.noConflict();$jQ(document).ready(function(){   //

   //--- CHANGE THESE!!! ---

   //    // Change this to match domains of referrers you want to ignore.

    // You'll want to ignore referrers from your own domains.

    // Use only the base domain name without subdomains (ex. "company.com")

    // Separate multiple domains with commas (leave the brackets).

  var excludedReferrers = [ "yourcompany.com", "yourcompany2.com" ];    // Change this to match the base domain of your company's landing pages.

    // Cookies will be created with this domain.

    // Ex. If your landing page domain is "pages.yourcompany.com" then use

    //     "yourcompany.com"

  var cookieDomain = "yourcompany.com";    // The URL parameter that has your pay-per-click info.

    // Typically "kw" or "keyword" (depends on how you set up your PPC URLs)

  var payPerClickParameter = "keyword";    // IDs for the fields to be updated.

  var searchStringField = "#Search_String__c";

  var searchEngineField = "#Search_Engine__c";

  var payPerClickKeywordField = "#Pay_Per_Click_Keyword__c";   //

   //-- you probably shouldn't change anything after this --

   //  var refer = document.referrer;

  var searchString;

  var searchEngine;      // if there's no referrer, do nothing

  if ( (refer == undefined) || (refer == "") ) { ; }

  else {

     // get the domain of the referring website -- http://[[this-thing.com]]/

    var referrerDomain =

      refer.substr(refer.indexOf("\/\/") + 2,

        refer.indexOf("\/",8) - refer.indexOf("\/\/") - 2).toLowerCase();    var excludedDomainFound = false;

    var i = 0;      // search the excluded domain list to see if the referrer domain is on it

    while ( (i < excludedReferrers.length) && !excludedDomainFound) {

      var thisExcludedDomain = excludedReferrers[i].toLowerCase();        // weird semantics here -- indexOf returns "-1" if the search string isnt found.

        // thus excludedDomainFound is true only when indexOf matches an excluded domain (!= -1)

      excludedDomainFound = (referrerDomain.indexOf(thisExcludedDomain) != -1);

      i++;

    }     // only if the referrer isn't in our excluded domain list...

    if( !excludedDomainFound ) {

        // extract the URL parameters from common search engines

        // To add your own, each engine needs:

        //  name: how the search engine will appear on your Marketo leads

        //  url: REGEX for matching the engine's referrer.  ex.  /\.google\./i

        //  query: URL parameter that contains the search query - usually "p" or "q"      var searchEngines = [

       { name: "Yahoo", url: /\.yahoo\.co/i, query: "p" },

       { name: "Google", url: /\.google\./i, query: "q" },

       { name: "Microsoft Live", url: /\.live\.com/i, query: "q" },

       { name: "MSN Search", url: /search\.msn\./i, query: "q" },

       { name: "AOL", url: /\.aol\./i, query: "query" },

       { name: "Bing", url: /\.bing\.com/i, query: "q" },

       { name: "Ask", url: /\.ask\.com/i, query: "q" }

      ];        // find the referring search engine (if any)

      i = 0;

      while (i < searchEngines.length) {

        if (refer.match(searchEngines[i].url)) {

          searchEngine = searchEngines[i].name;

          searchString = $jQ.getQueryString({ ID: searchEngines[i].query,

            URL: refer, DefaultValue: "" });

          break;

        }

        i++;

      }

         // If no search engine is found, this person probably used a less

         // popular one.  Use the referring doman, then guess the query parameter

      if (i == searchEngines.length) {         searchEngine = referrerDomain;         var queries = ["q","p","query"];

         var i = 0;

         while ((i < queries.length) && (searchString == undefined)) {

           searchString = $jQ.getQueryString({ ID: queries[i], URL: refer });

           i++;

         }           // no search strings found -- use this text instead.

         if (searchString == undefined) {

           searchString = "None";

         }

      }         // Use the provided URL parameter to get the PPC keyword.

      var payPerClickWord = $jQ.getQueryString({ID: payPerClickParameter,

        URL: refer, DefaultValue: "" });         // Put the info into cookies.  These values will be extracted

         // and put into a Marketo form later.  Expires in 2 years.

      $jQ.cookie('mktoPPCKeyword', payPerClickWord,

         {expires: 730, path: '\/', domain: cookieDomain});

      $jQ.cookie('mktoSearchEngine', searchEngine,

         {expires: 730, path: '\/', domain: cookieDomain});

      $jQ.cookie('mktoSearchString', searchString,

         {expires: 730, path: '\/', domain: cookieDomain});

    }

  }

    // Get the values from the cookies and put them into the hidden fields

  $jQ(searchStringField).attr("value",$jQ.cookie('mktoSearchString'));

  $jQ(searchEngineField).attr("value",$jQ.cookie('mktoSearchEngine'));

  $jQ(payPerClickKeywordField).attr("value",$jQ.cookie('mktoPPCKeyword'));});</script>

4. Add cookie code on your website (Optional)

To close the loop on capturing the keyword, search engine, and PPC, you need to add Javascript to your website similar to that above.  This code will store that informaiton in cookies, then those cookies will be read when the user submits the form (with the javascript above on your landing pages).This Javascript uses the jQuery, jQuery Cookies plugin, and jQueryString plugin scripts.  Deploy them on your site and note the URL where they're hosted.You'll also need to edit all of your web pages, similar to when you installed Munchkin tracking.  You can put the Javascript in the same spot of the webpage.In the code below, change the

  • Javascript src URLs to match where you installed jQuery and the plugins

  • excludedReferrers variable as you did in the Javascript above

  • cookieDomain variable to be "yourcompany.com" as you did above

  • payPerClickParamater variable as you did above

<script src="/js/jquery-latest.min.js" type="text/javascript"></script>
<script src="/js/jquery.cookie.js" type="text/javascript"></script>
<script src="/js/jQueryString-2.0.2-Min.js" type="text/javascript"></script>
<script type="text/javascript">
var $jQ = jQuery.noConflict();

$jQ(document).ready(function(){

   //

CHANGE THESE

Change this to match domains of referrers you want to ignore.
You'll want to ignore referrers from your own domains.
Use only the base domain name without subdomains (ex. "company.com")
Separate multiple domains with commas (leave the brackets).


  var excludedReferrers = [ "yourcompany.com", "yourcompany2.com" ];

    // Change this to match the base domain of your company's landing pages.
    // Cookies will be created with this domain.
    // Ex. If your landing page domain is "pages.yourcompany.com" then use
    //     "yourcompany.com"
  var cookieDomain = "yourcompany.com";

    // The URL parameter that has your pay-per-click info.
    // Typically "kw" or "keyword" (depends on how you set up your PPC URLs)
  var payPerClickParameter = "keyword";

   //

You probably shouldn't change anything after this
   //

  var refer = document.referrer;
  var searchString;
  var searchEngine;

      // if there's no referrer, do nothing
  if ( (refer == undefined) || (refer == "") ) {
      ;
  } else {

       // get the domain of the referring website -- http://[[this-thing.com]]/
    var referrerDomain =
        refer.substr(refer.indexOf("\/\/") + 2,
          refer.indexOf("\/",8) - refer.indexOf("\/\/") - 2).toLowerCase();

    var excludedDomainFound = false;
    var i = 0;

      // search the excluded domain list to see if the referrer domain is on it
    while ( (i < excludedReferrers.length) && !excludedDomainFound) {
      var thisExcludedDomain = excludedReferrers[i].toLowerCase();

         // weird semantics here -- indexOf returns "-1" if the search string isnt found.
         // thus excludedDomainFound is true only when indexOf matches an excluded domain (!= -1)
      excludedDomainFound = (referrerDomain.indexOf(thisExcludedDomain) != -1);
      i++;
    }

     // only if the referrer isn't in our excluded domain list...
    if( !excludedDomainFound ) {

       // extract the URL parameters from common search engines
       // To add your own, each engine needs a:
       //  name: how the search engine will appear on your Marketo leads
       //  url: REGEX for matching the engine's referrer.  ex.  /\.google\./i
       //  query: URL parameter that contains the search query - usually "p" or "q"

      var searchEngines = [
       { name: "Yahoo", url: /\.yahoo\.co/i, query: "p" },
       { name: "Google", url: /\.google\./i, query: "q" },
       { name: "Microsoft Live", url: /\.live\.com/i, query: "q" },
       { name: "MSN Search", url: /search\.msn\./i, query: "q" },
       { name: "AOL", url: /\.aol\./i, query: "query" },
       { name: "Bing", url: /\.bing\.com/i, query: "q" },
       { name: "Ask", url: /\.ask\.com/i, query: "q" }
      ];

        // find the referring search engine (if any)
      i = 0;
      while (i < searchEngines.length) {
        if (refer.match(searchEngines[i].url)) {
          searchEngine = searchEngines[i].name;
          searchString = $jQ.getQueryString({ ID: searchEngines[i].query,
            URL: refer, DefaultValue: "" });
          break;
        }
        i++;
      }

        // If no search engine is found, this person probably used a less
        // popular one.  Use the referring doman, then guess the query parameter
      if (i == searchEngines.length) {

         searchEngine = referrerDomain;

         var queries = ["q","p","query"];
         var i = 0;
         while ((i < queries.length) && (searchString == undefined)) {
           searchString = $jQ.getQueryString({ ID: queries[i], URL: refer });
           i++;
         }

          // no search strings found -- use this text instead.
         if (searchString == undefined) {
           searchString = "None";
         }
      }

        // Use the provided URL parameter to get the PPC keyword.
      var payPerClickWord =
        $jQ.getQueryString({ID: payPerClickParameter,
           URL: refer, DefaultValue: "" });

         // Put the info into cookies.  These values will be extracted
         // and put into a Marketo form later. Expires in 2 years.
      $jQ.cookie('mktoPPCKeyword', payPerClickWord,
         {expires: 730, path: '\/', domain: cookieDomain});
      $jQ.cookie('mktoSearchEngine', searchEngine,
         {expires: 730, path: '\/', domain: cookieDomain});
      $jQ.cookie('mktoSearchString', searchString,
         {expires: 730, path: '\/', domain: cookieDomain});
    }
  }
});

</script>