I know that getting started with a new Marketo engagement program can be inspiring yet uneasy thanks to the vast custom setup options.

With three years of marketing automation experience and a Marketo Certified Expert title, I wasn’t worried about setting up my first engagement program. But, despite my careful planning, I faced some unexpected challenges during the configuration and monitoring stages. With Marketo’s diverse engine, the devil is indeed in the details!

The same program has evolved to be the biggest and most complicated nurturing track in our Marketo instance. Through two years of iterative improvements since its launch, I’ve gathered tips and recommendations to help fellow email marketers master the setup of engagement programs in Marketo. 

So, let’s dive into how you can create an engagement program armed with a few insights right from the start.

Streams function

This is the basis for the whole architecture planning, so I can’t miss saying a few words. Streams inside engagement programs are like swimlanes: either filled with content or vacant. How you decide to use them will influence the way you set up transitions. 

I used streams to support a specific stage of the target audience’s journey. That called for a pack of smart campaigns featuring a mix of triggers and advanced filters to manage people’s transition between streams. I knew having a vacant stream to collect all people who’ve become unmailable would be handy. However, I didn’t anticipate that my engagement program would end up having five vacant streams, each serving a different purpose. I’ll break down the benefits of this decision below.

Stream content: Email vs. program

Marketo allows you to add emails or programs as stream content. Nested emails are great when:

  • You want to enable a one-click Recipient Time Zone in stream cadence settings 
  • You want to send emails to everyone within your stream without additional exclusion or set of choices inside the flow
  • You don’t need to take any actions other than send emails 

I prefer using nested programs primarily because of the customizable setup they offer. I can adjust the smart list or flow at any time, looking for optimal performance. I can add a choice to check if the person is still a member of the desired target audience right before sending the email. In the flow steps, I can collect specific audiences to a list for the sales team to work with. I can still manage time zone-sensitive sendings, etc.

screenshot of marketo smart campaign settings
Image source: Marketo

As an occasional bonus perk, using nested programs opens a way to work with Smart Campaign Settings.

Transition rules vs. smart campaigns setup

Once the stream’s purpose is clear, it dictates if people are supposed to move between streams and the transition conditions. Transition from stream to stream can be set up either via Transition Rules on the streams tab or the Change Engagement Program Stream step inside the smart campaign flow.

Transition rules:

  • Are good when you have clear triggers to move people to another stream, like the Fills Out Form trigger, etc.
  • Have a visual summary inside the stream setup (easy to find, easy to read)
screenshot of marketo transition rules
Image source: Marketo

But transition rules won’t work without a trigger, and trigger options are limited. For example, when you want to move people who’ve exhausted one stream to another, it’s much easier to do with a batch smart campaign. Plus, you can’t set advanced filter logic in transition triggers, as multiple filters will be treated as “1 and 2 and 3.”

For my team, it was the main bummer and I had no other choice than to build a system of smart campaigns to manage transitions. I prefer this structure because:

  • You can build comprehensive logic with complex triggers, wait steps, executable campaigns, etc.
  • Each smart campaign has a results tab, making it easy to check people’s logs to ensure the flow works as expected.
  • You can access the volume of people who went through it by checking Batch Run History or evaluate it via Membership Trend.

It would be just perfect, but:

  • If you use batch campaigns, you’ll need to ensure that their schedule aligns with the stream cast time (to make sure people will join the stream before the stream cadence triggers email sending).
  • Even though to support a complex lead journey you most likely will use smart campaigns, it still means that you need to be quite vigilant about the structure you’ve built, and invest time into monitoring. Are you sure no person is left behind? All scenarios covered? It is harder to test this setup. You might prefer to build a health check system, catching possible discrepancies in custom smart lists and doing yet another round of log digging. 
  • Complex or not, this setup still won’t be as straightforward to read as transition rules.

Ways to ensure a desired sending time

No need to say that users prefer to receive emails during their daytime, and adjusting the sending time can boost your rates significantly.

When you’re using nested emails, all you need is to enable the Recipient Time Zone feature by ticking a checkbox at the Stream Cadence Setup — easy peasy!  But if there’s a sudden need to abort the sending process, things can get tricky. Once the cast is initiated at the chosen time, there’s no clear way to disrupt it even though the actual email dispatch may occur later, matching individual time zones.

