Skip navigation
All Places > Champion Program > Blog > Authors Robb Barrett

Champion Program

9 Posts authored by: Robb Barrett Advocate

Looking to have field(s) + submit button all on one horizontal row?

Screen Shot 2018-01-23 at 11.00.17 AM.png

 

I was recently asked to help restyle a Marketo form to make it a single row, meaning just an email address and a submit button.  This isn't something available out of the box in Marketo and when I searched the community I couldn't find ready made code so I thought I'd share.

 

This can be done in the landing page editor, but it requires you to code in the form instead of placing it with the form object.

 

To start, grab an HTML object and place it on the page.

 

Screen Shot 2018-01-23 at 10.46.00 AM.png

 

Next, click on the gears and select Edit to open the HTML editor:

 

Screen Shot 2018-01-23 at 10.47.11 AM.png

Now, go to the form you want to use and select Form Actions > Embed Form

 

Screen Shot 2018-01-23 at 10.48.26 AM.png

 

This will open up a box with some code for you to copy and paste:

embed.png

 

Go back to your LP editor and paste that into the HTML dialog box.

 

Next, you'll need to add in some CSS and HTML.

 

Here's the HTML:

 

<div id="container">

     <div id="form-pane">

          <form id="mktoForm_24496"></form> CUT AND PASTE THIS LINE FROM THE CODE YOU JUST PASTED IN THE PRIOR STEP

     </div>

     <div id="submit">

         <p> Register Me!</p>

     </div>

</div>

 

Next, you'll need to add in some CSS above the HTML to do the magic.  Put this under the two script tags

 

<style>

.mktoButton { 

display: none;

}

#container {

display: flex;

width: 100%;

}

#form-pane {

width: 325px;

}

#submit {

flew-grow: 1;

background-color:Blue;

color: #fff;

height: 30px;

width: 150px;

text-align: center;

cursor: pointer;

}

</style>

 

The first style hides the native button. Then we create a container that can hold the form the form and your new submit button.  The form-pane needs to be the width of your field + label + space, so add up the the two widths and then factor in a little extra for breathing room, maybe 25px. The Submit code has a background color set for illustration purposes but in reality it doesn't need to if, for example, you want to use an image instead of text. Adjust the width and height as needed to get it perfect.

 

Finally, you'll need to add in code that will use the submit section to submit the form.  Here's that code, add it under the HTML:

 

<script>

var btn = document.getElementById("submit");

btn.onclick = function() {

    // When the button is clicked, get the form object and submit it

    MktoForms2.whenReady(function (form) {

        form.submit();

    });

};

</script>

 

And then you just need to approve and save your page and it's ready to go!

 

Screen Shot 2018-01-23 at 11.00.17 AM.png

 

In this example, clicking the button when the email address is empty will still invoke the validation rules

 

Go forth and be more creative than my example! Show me examples of your use of it in the comments and Like this post if you find it helpful.

Hi All -

 

Many of you saw my Summit 2017 presentation on Dark Side of the Forms.  If you haven't, it's available here:

https://events.marketo.com/summit/2018/2017-recordings/learn-the-dark-side-of-the-forms-seduce-your-customers-to-provide-their-personal-secrets

 

I was recently asked by a colleague to write up the section I did on how to fire events from YouTube videos, so since I had already written it up I thought I'd share it here on a blog post in case anyone else is interested. This is the very basic version of that presentation, there are a lot of other items on the sample I provided that I'm not including here but will in the future.

 

Please Note: this requires some knowledge of JavaScript. I can't help you write out everything you need, but if you ask and I have some code, I'm happy to help you.

Also Note: I trimmed a lot of extra script out of here. If you find that something isn't working, please reply and I'll update it when I can

 

How this works (Customer Facing):

You go to a landing page with a video that automatically starts playing.

Screen Shot 2017-10-25 at 12.24.26 PM.png

 

If you pause the video:

1. If you are anonymous or don't have complete info, a form pops up

Screen Shot 2017-10-25 at 12.24.35 PM.png

 

2. If you fill out the form the form disappear and the video resumes playing.

 

Now, what REALLY happens:

As soon as you hit the page, a hidden background form submission occurs.

  1. A hidden form is submitted in the background
  2. A workflow is triggered from the form fill (even if anonymous) to:
    1. Make you a member of the program
    2. Record the campaign ID to your record
    3. Add to the lead note that you've watched the video
  3. OPTIONAL: Time spent watching can be recorded

 

How it works:

I won't go into all of the HTML necessary to build out the page, but you start with a basic 3 row page with the middle section having two columns.  The left column shown above is sized to fit the form in it. There are some tokens needed for this program. The screen shot is not complete but shows the main ones:

 

Screen Shot 2017-10-25 at 11.55.30 AM.png

 

For the {{my.youtube-video-id}} token, you can get it from the URL in the "v=" parameter:

 

Screen Shot 2017-10-25 at 3.41.18 PM.png

 

What else you'll need:

  • A completely blank form. Absolutely no fields on it.: {{my.hidden-submit-form}} Add in a token with the form ID
  • A form with all of the information you'll want someone to fill out: {{my.update-info-form}}. Add in a token with the form ID

 

  • the Form IDs, which can be found in the URL for the form. I always include the form ID in the name of the form for precision selection:
    • Screen Shot 2017-10-25 at 12.42.35 PM.png
      • Create tokens using JUST the form ID number. I store these tokens in a folder and put all my programs under it. You'll code in <form id="mktoForm_{{my.update-info-form}}"></form>, which will make this template usable with any number of different forms for different programs.
        Screen Shot 2017-10-25 at 2.48.44 PM.png
        Also worth noting, I keep my Munchkin code as a token, and you'll see that below as {{my.Munchkin-Code}}. This makes it easier when developing on a DEV / UAT server and then migrating to PROD.

  • A workflow to handle the form fills. I always store my forms in the design studio and use one form for multiple programs, so you'll also need to add in the referrer page name. I like to do "contains" and then just put in the page name from the URL builder. Notice that I have several forms in here: you'll want the Hidden form and the Update Info form (I have others in there that are relics and should be cleaned out eventually). Don't worry too much about steps 2 and 3, we'll get into those later.
    • Screen Shot 2017-10-25 at 11.59.59 AM.png
    • Screen Shot 2017-10-25 at 12.00.10 PM.png



Now, for the code.  I'm not going to go into all of the HTML necessary but here are a few important pieces:
1. Initial Code:

     <meta name="viewport" content="width=device-width, initial-scale=1.0"> // Make this mobile friendly

     <meta http-equiv="X-UA-Compatible" content="IE=edge" />    // Make this IE friendly

     <link rel="shortcut icon" href="http://yourcompanywebsite/favicon.png" type="image/x-icon" /> 

     <title>COMPANY NAME | PRODUCT LINE | {{my.Asset-type}}</title>

     <meta charset="utf-8">

     <meta name="author" content="{{my.Metadata-Author}}">  // Optional, but best practice

     <meta name="keywords" content="{{my.Metadata-Keywords}}"> // Optional, but best practice

     <meta name="description" content="{{my.Metadata-Description}}">  // Optional, but best practice

     <link rel="stylesheet" type="text/css" media="all" href="/css/mktLPSupportCompat.css"> //Just because

 

Next, call the scripts under the head: (tokens highlighted in bold)

     <script src="//app-<your pod ID>.marketo.com/js/forms2/js/forms2.min.js"></script>
     <script type="text/html" id="form-html"><form id="mktoForm_{{my.update-info-form}}"></form></script>
     <script type="text/javascript"  src="https://app.marketo.com/js/public/jquery-latest.min.js"></script>

 

2. CSS is attached to this post. I removed URLs for images used.

 

3. This is the basic HTML structure for this template

 

<div id="column"> //Centers the DIVs in the middle
   <div id="middle"> //I've excluded the top and bottom but this is a basic three row design page
              <div id="rectangle"> // The rectangle is a DIV in the #middle that conforms to the #column and has a different colored background. It's made up of #body-left and #body-right
                      <div class="box" id="body-left"> // Holds the text describing the video, including speaker pics and bios. It's all token driven.
                           <div id="asset-type"><h3>{{my.Asset-type}}</h3></div> //Not necessary, but I have it on my page
                           <div id="headline"><h1>{{my.Body-headline}}</h1></div>
                           <div id="left-side-copy">{{my.Body-copy}}</div> // Rich Text token so a marketer can be fancy without needing to alter the template
                  </div><!--left-side-container-->

                  <div id="body-right" class="box"> // Holds the text video
                        <div id="preform-div" style="z-index: 100;">
                              <div id="player"></div> //This is where the video will play
                              </div> //Closes Preform DIV
                        <div id="form-div" class="form"></div> //We won't really use these two DIVs, but it doesn't hurt to keep them in
                        <div id="postform-div"></div>
                  </div><!---Body-Right Close-->
        </div><!--Rectangle-->
      </div><!--Middle Div-->
      </div><!--Column-->
     <div class="clear"></div> // Keeps everything looking nice
     <div class="mktoContent"></div>  //Because Marketo insists!

