Building an advanced email queue with Marketo Engagement Programs

Marketo Employee
Marketo Employee

By Phillip Wild​, original discussion can be found here.

Marketo’s Engagement Programs can do some extremely useful things for the marketer. What was once a series of complicated user journeys can now be distilled into an email drip campaign (called “casts”) based on a cadence you specify.

However, the built-in functionality has one flaw for how we run things at G Adventures:

If you use sub-programs, and a person doesn’t get sent the email via a smart campaign when the cast goes out, the system will stop there and won’t check the next program.

Effectively, when a person enters a sub-program within an engagement program, and triggers a smart campaign, regardless of whether they qualify or not, Marketo will stop. It won't check the next one. Great behaviour in some cases, but not for what we are trying to do at our business.

Let’s illustrate this with an example. Let’s say we have the following structure in an engagement program.

You can see that we have three streams — based on the time zone of the sends — that are otherwise identical. Within the streams, we have a series of 8 emails.

This structure is designed to give a person in this program one email a week on a Tuesday. It’s a group of our most engaged leads, so we are trying to send them the most appropriate content in order to get them to make that last step and book a tour. Each of these emails has an additional set of criteria beyond simply being a member of the engagement program (we don’t want to send our Active tour content to those who habitually book our polar expeditions, for example). So whenever the engagement program “casts” out a send, the default behaviour is:

  1. Check membership of the top program (basically, whether they have received the email previously). If a member, then start this process again, but from the next program down.
  2. If not a member, then check criteria for the send. If criteria passes, send the email. If it doesn’t pass, do nothing.

So that’s great if the user has already received the first email (defined in Marketo-speak as “is a member of the first program”). But if they haven’t, and they don’t qualify for the send, then…and this is the important bit…Marketo won’t check whether they qualify for the next program immediately, but will instead do nothing for that cast and will wait until the next occurrence. So in our situations of 8 programs above, top to bottom, each with narrowly defined criteria, then with a weekly cadence of sends:

  1. If you qualify for emails 1,6 and 7, you would receive an email the first week, nothing for 5 weeks, then emails 6 and 7, finishing with nothing in the last week.
  2. If you qualify for emails 2,3 and 4, you would receive nothing the first week, then an email a week for the next three weeks, then nothing for the remaining 4 weeks.

This clearly isn’t great for what we are trying to do here. We are trying to motivate this highly interested group of people to book, so for them to go several weeks without receiving what would be a highly effective piece of communication is very sub-optimal.

So how can we get around this? One way would be to use emails instead of sub-programs in the engagement program above — but you can’t have additional criteria on an email cast. The email would go out to everyone. That’s not going to work given how targeted these communications are. Not an option. The solution is to use how Marketo defines membership to “skip” non-qualifying emails. (A shout out to Roxanne McGlumphy at Marketo first off for showing us this little-known hack. It’s been incredibly useful for us).You might have noticed from the explanation above that Marketo first checks for “membership” of a sub-program before it even looks into the criteria for sending. If a person is already a “member”, Marketo decides that it must have already received that send, and moves on to the next one — immediately! So if you set membership of a program for those that you DON’T want to receive it, Marketo will skip them through to the next program, and so on until it finds something they are not a member of, or until we run out of content.

To build this in practice, here’s what we did and the thought process behind it:

  • Our deployments trigger from around 2:00am — 6:00pm EST Tuesdays. So membership of sub-programs would need to change before then.
  • We also need to change membership back for those who didn’t end up receiving the email. Otherwise, if they stay as a member of the sub-program forever, they will never be able to receive the send, regardless of whether they qualify or not.

Extrapolating upon this, let’s say our criteria for the first sub-program, “Non Inca Trail Peru”, is something like this. You will receive it if:

  • You’re an email subscriber; AND
  • You’ve never received that email before; AND
  • You are interested in Peru.

So if we want to ensure that those that shouldn’t receive it will be “skipped”, and could potentially receive the next email immediately, then we need a smart campaign to run each Monday night with the following criteria:

  • You’re not an email subscriber; OR
  • You’ve received that email before; OR
  • You’re not interested in Peru.

For anyone who qualifies for that smart campaign, you want to use this flow step: By changing their Program Status of the sub-program to be “Sent” you are making them a member of that program, and ensuring they will be skipped in the next cast. Marketo thinks they have already received it.That program should run weekly, just before your cast goes out. If your casts only occur monthly, then you would only run that smart campaign monthly (you get the idea). Now the second element: for those who didn’t receive the email, change their status back to not be a member of that program. It’s entirely possible that after you changed them to be a member they became interested in Peru, became an email subscriber, or both! So they should qualify for that send next time. This smart campaign will run after all your casts have completed (in our case, after 6pm Tuesday EST), and will have the criteria: Pretty straightforward. Since an email could live in multiple engagement programs, we use “contains” instead of the absolute match of “is” (Marketo believes that an email in a different program is a different email). And the flow step: So each week, here is what is happening:

  1. Before the first cast on Tuesday at 2am EST, we are checking membership for all sub-programs in the engagement program, and marking those who don’t qualify as “members” of those programs.
  2. Marketo runs through the casts and will move straight on to the next sub-program if it finds that a person is a member. So if you only qualify for emails 4 and 5, you will receive email 4 in the first week, and email 5 in the second week. Receiving the email will change a person’s membership of a sub-program to “member”.
  3. Once the casts are done, for anyone who is a member of the sub-program but didn’t receive the email, change them back to not be members of those programs, so they can qualify for future sends.

The power of this should be apparent. You no longer have to settle for one of two options:

  1. Having a generic stream of content where everyone receives ALL emails in the stream, sequentially.
  2. Having a customised stream where you can qualify for one, some, or all, but you have to wait for several casts before receiving the piece you actually qualify for.

This method allows you to build a dynamic queue of content that will be different for each user. And don’t forget, within Marketo engagement streams you can also:

  • Have “timed” content so it only goes out during a certain time period;
  • Change the order of content in the stream to prioritise based on objectives;
  • Use email scripting and/or dynamic content to customise your emails further;
  • Send more than emails — flow steps are available to you as part of sub-programs, so think sales alerts, remarketing lists for social, or even webhooks for direct mail sends.

It’s a bit daunting at first, but once you see the power of engagement programs used in this manner, it’s going to be hard to argue with the results. Happy casting!