There are also cases when you have to go with nested programs instead of nested emails, but you still want to send emails based on the person’s time zone. We use Marketo segmentation to group people per main regions, so I use those segments in a flow choice with wait steps to make these emails go at the most appropriate time. 

Example: Send email to APAC regional segment > Wait step > Send email to Europe regional segment > Wait step 

screenshot of marketo repetitive steps in flow
Image source: Marketo
screenshot of marketo repetitive steps in flow 2
Image source: Marketo

One more tip here based on our team best practices is to use an executable campaign to send emails. You’ll appreciate it if you need to send several emails in one campaign or set up an A/B test, as you adjust it in one place and not inside multiple flow choices.

If you’re up for using wait steps in a nested program’s smart campaigns, check if there’s any logic that can influence people during this wait step.

  • Can a person trigger a transition campaign while waiting to receive an email? A person can move to the new stream with new content while also staying on a wait step in a previous program. To avoid that, make sure to add the Remove From Flow step and take them off the sending campaign before adding them into the new stream.
  • Do you use the Exhausted Content = true filter to move people to the next stream? A person is marked with Exhausted Content as soon as they enter the smart campaign, so it doesn’t mean they have already received the email — they might be still in a wait step while being added to another stream. It will result in sending two emails in a row and possibly bumping into communication limits. My solution was filtering people at each flow step with the custom Marketo field, indicating which part of the email nurturing the person receives at the moment — it has a nurturing track and stream name. I highly recommend creating one, it saved me millions of times!
screenshot of marketo current nurturing track field
Image source: Marketo

Email downtime solutions

There may be situations when you want to pause emails for people within the nurture or stop sending them altogether. For example, for the sales team to step in, or for people who became unmailable, for those who finished nurturing with or without achieving the desired status, etc. 

There are several solutions: 

  • You can change program status to Not in Program to remove them from the nurture.
  • You can temporarily pause people by changing their engagement cadence to Paused
  • Or you can use what I call placeholder streams for either of those use cases — a vacant stream, serving as a kind of isolated “waiting lounge” for chosen nurturing members.

I strongly recommend considering this approach, and here’s why:

  • You’ll have a clear view of the funnel inside your engagement program. In the Summary view -> Member by Stream toggle board, you’ll see the number of people in placeholder streams — how many people are unmailable, how many people finished nurturing, how many converted to any success criteria that you have, etc.
  • The change of the stream stays in the log history and can be used in further campaigns. 
    • For example, in campaigns where I bring people who’ve become mailable again back to the email streams from the Excluded From Email Communication placeholder stream, I utilize smart lists in flow steps. These smart lists use filters like Engagement Program Stream Changed; Previous Stream: XX; New Stream: YY to track where these individuals were in the communication process before their initial exclusion.
screenshot of marketo smart lists
Image source: Marketo
  • We can also use people from the placeholder stream as a target audience for external batch campaigns.

If you prefer to go with the engagement program cadence or program status change, take note on some of the limitations I faced while using these approaches.

There’s only one way to remove people from the engagement program: it’s to change their status to Not in Program. I recommend using it only to take off people who weren’t supposed to be added to the engagement program in the first place. In any case, keep in mind that removing a member from a program equals the loss of attribution.

As for Change the Engagement Program Cadence to Paused action, it works fine but I’ve still managed to run into a pitfall with it.

  • I discovered the first one when I built one smart campaign to manage cadences for several engagement programs. If you use the Change Engagement Program Cadence step, keep in mind that it won’t check if a person is part of the engagement program to place them on pause. It will simply add the person to the engagement program if they are not members yet, and only then pause them.
  • The second pitfall is that Paused cadence doesn’t stick to the exact stream, but to the whole engagement program.
    • The good news for me was a person won’t receive emails from any stream while paused. 
    • The not-so-good news was that these people slipped through other triggers without being unpaused. I even had to include Marketo support to investigate why emails weren’t sent to some of the stream members only to finally understand that they were paused even though it wasn’t the flow I’d expected.

Bonus segment: Prioritizing stream assets

After your engagement program is up and running for some time, you may come to a point when you’d like to change the assets order. First of all, keep in mind how stream cast works. With each cast, Marketo goes down from the top asset in stream, checking for the first asset that person didn’t receive yet.