<!--This is the main form wrapper and form. It's not going to appear initially it's going to be invisible and will overlay everything else when visible -->
     <div id="mainFormWrapper" class="vertical-center">
          <div id="formContainer" class="vertical-center">
               <div style="cursor: pointer;" id="formClose">CLOSE</div>  //Not getting into this at this point, there's more for later
               <div id="formHeader"><h1>{{my.Modal Header}}</h1>  //This is text that you put in a token to appear at the top to the modal
                     <p>
                             {{my.Modal Text}}       //This is just test you want to appear above the form
                     </p>
                </div>
                <div id="spacer"></div> //Puts in some space, create your own CSS value for how much
                 <div id="verifyInfo" style="z-index: 40; padding: 20px;"> //Cutting out a lot on this part for later, but keep this in
                     <p>
                           If you'd like to be contacted by a Representative, please confirm your information below:
                     </p><br />
                    <form id="mktoForm_{{my.hidden-submit-form}}" style="display: none;"></form>
                 </div> <!--Verify Info -->
                <div id="mainFormDiv"></div>
               <div id="mainFormDivBottomSpace"></div>
     </div> //form Container

 

4. This script:

   <script type="text/javascript">
          $ja = jQuery.noConflict();
           var showAlert = 1; //Make sure the pop-up only shows once
           var showModalAgain = 1 //Turns the modal on
           var emailAddress = '{{lead.Email Address}}';
           var firstName = '{{lead.First Name}}';
           var state = '{{lead.State}}';
           var formSubmitted = 0;
           var addedToProgram = 0;
           document.getElementById("mainFormDiv").innerHTML = document.getElementById("form-html").innerHTML;

//This function shows the form, in a box, when called -->
          function showModal() {
                 if (showModalAgain != 0) {
                      document.getElementById("mainFormWrapper").style.display = 'block';
                      document.getElementById("mainFormWrapper").style.zIndex = '30';
                      document.getElementById("mainFormDiv").style.zIndex = '40';
                      showUpdateForm();
                      $ja("#verifyInfo").fadeOut();
                      $ja('#verifyInfo').replaceWith( '<div id="left-side-copy" style="padding-left: 20px;"><p>If you would like to learn more, please fill out the form below.</p></div>' );
                      $ja("#verifyInfo").fadeIn("slow");
                      $ja("#verifyInfo").append($ja("#mainFormDiv"));
                       document.getElementById("mainFormDiv").style.display = 'block';
                  }
            }
//This is the YouTube API -->
     var tag = document.createElement('script');
     tag.src = "https://www.youtube.com/iframe_api";
     var firstScriptTag = document.getElementsByTagName('script')[0];
     firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
     var player;

//Adjust the width and height as needed -->
     function onYouTubeIframeAPIReady() {
            player = new YT.Player('player', {
                 videoId: '{{my.youtube-video-id}}',
                 height: '390',
                 width: '640',
                 events: {
                     'onReady': onPlayerReady,
                     'onStateChange': onPlayerStateChange
                  }
            });
         }
//The API will call this function when the video player is ready. This starts playing the video. -->
     function onPlayerReady(event) {
       event.target.playVideo();
     }
//These are the recognized events / states -->
/** YouTube API
        -1 (unstarted)
        0 (ended)
        1 (playing)
        2 (paused)
        3 (buffering)
        5 (video cued)
**/
//Part 1: Immediately run a hidden form submit when the video is playing to trigger a workflow to add the person to the program -->
     function onPlayerStateChange(event) {
            if ((event.data === 1) && (addedToProgram === 0)) {  //event.data === 1 means the video has started playing
             addedToProgram = 1;  //this prevents this script from continuously running at starts and stops
         MktoForms2.loadForm("//app-XXX.marketo.com", "{{my.Munchkin-Code}}", {{my.hidden-submit-form}},
        function(form) {
               var myForm = MktoForms2.getForm({{my.hidden-submit-form}});
               myForm.addHiddenFields({ // Since the form you're using is absolutely blank, you'll need to add in any fields you want to post to it and any values. 
                                                            //If you have custom dedupe fields, make sure you add them as well
                     "Email":"{{lead.Email Address}}",
                     "formProgramID":"{{program.name}}", //whichever field you use for Campaign IDs
          }); //Since we're not asking any questions, just the email address and Campaign ID are enough to update the record, but you do you.
        form.onSuccess(function(values, followUpUrl) {
             // Stop the form from refreshing the page
             return false;
         });
     myForm.submit();
          }
         );
     }
//At this point, you have an event that can trigger a workflow to add the person to the program. Information about a trigger campaign is mentioned above. --> 


//Now we're going to pop up a REAL form is they hit Pause-->
  if ((event.data === 2) && (showModalAgain != 0)) {  //event.data === 2 means Paused
    showModal();
  }
}
//The showModal function above calls a script which calls this script -->
     function showUpdateForm() {
         MktoForms2.loadForm("//app-XXXX.marketo.com", "{{my.Munchkin-Code}}", {{my.update-info-form}},

      function(form) {  //First, prefill the form. I manually prefill embedded forms as it doesn't work if it's just enabled on the form. Make sure you add in any custom fields you use.
      form.vals({
                 "FirstName":"{{lead.First Name}}",
                 "LastName":"{{lead.Last Name}}",
                 "Company":"{{company.Company Name}}",
                 "Email":"{{lead.Email Address}}",
                 "State":"{{lead.State}}",
                 "Title":"{{lead.Job Title}}",
                 "formProgramID":"{{program.name}}",     //Same as Campaign ID in my world
                 "City":"{{lead.City}}",
                 "Address":"{{lead.Address}}",
                 "phone":"{{lead.Phone}}",
                 "PostalCode":"{{lead.Postal Code}}"
                });

           var formEl = form.getFormElem()[0];

      form.onSuccess(function() {  //After the form is submitted, hide the form and resume playing the video
            form.getFormElem().hide();
             $ja("#mainFormWrapper").fadeOut("slow");
             document.getElementById("mainFormWrapper").style.zIndex='0'; //bury the form wrapper under everything else
            $ja("#left-side-copy").fadeOut();
             $ja("#left-side-copy").fadeIn("slow");
             document.getElementById("left-side-copy").innerHTML = '<p>Thank you for your interest.</p>';
             player.playVideo(); // This restarts the video
            showModalAgain = 0;  //Don't show again if the video is paused
             return false;
             formSubmitted = 1;
           }); //Close onSuccess
         }); //Close loadForm
     }  //close showUpdateForm function
</script>

 

 

 

 

 

 

-------EXPLANATION OF THE TOKENS ON THE MODAL-------

 

MODAL EXPLANATION.jpg

This is something that I don't know everyone realizes can be done; when I mentioned it at my Summit speech I heard a few gasps from the audience. For some of you, this is nothing new but for those who didn't already know, allow me to show you how to quickly and easily bulk approve landing pages.

 

So, let's say you've made some changes to one of your more popular LP templates and now you have hundreds of landing pages in Draft mode. If you don't know how to bulk approve, this is a serious pain in the tuchas.  Right? Wrong.

 

So mosey on over to the Design Studio and go ahead and click on Landing Pages.  From there, you'll want to sort by Approved - Sort Descending.

 

 

Screen Shot 2017-05-08 at 9.38.59 AM.png

 

All those yellow caution triangles mean you have unapproved pages. Click on the top item, then hold shift and click on the last one on the page.

 

Screen Shot 2017-05-08 at 9.38.07 AM.png

 

Now, click on Landing Page Actions and select Approve Draft

 

Screen Shot 2017-05-08 at 9.38.18 AM.png

 

Let Marketo do it's thing for a moment or two

 

Screen Shot 2017-05-08 at 9.38.29 AM.png

 

And BOOM.  They're all approved.  Now, repeat until all of your pages are approved.  I just saved you a lot of time!

 

This works for Emails too.  Just follow the same steps.

 

Hope this helps. If you like this trick - or any other I've presented - please make a donation to the Mental Health or Animal Rescue charity of your choice.

 

Laters!

Hi All - I wanted to share something I've developed in conjunction with one of our paid inbound vendors.

 

The Problem: GE Healthcare works with an ad agency who places our digital ads. We use Google Analytics tracking which we found had a tendency to differ from Marketo reports and last year we spent a great about of time trying to tie out reports.

 

Requirements: We needed to produce end-to-end reporting to show how many people visited the site, filled out a form and then went through our sales funnel all the way to the Opportunity stage. Leadership wanted to see how much was created in Opportunities and wanted all reporting in one package. We also needed a way to track multiple UTM code responses and store as history in a way we could see what happened historically and this all needed to be done in Marketo. We also wanted the ability to pass this ID to the cloud in Google Tag Manager so it could be added to Google Analytics reports

 

Constraint: Because the vendor is a third party, and international at that, sharing personal information needs to be restricted. We wanted a way that would allow us to send them information WITHOUT sending over any personal tracked info, like name, email, etc but to be able to tie it out internally if needed.

 

Solution:

 

What we came up with is a pretty simple, easy to deploy method that creates a unique identifier for a person that's not tied to any other system. Our first thought was to use Lead ID, but that's not generated quickly enough to tie to a form fill event that could be passed to GA to show a conversion. Also, we questioned whether we should be sending over any system IDs that could somehow be used maliciously.  Also, since there's no way to create n:1 tables in Marketo for historical tracking, like UTM history, we decided to create a process.

 

For UTMs:

We created a field in Marketo that aligns to each of the UTM parameters: utm_campaign, utm_content, utm_source, utm_term, utm_medium. I also created a field called utm_history.

 

Then I created a smart campaign that listens to any form fill where utm_campaign is not empty. In the Flow, utm_history has the following Change Data Value:

 

DateTime: {{system.datetime}} | Tracking ID: {{lead.flex field 1}} |  Campaign = {{lead.utm_campaign}}  |  Source = {{lead.utm_source}}  |  Medium = {{lead.utm_medium}} | Term = {{lead.utm_term}}  |  Content = {{lead.utm_content}}---- {{lead.utm_history}}

 

For the Tracking ID:

 

This was something we tried a few different times before agreeing on something we both liked.

 

On our webpage where we want this tracking method used, I put the following code in the header:

 

  <script>

  var leadId = Math.random().toString(36).substr(2, 5);

  document.cookie="_trkRndId="+leadId;

    dataLayer = [{

   'trackedId': leadId,

   'pageName': '<page name>'

}];

  </script>  

 

Here's what's hapening:

  var leadId = Math.random().toString(36).substr(2, 5); <!-- This creates a random 5 digit alpha-numeric string

  document.cookie="_trkRndId="+leadId; <!-- This writes a cookie called _trkRndId (track random ID) and stores the 5 digit alphanumeric created above

 

//This writes the data to the Data Layer is Google Tag Manager.  Please read up on it for an explanation.

    dataLayer = [{

   'trackedId': leadId,

   'pageName': '<page name>'

}];

 

Now, on the form on the page, I have the UTM fields hidden (prefilled disabled) with the values pulled from their appropriate URL parameters, and I use something called Flex Field 1 as a hidden field field with its value pulled from the cookie, _trkRndId:

 

Screen Shot 2017-04-21 at 11.04.38 AM.png

 

I use fields called Flex Fields as temporary, all purpose fields. When I want to set something on a temporary basis that's stored in a notes field, I use one of my 5 flex fields.

 

Finalizing

 

Now, my UTM history field has a continuous, chronological summary of interactions with UTM encoded links along with a unique identifier to the person for each form fill. I could decide to make the cookie more persistent, but since there's no guarantee that the end user will be on the same device each time they interact, there's no guaranteed value to having the random user ID always be the same.

 

I can now build out a smart list with utm_history + opportunity value and status fields and send that to my international third party without worrying about personal identifying tracking information being shared. I also know that the value in that field would be pretty difficult to use maliciously since it's never exposed in the code on the page and it doesn't link back to an ID field in any system.

 

Now, because Sanford might read this....

 

Yes, there is a small probability that the 5 character code could be repeated. Given the amount of interactions I'm expecting, I'll take this risk.  Yes, the way I store the utm_history field could be better formatted, but we currently have no other uses for it. Yes, some super-sophisticated Russian spy hacker 14 year old probably can expose a bug in this system. Can't win 'em all.

 

In the end, this gives me and my agency something we're comfortable sharing and reporting. Our agency can use the UTM data to identify exactly which ad is helping us generate the most revenue and then make adjustments to the spend on the fly.

I always tell people who are new to Marketo - or Marketing automation in general - you don't make mistakes with Marketo (or any other tool.) You make 60,000 mistakes, simultaneously. Yes, while we've all experienced the embarrassment of a typo or forwarding an email to a friend and forgetting there was something at the bottom of the thread they weren't meant to see, Marketo allows us to have these failures professionally in front of tens, if not hundreds of thousands of people.

 

Fear not, you're not alone. A quick scan through my Gmail at any given moment could probably snag two or three, from my gym inviting me to host my daughter's June birthday party there to a wrong price being put on a sales flier. By the way, I don't have a daughter - two sons - neither of whom have a June birthday (that was a real example.)

 

With that, I give you the ten "Oops" moments you'll have at some point or another and how you can recover from them professionally.

 

Fail early, fail often and fail forward

Look, the single most important piece of advice I can give you is this: own it, accept it, learn from it, move forward. At the 2016 Marketo summit, Will Smith said to "Fail Forward." Learn from your mistake, don't do it again, and prove that it was a valuable lesson.

 

There's a famous story about the CEO of IBM in the late 50's through early 70's. His name was Thomas Watson. He had a young exec who made some mistakes that cost the company millions - and back then, millions were like tens of millions today. So anyway, this young man shows up into Mr. Watson's office, head down, expecting to be fired and says "I suppose you're firing me."  Mr. Watson responds "Not at all, young man, we just spent a couple of million dollars educating you." (Source: Edgar Stein, Organizational Culture and Leadership)

 

We all make mistakes, we'll all continue to make mistakes. The important thing is that you don't blame anyone, don't state that someone handed you something wrong or insinuate in any way that this is someone else's fault. You're responsible, take responsibility. Own the error, even if you don't think it's on you.

 

#1 - At some point, you will send an email to your entire database.

No, you didn't mean for that email to go to your entire database. It was meant to go to MAYBE 1,000 people and your database has over 1 million records. Here are the most common reasons as to why you'll do this:

You used an OR condition (or selected "Any") when you didn't mean to.

As a parent, something I've learned is how difficult the concept of "OR" is to learn. Ask a kid "Do you want candy or video games" and they'll say "Yes" and then throw a fit when they don't get both. In database terms, OR can be one of the single most destructive forces on earth. You can craft a beautifully eloquent and complex statement and kill it by using an OR outside of parentheses.

 

You used a negative clause when you really needed to be more specific.

When you say "Show me everyone who doesn't own this product" you could very well end up with the majority of your database. What you probably meant was "Show me everyone who has expressed an interest in this product but doesn't own it."  When you build a smart campaign using a negative filter, BEWARE!!!

 

This happy little smart list will cause you to email almost your entire database. It doesn't filter it by people who RECEIVED it and didn't open it, just people who didn't open it. That is to say, almost everyone.

not opened email.PNG

 

You thought that there was already filtering expected

This can happen for a few reasons:

  • You didn't realize that smart lists and campaigns in a program aren't limited to people in the program

  • You didn't realize that smart lists and campaigns in a workspace aren't limited to people in that workspace

This simply isn't the case. You have to be VERY EXPLICIT in defining the exact rules you want used. You can't overstate it enough. If you're worried about being redundant, don't. Go ahead and use the filters in a smart list the SC references AND the SC itself. You won't hurt anything.

 

You referenced a Smart List that wasn't well formed.

Never trust a smart list you didn't build. Check it, check the number of leads it pulls, check all the lists it references. You might find that some crazy person created a smart list that's simply "Lead was created" and somehow it got plopped next to an OR in your smart campaign. These things happen, always check your references and make sure you know your lists.

 

How to protect against emailing everyone:

Ask your admin to turn on smart campaign limits.

Marketo now has a feature that will abort a smart campaign if too many people are pulled into it. Caviet: No one will get anything if it's over the limit. You can adjust this at a Campaign by Campaign basis but the Admin will set a default.  Figure out what's typically the max you should be mailing and go with that number. Maybe it's 5, 10, 100 thousand. Figure out your average list size and go with it.

 

Wait on the schedule tab till you see a number. Yes, it may take forever and it may fail.

In the case that it fails, chances are you have too complicated of a smart list. Simplify it, quit referencing smart lists that reference smart lists. These little buggers can become a virus - causing you to keep emailing people you shouldn't. If it fails time and time again, you may have too many people. Trace through it and find the defect.

 

#2 - Sooner or later, you'll get blacklisted for spamming

Here's the dirty little secret you may refuse to admit to yourself:

74091472.jpg

 

I know, I know...but we're the good ones.  Still, you do things consistent with that which a person who typically sends email described by some as spam does.  And, while Marketo does a fabulous job behind the scenes of protecting the reputation of your company and your IP, there's only so much they can do after you get flagged. It's really on your to protect yo'self from these problems.

 

 

But I don't want to be a spammer!

8e61e8d6cbab6ad442a0cf659a5d9c88.jpg

Create a spam suppression list!

I've written a blog post about just such a thing so I'll just post that right here:

Spam spam spam eggs spam spam spam

 