For me, that time came when I was striving to improve the conversion to open metric. During one round of nurturing optimization, I followed an assumption that if I move best-performing assets to the top of the stream, it’ll help people move through lifecycle stages faster via improving conversion to open. In the case of nested emails, I knew that Marketo would be checking for new email IDs starting from the top of the stream. But, as you already know, I prefer using nested programs and things get a bit trickier with them.

I’ve studied Marketo documentation on the matter and came to the conclusion that if a person was once a member of a nested program, they won’t receive duplicate content. But my nested programs were serving an operational function and weren’t assigning any statuses to the people from their sending campaigns. The smart list with the Member of Program filter showed zero people. That’s why I was exceedingly cautious and experimented first. Here’s what I’ve found while looking at the logs of people who’ve been part of my experiment.

Experiment 1: I’ve archived the current program and moved an email to a newly created one, relying on the fact that the person won’t be sent the email with the same ID twice. Say I have the following sequence: 

  • Touch 1: Blog email 
  • Touch 2: eBook email
  • Touch 3: Webinar email
  • Touch 4: Customer story email
screenshot of marketo moving assets inside stream
Image source: Marketo

I want the webinar email to be the first touch, so I host it under a new program and archive the old one.

What do I see in a person’s logs after such an update? Let’s look at the people who’ve gone through the first three touches by the time of an update.

Instead of proceeding to the next nested program placed in the stream (Touch 4: Customer story email), they become members of Touch 1: Webinar email [New] program at the next cast. They enter the sending campaign but skip the email sending, as they’ve already been sent the email with this ID before. No harm, just a stream cast spent without sending an email. 

As I needed to shuffle a lot of content inside the stream, it would mean a few weeks without emails for some people. This interferes with the initial idea to speed up moving people to the next lifecycle stage, so I’ve rejected this method.

Experiment 2: I did the same rotation, this time moving an existing nested program with all its content. Even though I hadn’t found any signs of membership being explicitly tracked in my programs, every person went to a sequential nested program and received a next-in-line email during the next cast. People who’ve gone through the first three touches by the time of an update receive Touch 4: Customer story email. That was exactly how I'd pictured the desired outcome. 

For those who wonder if the content shuffle gave the expected result: it did! The sequence update contributed to an 18% increase in the conversion-to-open rate, surpassing the initially planned increase of 3%.

Hypercare stage

Most of the cases above were found during the monitoring phase, and here’s what helped me find them.

Volume of people going through your transition campaigns

You probably have an idea of baseline numbers for each stage of your nurturing process. For some campaigns, it’s acceptable to have zero members for a few days, while others should manage a substantial daily volume. If the numbers seem off, it’s time to inspect your campaign’s smart list for errors and review the logs for those who aren’t supposed to appear in this transition, or those who you expected to see but aren’t there.

Random check of people enrolling in transition campaigns

This was an integral part of my hypercare flow after the launch: randomly check the logs of a few people enrolled in campaigns for a week or two post-launch. It might have felt like looking for a needle in a haystack but, in reality, early inconsistencies didn’t take too long to surface.

Monitoring lists and alerts

These are great examples of hypercare after you’ve fixed a flaw in your nurturing architecture. Ideas for some were obvious during the pre-launch preparation: take, for instance, a triggered campaign that sends an alert when someone from my nurturing receives a different marketing email. 

In my case, only after the first monitoring stage was completed and I had identified possible issues was I able to build a comprehensive system of smart list, trigger campaigns with lists and alerts for nurturing health checks. Here’s one that emerged during log checks: I created a smart list to track people who are members of more than one engagement program simultaneously. Despite my nurturing system hosting five engagement programs, this detail initially slipped through the cracks.

Some of these items were archived after confirming that all potential scenarios were covered by the fix, while others are still on and became a part of my routine monthly “nurturing health check.” The key takeaway is to always allocate time to ensure that the logic you’ve crafted still functions as you intended.


I hope you’ve picked up a tip or two from my experience to use in your engagement programs. What can I say to summarize it? You can’t forecast everything and the only way to master engagement programs is to try different ways, test, uncover your unique cases of unexpected turns and errors, improve, and then test again. 

And if something didn’t go as expected, use it as a chance to learn a new way around and share your new knowledge with the email teams world!