Have your admin do the whole SPF / DKIM / DMARC thing.

Courtney Grimes has written an excellent article on this: Boost Your Deliverability (and Credibility!) with DMARC

Sanford Whiteman has also blogged about DMARC and DKIM: http://blog.teknkl.com/dkim-brainteaser-answer-2/

Kiersti Esparza has contributed this article about it: Cracking the Inbox Code: Google

 

If you're new to the Nation, these three are kinda the Big Dawgs of the email credibility world. This is a difficult thing to understand but take some time to learn your trade. At its essence, it's credentials stating that Marketo has permission to send emails using your domain name and they should be accepted as your own.

 

Really talk to your users about email limits and, if necessary, enforce them

Maybe you don't keep communication limits turned on for reasons and then maybe you'll find someone who will push you to that point. I recently had a team tell me they couldn't possibly figure out any way to send a person less than 5-7 emails per week so I kicked them out of my Marketo instance and told them to learn 2 newsletter.

 

#3 - That wasn't the right link!

Oh, this one will happen and happen and happen, especially if you have casual users. I see this happen in a couple of different ways:

 

  • The link was just a placeholder link.
  • The link was copied from a previous email sent through Marketo
  • The link was copy and pasted from a webinar provider personalized email
  • The link was from the email you cloned
  • The designed ended up creating a new landing page and didn't link it.

 

Always test every single link

Before hitting send, test EVERY. SINGLE. LINK.  Read the HTML to make sure it's not already a personalized link. Make sure it goes to the right place. DO NOT LET SOMEONE TELL YOU "Just schedule it for me so I know it's set to go and I'll make the changes." This is like taking candy from strangers. This is a time bomb in your email.  Make sure your end user looks at the destination and approves it goes exactly where they expect it to go.

 

#3 - That wasn't the right email!

Eventually you'll notice that 90% of your emails are called Email 1 because you got lazy. You should really be more descriptive, but I can't dictate behavior.

 

Reduce the chance of linking to the wrong asset with this one weird trick!

 

asset number.PNG

 

If you look in the URL you'll see I highlighted a number. Every Marketo asset has a code like this. For an email, it's EMXXXXXA1LA1 (with 3, 4 or 5 numbers). If you copy those numbers and put them at the end of the name of your email you now know how to call this distinct email.  It's a good trick to learn.  Then you can just type that number into the flow step and Marketo will suggest the right email.

 

Did you know you can click on this one weird icon?

email icon.PNG

 

If you click it, it will open the email in Preview mode so you can be absolutely sure it's the right email. Go ahead and try it - it'll blow your mind. Works in regular Smart Campaigns as well as Email Send programs. Guaranteed to make sure you don't use the wrong email.

 

#4 - The personalization looks HORRIBLE!

Did you forget to change the default from "Edit Me" to "Valued Customer"?  I've seen this one happen a lot. Even the best companies make this mistake.

Tim Lamb recently shared this link in a question:  <pat on the back, Southwest guy, been there>

 

name not found.PNG

 

I'm not a fan of personalizing emails. No one really believes you personally wrote that email and if you have a prankster who uses foul language when filling out a form he now possesses an email where you're calling him a foul name. Whenever I see an email that says "Dear Robert" I know it's from a form-fill. Only judges refer to me as Robert.

 

#5 - The subject line was wrong!

There's no getting around this one. You updated the content but didn't update the subject line, now the two aren't in sync. It's highly noticeable and it looks like something went wrong to your subscribers.

 

 

Bottom Line

We all have different ways to verify our emails prior to send. Dory Viscogliosi recently told me she wants everything in writing. Juli James doesn't rely on verbal verification. She states "eye witness reports are rubbish," when it comes to getting approval and written is her choice for error-free execution. I personally do everything live via WebEx with several people on the phone and a checklist of things I run down:

  • Is the correct email linked?
  • Are all the links correct?
  • Does it display correct in Outlook / Gmail / iPhone / Android?
  • Are there any noticeable typos? (Difficult, because I sometimes work on international pieces)
  • Is this going to the correct lists?
  • Is the target size what's expected?
  • Do we have the exact right date and time scheduled?
  • Is the "From" address correct? How about the Reply To?
  • Is the subject line correct?
  • Do all personalized fields have valid defaults?

 

Ultimately if something goes wrong, it's my fault. I once was on a call with the Director of Marketing and he said "I have final approval on everything that goes out" and I said "With all respect, actually I have final approval." If anything goes wrong, it's on me since I push the button. It doesn't matter who else is on the call with me watching, it comes down to the fact that it's my job to be 100% correct. Doesn't matter if the President of the United States says "I approve this," it's your job to say "Mr. President, I'm going to make this email great again by pointing out you have 4 typos, none of your links work and you literally have garbage text in a call out box." (Those errors were actually on an email I was told was 100% approved and ready to go today - although someone far lower ranking than the POTUS.)

 

Now, these things will all happen to you at some point or another. Chances are, you'll have at least one of these once a year if you send a lot of emails. Own up to it, explain what went wrong, take the blame - you were rushing through it, you missed a step, you made an assumption (but end it there). The mistake happened.

I leave you with my favorite quote of all time.....

 

"The Moving Finger writes and, having writ, moves on:

Nor all your piety nor wit shall lure it back to cancel half a line,

Nor all your tears wash out a word of it."

--Omar Khayyam, Rubaiyat.

Here's a piece I recently wrote up to share with some colleagues who felt that they needed to add a lot of custom fields to our Marketo DB for one particular product line in one particular region.  The problem here is that we have so many product lines in so many regions that giving this access to one opens up the floodgates to all.  The problem is that I'm not a fan of sparsely populated data fields - fields that have only a small records who will have something other than the default value.

 

If the field can't work for everyone everywhere, I'm not interested in adding it to the database.  With that, here's my justification for using static lists instead of custom fields.

 

 

Using Flex Fields and Static Lists to act as custom fields

 

This document will show how to use temporary fields, “Flex Fields”, on forms in place of creating custom fields and then store the data in either Static Lists of note fields for permanent, long term storage and usage.

 

Flex Fields: We allow four flex fields available for use by all Marketo users. These are called Flex Field 1, Flex Field 2, Flex Field 3 and Flex Field 4. These can be used to store any type of information temporarily – for a half hour – which is enough time to move the data to either a Note field or a Static List for segmentation purposes.

 

Types of Data: there are 3 main types of questions and data:

  • Finite Choices: These are questions that have a limited number of answers such as Yes / No or Multiple Choice
  • Scalar Data: These are data that use a number to represent a scale. Examples would be number of users, ratings, etc. If this information can be grouped – such as “From 1 to 100” or “Less than 100” or “More than 9000” it can be stored in lists for those ranges: 1-100, 101-500, 501-1000, etc. These ranges can be unique for each form and product line.
  • Free Form Text: This is data that the form respondent supplies by typing in an answer. This data is not standardized, may contain typing errors and cannot be used for reporting.

 

Fields vs. Lists:

Fields are points of data that exist on every record in every region in the database. Fields tend to be limited to data points applicable to every lead in every region or at least enough leads to compromise a significant amount, or are used by numerous product lines and regions.  While information like Name, Email Address, Phone Number, Company Name and the like are applicable to every lead some information like Number of Operating Theaters, Number of Births, Number of Doctors, Number of Beds in ICU are not used by all product lines but are used by several product lines in several regions.

 

Static Lists are lists to which we can add records to indicate having a response to a custom question. If we have a question that cannot be answered by an existing field, and that answer is multiple choice or Yes / No, we can write that record to a list to show interest.

 

Most of the existing roles can create static lists and add or remove members from the list. In combination with the Flex Fields, thousands of points of data can be collected without adding a custom field.

 

If the data is more free-form in nature, that is to say it’s information that the customer provides that is not their personal contact information, or it’s information that then needs to be passed to SalesForce, that information can be written to a note field.

 

Presentation on Forms:

 

When creating a form, add the custom field and then change the label to have the field appear like a custom question. Below is an example of a form used by Healthcare Digital for collecting specific product interest by using a Flex Field and assigning a couple of choices the form respondent can pick from.

 

Both of these questions below tie to Flex Fields (Values shown for example)

 

 

 

Storing in Static Lists:

 

Within Marketo, there is a Smart Campaign flow step called “Add to List.” Within the flow step, there is a button on the Top Right called “Add Choice” which acts as IF/THEN type of logic. Putting in multiple choices in a single step means that Marketo will look for the first time the conditions are true and then abandon the rest of the choices. Alternatively, you can add multiple flow steps.  The example below is from the Product Preference project in place for Europe, where information that maps to a single, temporary Marketo fields needs to be stored permanently. The information is delivered with multiple values at once, which then need to be separated into lists.  It’s worth noting that almost 100 static lists are used to track interest in products for Core Imaging alone.

 

Here is an example of using a Flex Field to drive a product interest into a Static List:

Storing in Notes:

 

When the information needs to be passed to SalesForce, the only mechanism is to either put in a pre-existing field or into a note field. This also works for data that cannot be used for segmentation, such as self-entered information.  An example I like to use is the number of says someone could type in “Saint Joseph’s Hospital”: St. Joseph, St Joseph’s, St. Joe’s, SJHC, etc. All of these appear as completely discrete values to a computer which would have no way to group them. This self-entered information is best put into a note field.

 

Example: In this Smart Campaign, we build a Form Lead Note.  We’ve standardized how we use the Flex Fields on these forms.

 

Since the entire new value isn’t visible, here are the New Values:

 

Flex Field 1 is always used for Product Interest on certain Healthcare Digital forms:

Lead Notes: {{lead.contact question}}; Facility Type: {{lead.Facility Type}}; Product interest: {{lead.Flex Field 1}}

 

Flex Field 4 is always used for miscellaneous purposes on Healthcare Digital forms:

Lead Notes: {{lead.contact question}}; Facility Type: {{lead.Facility Type}}; Product interest: {{lead.Flex Field 1}}; {{lead.Flex Field 4}}

These values then carry over to SFDC where they appear in the Notes field.

 

Flex Fields used in scoring campaigns

 

Sometimes for product specific scoring, we want to ask questions that are very unique to an individual product. An example here is for our Cardiology product line, which asks which kinds of labs the hospital has. We store this information in Flex Field 3 from the form. When the form is filled out, this scoring workflow is triggered:

This scoring program will only start if the person indicates they have one of the above mentioned Cardiology Lab environments, which is asked on the form.

 

Using Static Lists for Segmentation

 

Now that you’ve seen examples how to translate form questions to Static Lists, the next step is to show you how those lists can be used like custom fields.

 

A Best Practice for segmentation lists is to create a program in an Operational Programs folder. This is an Operational Type program used only to house your lists.  These can also be stored in the Lead Database, but to make things simple we’ll show how these create what we in Healthcare Digital call “Core Lists.”

Here you’ll see the Core Lists we use for Cardiology. In here are two types of lists: Static Lists and Smart Lists. A static list is basically a list of names that you decide who is on or off.  A Smart List is more like a query: you use logic to determine if someone should be a member or not.

 

Static Lists give you ultimate control over who is on the lists but need to have Smart Campaigns – workflows – to add or remove names.

 

Smart Lists constantly update themselves as records qualify or disqualify. Smart lists can use static lists as inclusion or exclusion criteria.

 

In this example, we have created lists for our various Cardiology products. Lists marked as “IB” are current customers. CCE is one version of our product, CCI, CCW and DMS are other versions. Because this product line is very volatile – new products are constantly added, product names are subject to change and product lines can be retired – having these products as unique fields is not scalable. While the product is called DMS today it could be called ABC or something completely different tomorrow. Once a field is created in Marketo and is populated with data you cannot change the field name. It is also very labor intensive to remove fields.

 

 

Building a Segment

 

In this next graphic, you’ll see how a Smart List uses several Static Lists for segmentation. The purpose of this list is to dynamically build a list of people at hospitals who own our product, who would be interested in hearing about our Perinatal product line.

 

We know that hospitals have numerous specialties that are of no interest to each other. If we were to generate a list of all hospitals who owned a product and then sent to all records working at that hospital our Unsubscribe numbers would quickly elevate. Why would a neurosurgeon or a proctologist care about Perinatal software? Likewise, as a software company, we know that executives, business analysts and IT personel will sign up for information on this product line while they are evaluating or installing the product but they have no interest in communications meant for the end users.

 

This Smart List combines all people we know who are listed as being tied to one of the 12 Perinatal products and then filters them by job title. Here were are looking for 107 values that we feel are unique to people who work in women’s health: maternity, labor and delivery, infant care, obstetrics or gynecology, etc.

 

 

If these product interests were separate fields we would have to create a very complex list saying (1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9 or 10 or 11 or 12 or 13) and 14 and 15 and 16 and 17 as each product would be a separate line. From experience, the concept of “OR” and parenthesis is hard to explain to an average Marketo user while just putting all of the lists into a single box is much easier. Every time we add in a product line we would have to add it to this list and then manually rewrite the Advanced Filters as points 14-17 would need to be incremented by the number of new fields added in parentheses.

 

Living From Experience:

 

Prior to 2015, Healthcare Digital had our own instance of Marketo which had been in place since 2011. When it started, the thought was that unique fields would be used as needed and every product interest could have a unique field to show interest.

 

Over 5 years, that ended up created 121 fields. Many of these are for products that never ended up being real – we prepared for them but they were canceled. Many of these product ended up being retired. Others had their names changed and we were stuck referring to them by an old name. We also made fields to show is someone owned the product or was merely interested in it. This has been difficult to work with.

 

REST API Name

AreyouanexisitingCPNcustomer

CBS-BusinessETM

CBS-PracticeManagement

SS-Periop-AnesthesiaInteractionChecking

SS_PACSIW_Services

areyouanexistingC360customer

CBS-BusinessEWS

CBS-PracticeManagement-VAR

SS-Periop-BedManager

SS_PACS_Services

AreyouanexistingCBcustomer

CBS-BusinessHPA

CBS-PracticeSolution

SS-Periop-BusinessContinuity

SS_Periop_Analytics

AreyouanexistingCCAcustomer

CBS-BusinessInformatics

CBS-PracticeSolution-VAR

SS-Periop-BusinessObjectsReporting

SS_Periop_ePREOP

areyouanexistingCentricitycustomer

CBS-BusinessMCA

CBSCEServices

SS-Periop-ClinicalInformationViewer

SS_Periop_Services

AreyouanexistingCPACScustomer

CBS-BusinessPatientProtocolManager

CBSPopHealthManagement

SS-Periop-CPAandCPM

SS_RISIC_Services

AreyouanexistingCPScustomer

CBS-BusinessPOL

CBSVARServices

SS-Periop-NursingDocumentation

AreyouanexistingCVITcustomer

CBS-EDIServices

CBS_Business_FRM

SS-Periop-PACUDocumentation

areyouanexistingDPcustomer

CBS-EMR

CBS_Business_Services

SS-Periop-PATClinic

areyouanexistingEMRcustomer

CBS-EMR-VAR

CBS_GroupManagement_Services

SS-Periop-Perioperative

AreyouanexistingGEPACSIWcustomer

CBS-EMRClinicalContent

CBS_Practice_Services

SS-Periop-PerioperativeAnesthesia

AreyouanexistingGERIScustomer

CBS-EMRDocumentManagement

SS-Analytics

SS-Periop-PerioperativeManager

AreyouanexistingGMcustomer

CBS-EMReRX

SS-CentricityClinicalArchive

SS-Periop-PerioperativeTracker

AreyouanexistingPeriopcustomer

CBS-EMRPatientPortal

SS-CPN-Analytics

SS-Periop-Scanning

areyouanexistingPopHealthcustomer

CBS-EMRSecureMessaging

SS-CPN-Connect

SS-Periop-SterileProcessingManager

AreyouanexistingUniversalViewercustomer

CBS-GroupManagement

SS-CPN-IB

SS-Periop-SupplyChain

AreyouanexistingVARcustomer

CBS-GroupManagementAnalyzer

SS-CPN-Interoperability

SS-Periop-Weblink

Are_you_an_existing_CE_customer

CBS-GroupManagementDocumentMgmt

SS-CPN-LandD

SS-RIS-IC

CBS-Business

CBS-GroupManagementEligibility

SS-CPN-NICU

SS-UniversalViewer-CPACS

CBS-BusinessAdvancedWeb

CBS-GroupManagementHostedClaimsManager

SS-CPN-Services

SS-UniversalViewer-IW

CBS-BusinessAnesthesia_Radiation

CBS-GroupManagementPatientPortal

SS-CPN-WebAccess

SS-ZFP

CBS-BusinessASP

CBS-Hardware

SS-CVIS

SSC360CaseArchive

CBS-BusinessBAR

CBS-HealthCheck

SS-CVPACS

SSC360CaseExchange

CBS-BusinessBundledCareManager

CBS-Lab-Laboratory

SS-Integration

SSCCAVAR

CBS-BusinessCBO

CBS-Mobile

SS-MobileAccess

SSCVITUV

CBS-BusinessClinicalConnectivity

CBS-Pharm-Administration

SS-Omnyx

SSGEHealthCloud

CBS-BusinessConsulting

CBS-Pharm-Pharmacy

SS-OneView

SS_AW

CBS-BusinessEDIServices

CBS-PracticeAnalytics

SS-PACS

SS_CCA_Services

CBS-PracticeDocumentManagement

SS-PACSIW

SS_CVIT_Services

 

When we migrated to the Global instance we made a decision to never make this mistake again. This wasn’t scalable, was hard to support and very hard to train when product names change or retire. All of these issues go away by using lists.

Conclusion

 

It is my experience that there are very few reasons for adding in new fields, especially product specific or region specific fields. Having given this much thought, testing and experience and conferring with other Marketo Experts, Champions and Consultants, the consensus is that static lists work very well for preserving information that is Boolean in nature, such as a product interest.

 

As a Marketo admin, my goal isn’t to reject all requests but to work with the regional users and show them how results can be achieved without disrupting the database by adding fields. Along with the other admins we carefully consider and discuss proposals for new fields and judge it on the following criteria:

 

  • Can the same results be achieved in any other way?
  • Would the requested field serve any other region or product line?
  • Is the field name going to persist for years?
  • Is the field relevant to a large portion of the database? (At least 15%)

 

If we can achieve results without adding a new field and if data is only relevant to one product line or region then we are not likely to add in the new field.

 

The reason for not adding new fields is simply scale. If we do it for one product in one region we have to offer the same opportunity for every other product in every region. This is not scalable and would be very difficult to administer. There are too many products in too many regions and in the end only a very small number of records would utilize the field.

This is the first in a series I'm titling "Big Marketo." 

 

Big Marketo Defined

Big Marketo is about how large companies think about Marketing Automation, the challenges we face and how we think through ideas that are scalable for different skill levels.  Big Marketo isn't just for large companies, it's for anyone who manages more than one or two users of Marketo.  Big Marketo is, in essence, tips and tricks that help us keep this sane in an insane world of ideas.

 

Credentials...

Having worked for seven years using Adobe Campaign (formerly Neolane) for a medium sized company I came over to GE Healthcare Digital in 2014. Since joining I've become a recognized expert across all of GE in the Marketing Automation arena and ascended to the top level at GE Healthcare to help lead and shape the Marketing Automation initiative. I've redesigned how programs are run in a way that's scalable and simple. I've utilized the power of Tokens, Landing Pages, Script and Campaigns to take the burden off of the end user.  I've written user roles in a way that's sensible, logical and safe. Is it perfect? No. Is it working? Yes.

 

I currently admin an instance of Marketo with about 160 users and growing. We have users on almost every continent and region and country- North America, Asia, India, Africa, Australia, South America, Europe, Middle East, Far East, Central America, U.S., Canada, etc. Just a couple of months ago it was out of control. We had over 19 people with Admin access, some of whom were consultants, many of whom had no experience or training. People were free to make major changes without knowing the downstream impact.  We also had about 10 different user roles that no one truly understood. Some of the roles were specific to one or two people, others were assigned to people who also had Admin access.

 

Prior to me joining the Global team, there was a completely different team in charge and all of them had left the company, leaving a large knowledge gap of why it had gotten so out of hand. Assigning blame wasn't the priority, fixing things was. This was going to be painful, we were going to reduce a lot of people's access and take away functionality.  We had seen too many things go wrong and we needed to make this error proof.

 

So why start with User Roles?

I've thought about it and I'm starting with user roles because I believe from here it will set the table for the other topics.  Everything starts with set-up and talent. You need to know who you have and what there skills are and channel them into ways that doesn't force them to take on responsibilities out of scope.  My next topic will be Program Creation, and that will really help you see how these roles work together. We'll also get into Workspaces and how to utilize them to make your instance safe. But I think the first thing to think about is User Roles, what you should allow users to do, who does what and why and how to make them all work together efficiently.

 

Let's start at the beginning....what are the core functionalities of Marketo?

Marketo, broken down, has a couple of key areas that require different skill sets. Let's break it down:

Admin -

These are Marketo experts who really know all the ins and outs of Marketo. The wield the highest level of power and use it the least. These are the people who need to make sure Marketo changes as little as possible and see the impact of people's mistakes. Admins real responsibility lies is creating new users, assigning roles, training other users and preserving the integrity and structure of Marketo.

 

Data Analysis, Scoring & Reporting

Marketo captures and creates data which are used to create reports and models for end users. Marketo has several ways to report data from smart lists to canned reports to their Revenue Cycle tools. A core functionality of your Marketo team should be business analysts who understand databases and data modeling and how to perform testing for scoring and lead lifecycle. Data is captured not only from Marketo but also from any linked CRM or other tool.  Here is where a keen eye for which data is meaningful to have in Marketo vs. which is not is crucial as it will help your instance operate proficiently and not get backed up receiving and transmitting useless data.

 

Trigger Based Automation

Marketo records a lot of data and is capable of recognizing a lot of events happening. The trick here is to know which are the significant few triggers that your business needs. Knowing how your customer base interacts with your programs is important in knowing which triggers you want to use, as is understanding what your sales and marketing people want to know about. For some, a web page visit might be an important event to note while for others this trigger could overwhelm the system if the website is highly trafficked.

 

Web / Email Design

Knowing how to design Marketo pages that integrate seamlessly with your website lies in the hands of graphic designers and web designers. Knowing how to model CSS and centralize on it to minimize updates is highly useful for big companies as the web layouts and looks can change quickly.  You want to do this right the first time so 4-5 years down the line you don't end up with hundreds of pages that need individual updates.

You also need people who understand how to design Emails. These use different rules than Web Pages and if you don't know what they are you need someone who does. The email design tool in Marketo is not indicative of how the email will look in Outlook, Yahoo, Gmail, iOS, Android, Outlook.com, mobile, tablet, PC, etc. If you think "All my customers are B2B so they all use Outlook," you're wrong.  If you're doing your layouts on a P.C. and not optimizing for mobile, you're old fashioned. You need to make sure you have a designer that knows how to build and test emails for best performance, as well as how to A/B test.

 

Web Developers

On top of design, knowing scripting will add immediate value to your Marketo initiatives. If you want to break the mold and show that your website is modern you need to know a little scripting, whether it's JavaScript, jQuery, or PHP.  It's not difficult to learn the basics but you need to be able to incorporate scripting if you really want to get the most out of your Marketo pages.

 

The Roles and their responsibilities

Your user base

Chances are your user base falls into one of two categories: I'll call the first "Field Marketing," people who are responsible for creating the message, identifying the streams and ways to promote / spread the message, and; "Marketing Operations," your technical folks who know how to make the automation happen. Both of these roles serve unique purposes and should have Marketo roles in scope with their work. With that in mind, here is how GE Healthcare crafted user roles for our instance of Marketo. We'll start with the lower role and work up.

 

Content Editor:

This is where the majority of your "Field Marketing" team will be. They have ability to clone programs, create new emails or landing pages, update content but not approve unapproved asset and launch / activate campaigns. They have access to Lead Database, Marketing Activities and Analytics but cannot change leads attributes. The main job of the Content Editor is to own the actual content, update it when necessary and create new programs based on templates without the ability to launch unsupervised.

In the next part in this series you'll understand how a Content Editor can do their job proficiently by utilizing only tokens and never needing to know the Landing Page Editor or the Email Editor. For now, just think that these are people who will generate new ideas, forge partnerships with external channels, work with product marketing and sales to identify opportunities to create new assets and then update the customer facing content when necessary.

 

Required Skillset:

Basic Marketo knowledge and experience using a WYSIWYG editor.

 

Responsibilities:

  • Create HTML content and get approval
  • Coordinate with Web team for downloadables
  • Request / schedule campaign on Marketing calendar
  • Lead import list properly requested
  • Clone Marketo program
  • Load content into Marketo asset
  • Update all relevant tokens
  • Prepare workflows to best of ability
  • Notify Marketing Approver when it is ready to launch
  • Work with CE Marketing Approver on launch checklist
  • Ultimately responsible for content and program

 

Marketing Approver

The next level of skill is your Marketing Approver. This roles has Content Editor plus the ability to approve assets and launch / activate campaigns. Has access to Lead Database, Marketing Activities and Analytics. Is typically restricted to Operation team users with Marketo training. The main reason for a Marketing Approver is that no one should be able to approve their own programs without another set of eyes on them; and prior to launch, an expert in the area of Marketing Automation should review the program to insure it adheres to local laws, company governance rules and it will work as expected.  This role has perhaps the most responsibility as they are responsible for checking every link, every email, every page, every workflow and list prior to hitting Send.

 

Required Skillsets:

Marketing Automation experience, knowledge of personal data privacy laws for their region, proven comprehension of region governance, workflows, mid-level graphic design (HTML / CSS for webpages and emails).

Responsibilities:

  • Program set-up
    • Program is in the correct folder
    • Correct program type used: default, event or email send
    • Correct channel is selected
    • Program contains only one channel (i.e. an email pointing to a landing page for a download is two separate programs: email and gated asset)
    • Forms are reused whenever possible
    • Workflows are centralized whenever possible
    • Program cost and period properly set and updated upon request
    • For Webinar, program is linked to the correct webinar platform (WebEx) and event
  • Email
    • Templates are current and active
    • Emails display as intended in different browsers / email clients (specifically test Outlook, Gmail and iPhone / Android)
    • Links are active, valid and are not personalized (if they lead to third party sites)
    • Operational / Non operational email type used correctly
    • Spelling / Grammar is acceptable (if proficient in that language)
    • Text Only version updated and formatted
    • Default values entered for personalization tokens
    • Ultimately responsible that program was executed upon approval from requestor & that protocols were followed
  • Landing Page
    • Templates are current and active
    • Pages display as intended in Chrome, IE, FireFox and mobile (Safari / Chrome)
    • Links are active, valid and are not personalized (if they lead to third party sites)
    • Correct form used and hidden fields updated
    • Head tags populated (content is responsibility of Content Editor user)
    • Spelling / Grammar is acceptable (if proficient in that language)
    • Token codes are not visible on rendered pages
    • Upon form fill, expected page is reached
  • List
    • List criteria matches persona entered on request form
    • For email, list is under 10,000 recipients
    • Unsubscribes, invalid emails, hard-bounce replies, blacklisted email addresses are removed
    • List contains people for whom the information is relevant and expected
  • Workflow
    • Proper list is used / created in Smart Campaign
    • Flow steps are tested to ensure expected results are achieved
    • Values / tokens used in flow steps are correct for the product and program
    • Note field updates are formatted properly and append to previous notes and do not wipe out data
    • Activities written to CRM fields are formatted properly
    • Leads score as expected and can PQL
    • Program Status Updates happen only to people for whom the program is the last program with which they interacted
    • Debug improper workflows & update/maintain as needed
  • Reporting
    • Reports are properly built, as requested, in the program
    • Report subscriptions (either report or smart list) are only created for approved people
    • Subscriptions are deactivated when no longer needed

 

Region Admin -

Not every company will have this role and not every company will have a separate role for Region Admin / Marketing Approver, however there are functions that a Region Admin owns that are crucial towards success of marketing automation.  If your instance is differentiated by region you need to have a regional expert who natively understands the region and can act as an evangelist of that regions users. They also need to be part of the Marketing Operations Round Table, representing that region's needs and their knowledge of the users. The RA is the main point-of-contact for the region, providing training and Tier 1 support. This role does not have Admin access but has access to "secret" workspaces where critical-to-quality workflows are housed, out of reach of the Marketing Approvers. I'll cover more on this in one of my next posts about Big Marketo.

 

Your Region Admin has access to Lead Database and can change data directly when necessary. They have access to the Design Studio and can create and update templates for Email and Web Pages as well as Forms. (Look for an upcoming post about how Centralization Is Your Friend.) They can update scoring programs and the Lead Lifecycle.  The Region Admin is a powerful role and requires someone who works closely with Sales and Marketing leadership and understands business needs and how to continuously improve programs.

 

Responsibilities:

  • Maintenance, creation, activation and deletion of all region specific workflows
  • Attention to notification logs to proactively find issues and correct
  • Escalation to Admin for issues that are affecting or affected by other regions
  • Communication with other Region Admins for proposed workflows or programs that may be considered Best Practices
  • Coordination with other region admins to schedule large imports or complex batch programs that will slow down the campaign queue
  • Training and support for users within that region
  • Assessment and feedback to Admin of potential up or downgrading of Marketing roles
  • Make changes to templates and batch update assets
  • Add / maintain centralized forms and workflows
  • Level 1 troubleshooting for the region

 

Admins -

These are the highest, most proficient Marketo users. The requirement is that they be a Marketo Certified Expert to even be considered, be part of the core Marketing Operations team, have clearly defined knowledge of Markeo and share a unified vision for preserving the integrity of Marketo. This group should have an extremely conservative mindset when it comes to altering Marketo.  Requests for new fields need to be scrutinized for unanimous agreement that there's no alternative for storing data. They need to know how to write webhooks, how to partner with organizations looking to utilize APIs and how to troubleshoot integrations.

 

You should limit your Admins to as few people as possible, with an eye on spreading out responsibilities across timezones to provide around-the-clock support. For GE Healthcare, there are 4 admins: 2 in India, 1 in Australia and 1 in the U.S. We work closely together an act as one mind.  We listen to the needs of others and work to create solutions. We do not utilize our Admin powers often and we also act as Region Admins and Marketing Approvers.

 

Responsibilities

  • Changes that will affect the entire Marketo instance:
    • Field additions or name changes
    • Program statuses
    • Tags
  • Opportunities to improve the Marketo instance performance and reliability (i.e. SPF / DKIM)
  • User Roles and User Accounts, including LaunchPoint
  • Proactively search logs for issues affecting performance / integrations and coordinate with RA for fixes
  • Involved in new API / Webhook connections
  • Work with designers / RA to test and approve templates
  • Create support tickets if issues cannot be resolved with internal resources
  • Activate new features and create training plan for RAs
  • Work on implementing new features / modules of Marketo and create documentation and training materials

 

Now, there are two other roles worth mentioning:

  • API User

    • A role for APIs wishing to integrate with Marketo. Mandatory for the creation of an API account
  • Agency

    • Hybrid roles created based on the reason and skillset of the Agency.  Typically an Agency will never have access to the Lead Database, Admin Functions or be able to approve or execute a program without vetting from the Admins for skill, understanding of business and security.

 

These are the roles we utilize at GE Healthcare. All of our 160+ users fit into one of these roles and can perform the duties that their job requires to the fullest.  This is also thanks to the program structures and centralization techniques we're utilizing to keep the instance sane.

 

Now it's also worth noting that these roles are only most crucial in a Production environment.  We often have Content Editors or Marketing Approvers who want to model changes or new programs which may require new fields. We require all work of this manner to be performed in a UAT / Sandbox environment and have reviews by the Region Admins and Admins prior to migration to Production.  This is where the Admins have the opportunity to train users on how to accommodate programs without the addition of new fields, or come to consensus on whether or not to add new fields as well as provide rigorous testing on proposed new programs or changes.  This is where Admins, who have knowledge of what other regions are doing, can be of most benefit by using on region's innovation to benefit others.

 

So ends Pat one on Big Marketo.  Let me know what you thought, how you'd improve on what I've detailed or what you'd like to see in a future installment.

Picture1.png

 

What it is...

 

Spam email is a form of commercial advertising which is economically viable because email is a very cost-effective medium for the sender. If just a fraction of the recipients of a spam message purchase the advertised product, the spammers are making money and the spam problem is perpetuated.

https://runbox.com/email-school/what-is-spam-and-how-to-avoid-it/

 

Why is it called SPAM?

Literally, because of this Monty Python bit.

 

Monty Python - Spam - YouTube

 

 

How it affects You

 

When we send out unsolicited emails, the IP address used is monitored by Spam Listers, like SpamCop, Baracuda, etc.

Marketo assigns our IP addresses. If they don’t catch things in time, all emails sent from that IP will be blocked

 

Actual real lead that’s now blocked because we’re listed as spammers

Picture2.png

 

How to protect your reputation in Marketo

 

  • Do not email to people who have not filled out emails asking to be contacted
  • Monitor who is calling us a spammer
  • Watch for Spam Traps
  • Create a suppression list and institutionalize it
  • Do not delete these leads from Marketo
  • Don’t mail to personal email addresses

 

Do not email to people who have not filled out emails asking to be contacted

  • Don’t purchase or rent lists
  • Use lists from tradeshows CAUTIOUSLY
    • Most often, tradeshows give us a list for one time use
    • Send an email to the list with a Call-To-Action to fill out a form
    • Set a “Self Destruct” workflow 10 days after the email that DELETES any lead that has not filled out a form

 

Monitor who is calling you a spammer

  • Create an operational program for Email Analysis
  • Create this  Smart List:
  • Picture3.png

 

Watch for Spam Traps

  • Spam Traps are email addresses that look, smell, taste and feel like real email addresses
  • They are created by companies and put onto lists that are imported into Marketo – tradeshows, third party lists, etc
  • They have never filled out a form
  • They monitor how often they get email from us and then report us to SPAM agencies that put us on the list of spammers

 

Tell Tale Signs of a Spam Trap:

  • Never filled out a form or came from a CRM
  • Often clicks emails before emails is delivered
  • Often times a flurry of clicks
  • Clicks links but doesn't visit web pages

 

Smart List to find Spam Traps:

 

 

Chrome Legacy Window 6152016 110946 PM.bmp.jpg

 

Creating a Suppression List

This is a list that you'll want to hold onto, monitor and perfect.  This is a list that you'll want institutionalized on all of your email campaigns.  Suppress these people!!!

 

Smart Campaign 1 - Spammy Accounts

Create a smart list where email address starts with "info@"

Add them to your Suppression list

 

Smart Campaign 2 - Bounces

Email Bounces Soft, email is any, minimum number of times = 3

Email Bounces - email is any, reason contains: spam, invalid, spamcop, blocked

Add to your suppression list

Chrome Legacy Window 6152016 111640 PM.bmp.jpg

Smart Campaign 3 - Potential Spam Traps

 

  • Clicks Link In Email - Email is Any
    • Date of Activity: In past 2 minutes
    • Min Number of Times: 3
  • Lead Source Is Not salesforce.com (or your CRM)
  • Not Opened Email
    • Email Is Any
    • In Past 2 minutes
  • Not Filled Out Form - Is Any

Screen Captures.jpg

You'll eventually find leads like this, where there's a flurry of clicks but no web pages visited.  This is due to the spam scanner clicking the link to prove to itself it's a redirect, then abandoning the click so it never trips Munchkin

 

Chrome Legacy Window 6152016 113429 PM.bmp.jpg

 

There are a lot of other things you have to watch out for with Spam Traps.  I'll update this blog as I find them.  If you have some, feel free to contribute!

Nurture Marketing.  Marketo calls it Engagement Programs. Whatever the case, these are the emails designed to keep us informed while we're evaluating our options or waiting to pull the trigger.

 

In layman's term, spam.  Gmail calls them "Promotions". We call them "Unrequested Marketing Emails." Whatever you want to call them, they do serve a purpose and I have had truly hearfelt feelgood stories about the impact of Nurture Marketing. I've seen them convince people to get medical care instead of sitting around pretending nothing's wrong. I've seen them convince people to buy.  I've bought several times from good nurturing programs.

 

The problem with creating a Nurture Program is simple: How do you avoid wasting content?

 

In marketing terms, length matters. Someone who wants to buy your product in July but won't have budget until January needs to feel special and loved.

You can't finish too early.... You can't run out of emails in September and just hope they remembered you.

 

With that in mind, this blog will show you, step by step, how to create an Engagement Program that conserves content. If they didn't open your email then maybe your subject lines suck. Try it again with a better subject line that hopefully sucks a lot less.  If you've tried twice and they still didn't open, move on and try your next piece of content.

 

With this, you're potentially DOUBLING the amount of content you have. You're trying to put a prettier bow on the present in hopes they'll open it.

 

 

This document will show you how to create conditional sends in an engagement stream.

 

As you may know, an Engagement Program will allow you to use programs in the streams. The programs are nice because they allow you to use conditions - IF THEN, etc. The problem is that a lead can only be a member of a program in an engagement stream once, so making conditions that allow a lead to skip a step can be difficult. This guide will show you some steps around that problem in a very scalable way.

 

This example will use the following situation. You can adapt this to your own needs:

 

Cast 1: Send Email 1

Cast 2: If Opened Email 1, Send Email 2. If Not, Send Email 1b

Cast 3: If Opened Email 2, Send Email 3. If Sent Email 2, Send Email 2b. If Not Sent Email 2, Send Email 2.

 

One could create a program like this, continuously building upon the complexity. The first time I built my nurture program, this is what I did. When I was asked to shuffle emails around it was an absolute nightmare.

 

This is not what we will do. We will create an Engagement Program that is far more scalable, easy to understand and easy to manage.

 

I am not going to go into philosophy behind Nurture Programs. That is another blog I am working on. This will be purely technical as to how to allow emails to be skipped if a person is not eligible to receive it. In this case, every email has an alternate with a different subject line. If they open the main email they are not eligible to receive the alternate.

 

Housekeeping:

I like to keep everything very structured and tidy in my Engagement Programs. To follow my example, build out an EP with the following:

 

Folders:

1. Assets

2. Workflows

2a. Add to Nurture

2b. Remove From Nurture

2c. Casts

 

Create this PROGRAM in Workflows

2d. Master Nurture Program

And these folders:

Assign Emails

Email Tracking

Send Email Logic

Chrome Legacy Window 3142016 14404 PM.bmp.jpg

 

This blog will not get into Add To Nurture, Remove From Nurture, Emails or Landing Pages in detail.

 

In the email folder, I have all of my email assets: Email 1, Email 1b. Email 2, Email 2b, Email 3, Email 3b, Email 4, Email 4b, etc.

 

The first step is to create workflows to Assign Emails. This is very basic and simple.

 

Smart List: Campaign Is Requested

Flow: Send Email (name of email that corresponds to Smart Campaign name).

 

Chrome Legacy Window 3142016 14724 PM.bmp.jpg

 

Why we do this step: A lead can only go through a program once and this is logic we'll want to re-use. Also, an Engagement Program will only send an Email once IF if's defined in the stream or the program in the stream. We're tricking Marketo to not realize it's doing that.

 

Step 2: Define Success Criteria

For this step, we're going to create a smart list that provides what success looks like. These are the reasons why it would make a lead ineligible for an email.

In this example, we're creating a list of reasons why they would be done with the first group of emails - Email 1 and Email 1b and eligible for Email 2.

 

If they visited the landing page, or...

If they opened Email 1, or...

If they received Email 1b...

 

They are eligible for Email 2. Until they do one of these three things, they are not eligible.

 

Chrome Legacy Window 3142016 15307 PM.bmp.jpg

 

Create criteria for all of your steps. In this case, we're looking to skip over Email 1b if we can. We do that by indicating that they opened Email 1 or visited the associated landing page, or they actually received 1b. Do this for Email 2 and on.

 

Step 3: Creating Your Email Sending Logic

Now is where we put this all together. This is confusing, so bear with me. You'll need to start at the end point and work your way to the beginning.

 

Step 1: End Campaign

For all of these steps, Smart List is "Campaign Is Requested". The reason we do everything backwards is that, in each step, the NEXT STEP must by built and activated in order to use it.

I have a stream called "Completed Nurture" which I use to house everyone done with the program. We're just moving them into this stream. Activate the flow.

Chrome Legacy Window 3142016 20356 PM.bmp.jpg

 

Step 2: Last Touch: "Call 5 or End"

Request Campaign

(You'll have to forgive the screenshots. Marketo prefixes everything with full source name which makes it hard to see.)

Choice 1: If they're a member of the smart list you created to define that they've completed this touch (in this example, they've completed Email 5), Request the End Campaign program we just created.


Choice 2: If they're not a member of the Smart Campaign for Email 5, then request Smart Campaign Email 5.

Default: Send Email 5b

 

Chrome Legacy Window 3142016 20749 PM.bmp.jpg

 

Step 3: Call 4

Request Campaign

Choice 1: If they've completed this touch (in this case, an Autodemo) then call "Call 5 or End".


Choice 2: If they're not a member of the Smart Campaign for Email 4, then request Smart Campaign Email 4.

Default: Send Email 4b

 

Chrome Legacy Window 3142016 21313 PM.bmp.jpg

 

....Keep doing this until you get to your first touch...

 

What you just did was define every step along the way of what should happen next. You started at the end because the next step must exist and be active before you can call it.  You can't request Touch 5 until Touch 5 exists, and therefore you can't start at Touch 1 and request Touch 2 because it's yet to exist.  Confusing, I know.

 

Chrome Legacy Window 3142016 22718 PM.bmp.jpg

 

OK folks, last things here, I promise....

Now for the easiest part of all.  The cast programs.  These are the programs that will be called for each cast.  This is super simple.

 

Step 1:

Under your folder 2c. Casts, create a Program called Cast 01.

In the program, create a Smart Campaign called "Call Master Program."

Smart List: Member of Engagement Program (this program).

Flow: Call 1 (this is the last SC you created in the prior step, which send out Email 2, 1, or 1b).

 

Step 2:

Clone this program for as many total touches as you have. In this case 5 touches * 2 versions of each touch = 10 clones.

Don't change a single thing! Don't change the flow! Don't change the flow! DO NOT CHANGE THE FLOW! Request Call 1 each time.

 

Chrome Legacy Window 3142016 22546 PM.bmp.jpg

 

 

Now, put all of your Casts in your Engagement Program

 

Chrome Legacy Window 3142016 22833 PM.bmp.jpg

 

How It Works:

 

Each week, Call 1 is requested. Call one will see if you've completed this touch and if so, request Call 2.

Call 2 will see if you've completed the touch and if so it'll request Call 3.

Call 3 will see that you haven't completed this touch. You've received Email 3 but didn't click or open the email, so it'll send you Email 3b.

 

Here's the Activity Log from some tests I ran.  This starts with Email 3 in the chain because Email 2 had a lot of clicks which kill the example. Starting at the bottom, I request Call 1, which was completed as was 2. It send me Call 3.  I opened the email. Now it goes through again and gets to Call 4. I don't open the email. Now it goes through again and sends 4b.

 

Chrome Legacy Window 3142016 23448 PM.bmp.jpg

 

So, why does this work? Because we're not sending an email in the Engagement Stream, we're calling Campaigns. And we're not asking it to go through the same program, we're creating a new program that starts at the beginning at goes to the right spot. If you're eligible to skip a communication you do. If you're not eligible, you get it again.

 

Voila!

 

Filter Blog

By date: By tag: