MARDREAMIN’ SUMMIT 2025
MAY 7-8, 2025 IN ATLANTA - GA

Days
Hours
Minutes
Seconds
🎉 The Event Is Live! 🎉

NOW PLAYING

View the session live or catch the replay here. You’ll find the recording and all related resources on this page once available.

Looking for the Chat?

Our live discussions are happening over in Slack. That’s where you can connect with speakers, join session threads, and chat with other attendees in real time.

Automating Campaign Management In Salesforce

We’ve all been there. The creative use of campaign member status, inconsistent campaign names, campaigns that have been “In Progress” for years, and missing actual costs in campaigns. Learn how they have automated the campaign management process using several cool tools (free) created by Sercante Labs and Salesforce Flow Builder.

Sercante

Mike

Morris

Senior Engagement Manager

Keep The Momentum Going

Salesforce Live Fireside Chat REPLAY

Video Transcript

Speaker 0: And I think we’re live. Hello, everyone, and welcome to the final day, day three of MarDreamin. Hope you guys have been been enjoying the event so far. My name is Lauren. I’ll be moderating today’s session. Um, before I introduce our speaker, just a couple things. Um, if you want to change your track, there is the option to do so at the bottom left hand corner, um, or hit the agenda tab at the top. Um, yes. All sessions are recorded, and they will be sent out, um, after the event is over. Um, and if you have questions, please pop them on the right in the q and a section, and we will get to those at the end if we have time. Um, and now I’d like to introduce our speaker today, the one and only Mike Morris. Mike, the floor is yours.

Speaker 1: Alright. Thank you. Thank you, everyone, for joining us today. And, again, thanks for, again, for joining us at, uh, Mark Green. Today, we’re gonna talk about automating campaign management in Salesforce. Um, this to me is one of the coolest things you can do. It’s so from a marketing perspective, there’s so many things we have to do in managing campaigns, activating, and naming conventions, and all those things. And we’re gonna talk through today how we can just automate all those processes and make our lives a lot easier. So I’m really excited to share this with you. Um, about myself, I am Mike Morris. I work with Sercante. I’ve been in this business with them for about four years. Prior to that, I spent about twenty years in marketing. So I have a a, uh, I guess, a a real empathy for what the marketing folks go through. So, um, that’s why I’m excited about making lives easier for those folks. Before we get started, um, I wanted to, again, thank our sponsors. DemoJam was awesome today. I hope you were all able to join. Um, if you weren’t able to join the DemoJam, um, click that sponsors tab and go check out some of these sponsors. They have some great solutions and great tools. And, uh, I know I I I got a lot of today’s demo jams. I hope you did as well. So today, we’re gonna talk through a quick review of Salesforce campaigns in the event you’re not currently using those or, you know, just so you can know what where they are, some common challenges that come from Salesforce campaigns, and how we can use automation to create perfect campaigns every time. Um, as we’re talking, feel free to pop it up in the chat there, oohs and ahs, and when stuff starts working. I like seeing that you’re all there and engaged. Um, it’s kinda weird when you can’t see people when you’re presenting, so feel free to pop stuff in that chat box so I or questions as we’re going along.

Speaker 1: So first off, what is a campaign in Salesforce? Well, it’s a super powerful object. Um, they really are super underutilized. It’s amazing how many clients I work with that aren’t using campaigns, aren’t using campaigns effectively. Um, you can really think of campaigns as initiatives, and you can even track anything in sales besides Salesforce that impacts sales revenue. Um, accounts, contacts, leads can all be added as campaign members. Campaigns can be later later auto b associated opportunities, so it completes your, um, ROI tracking. One person or lead or contact can get multiple campaigns. And, again, the real key here is having campaigns allows a marketer to show the ROI of their efforts. So if you’re not using campaigns in your marketing, um, you need to start using campaigns immediately. So what are they good for? They’re also good for creating call down list for sales, creating target list for marketing, um, tracking how your initiatives are working. So are your emails getting clicks? Are people completing your forms? Are people registering for your webinars? Or capturing lists from events, associations of sources. So if you go to a trade show, you can import those records into a campaign inside Salesforce so you can track the impact of that campaign of that initiative. And then tracking any initiative back to revenue.

Speaker 1: So sounds really good here. What so what’s the problem? You know, campaign sound great. What’s the problem here? Well, there are a couple issues I see with campaigns, and these aren’t necessarily with campaigns in Salesforce. They’re basically basically user user originated issues. So we have inconsistent campaign names. We have incomplete data. Um, the other campaign type is something I absolutely hate because it tells me nothing about what’s going on. So I refer to it as the dreaded other campaign type. We have failure to customize campaign member statuses, so they’re using the standard of the box responded and connect can and, uh, campaign statuses. And, uh, then you have other folks who go the other direction and get a little too creative when when, uh, updating campaign member statuses. We have improper use of the of the responded checkbox. We have people forgetting to activate campaigns by clicking the active box, so we can’t see them inside Pardot. Um, we have campaigns that are perpetually in the in progress stage, which, again, drives me crazy. And the final thing that really, um, impacts us from our ROI side is missing costs. So after campaign completes, marketers often forget to go back and actually add their actual cost in campaigns. So then we can’t get a true ROI because we don’t know what we actually spent. So we’re gonna address all these issues today.

Speaker 1: So let’s start with the first one. Um, you ever wish when you created a campaign in Salesforce, the name was automatically generated for you and was just perfect based on your naming conventions. So you don’t have to go back and say, how do I do this or refer back to a spreadsheet. Well, we can do that. So we’re gonna do that using, um, page layouts and Apex triggers. It’s gonna also address the first three items on our list that we’re gonna talk about that that we just looked at. So the first thing we need to do in automating our campaign name is really start with the naming convention. In this example here, I’m using, um, um, you know, year, month, a three digit type code, and a campaign description. The way I’m deriving these is my year year and month is actually being derived from the start date. So when I complete my campaign page layout and I choose my start date when I’m creating my campaign, it’s gonna be used to generate this date here. Also, when I’m creating my campaign, I’m choosing the type of campaign. This three digit code, this TSW, is gonna be generated based on the campaign type that I choose. And finally, the campaign, um, name here, the description, I have a custom field on my campaign page layout called short description, and this will be used to populate this data point. So pretty simple, um, but pretty effective.

Speaker 1: Now the mechanics behind this is an Apex trigger. Um, we’ll show this a little bit later inside Salesforce. Um, I’m not a developer, so a member of our team helps with this, um, trigger code. And, definitely, I’d recommend getting a developer involved in terms of the, uh, Apex triggers. But that’s what the the trigger looks like. Um, on the right here, this is my campaign page layout. Again, it’s a very simplified layout. The key here is the field that I need for my campaign creation are required. So you can see my short description is required. My type is required. My start date’s required. So those are the three elements I really need to create my campaign name, and all three are required. And as I’ve said before, you’re not gonna see others on my pick list here. Now the other thing I did within this within this, um, organization is my campaign pick list. Because I wanted that three digit code to show as opposed to the full, um, name of the type, I went back my to my pick list, and I customized my API names to be the short values. So, you know, my email is gonna show as EML inside my campaign name. Trade show is gonna show as TFW. So it’s important that you do that. Otherwise, you’ll have, uh, more data showing in your campaign name than you really wanted.

Speaker 1: The next thing we’re talking about are campaign member statuses. So, typically, you know, out of the box, you get responded and sent, um, which is fine, but they’re not customized. They don’t tell you the level of engagement that you’re had with your campaign. So I always advocate for customizing these. So I wanna know, did they click? Did they, um, attend the event? Were are they a hot lead? Did they visit my trade show booth? I wanna know exactly how they engaged with me. So I’ve really strongly advocate for customizing these campaign member statuses. However, some folks can get a little too carried away here and have inconsistencies. So in this example, one person might have registered for the status. One could have registered but not attended, and now you’re having multiple campaign member statuses in your system. You’re having to track which one is which. Um, also, the respond to checkbox, folks get confused with that sometimes and automatically check it for everything. So in this example, sent or sent is obviously not a responded status, so that shouldn’t be tracked. So if it is check checked, when you’re going back to your auto association rules and let Salesforce later for campaign attribution, if you are looking for responded statuses, this campaign member status would automatically get pulled in based on that checkbox, which is incorrect.

Speaker 1: So the solution really here is how do we standardize this, how do we automate it, how do we make it really easy for people to create the correct campaign member statuses with the correct respondent statuses. Um, if you’re at DemoJam this morning, you saw Sarcante Labs. Well, they have an app for this too. Um, this is another free app. It basically allows you to customize campaign member statuses based on type at the time of, um, campaign creation. And it also uses your, uh, pockets to responded checkbox for you. This is using Apex code again. Um, there is a code that could basically be used to automatically add the campaign member status back if somebody actually deletes it. So in this case, let’s say for, uh, an email, I have clicked as a campaign member status, and I want that as a protected status. If when the campaign is created, it’ll automatically generate that status. However, if a user deletes it, the optional Apex job will go back and add that campaign member status later. The other thing I like about the solution is you don’t have to, um, clone campaigns. Typically, I see a lot of folks, um, building campaign templates, you know, one for trade shows, one for webinars, and they’re asking users to go back and find that campaign and clone that one with related lists so they have the proper campaign member statuses. Well, that’s a great solution, but people can forget to do that pretty easy. And over time, your campaign your template library can get larger and larger. So I like this because it really just makes it super simple, and it doesn’t, um, require any additional thought. You just create a campaign, and it magically happens for you. And this will also address points four, five, and six on our list.

Speaker 1: So let’s take a quick look at this real fast. So this is using, um, custom metadata types inside Salesforce. If you’ve not used these before, it sounds a lot scarier than it really is. But, essentially, what I’m doing here is I’m just going into the custom metadata types, and I’m creating a label. So this is webinar attended. Um, it basically can tie back my webinar campaign, and I have my WBR, which is the short code I showed you from the API earlier. And I’m basically gonna say the status is attended, and it is responded. So what’ll happen now is when I’m creating my, um, custom metadata types, I’ll go through and create a status for each, um, status for a campaign type. So for a campaign for, uh, for a webinar, for example, I’ll have attended. I’ll have registered. I’ll also have reg attended on demand. So I’ll create this three times, three custom metadata types. And then when I create that campaign going forward, it’s gonna automatically generate those for me as my campaign member statuses.

Speaker 1: Alright. So we’ve knocked out the first, um, six items in our list. Let’s check out these last three. Now we’re gonna address these with the Salesforce flow. This, again, will be really cool. What it’s gonna do is gonna basically activate our campaigns for us. It’s going to change the the status once it’s complete, and it’s also gonna prompt users to act ask for our actual cost of campaigns. So, again, the flow is really pretty simple. What it is, it’s a it’s a record triggered flow with two scheduled paths off of it. What it’s gonna do immediately is update our our our status to true. It’s also going to, um, it’s gonna set active to true. I’m sorry. Then after the campaign ends, and I have this set at fourteen days, but you can do it however often you want. But a scheduled path would run. It would basically change your, um, active status to false. It would update the the rec the status to completed, and it would check to see if actual costs are actually been added to your campaign. If actual costs were added, the flow would end. No problem. You’re done. Now if costs are not detected, the third the second path will run later. It runs I am this one forty five days later. And, again, it just goes back and checks that cost was added. If it wasn’t added, it will send another email to the user prompting them to add their cost. So pretty cool, pretty simple, um, but it’s pretty effective.

Speaker 1: Now it’s the fun start part. Let’s look in let’s look at the stuff inside Salesforce because it’s much more fun doing it that way. So first off, I wanted to just create a campaign and just show you how this works. So I’m gonna go in and create a campaign here. Let’s just do this. You do have to put some data inside your campaign name because it requires it. So what I’ll do I mean, we’ll just call this mark agreement 22. I’m gonna put this type is a trade show, and my my it’s in progress. I’m gonna put my start date as today, our session date, and I’ll I’m gonna put our end date as, you know, I guess, Monday. It doesn’t really matter in this case. Now down here, my actual cost and campaign, I have a value I have to put. So I’m gonna put $50 in here just for example purposes. Now what’ll happen here is it’s gonna generate my campaign name, and you’ll see that I have my 2022, my, um, TSW pulled in from my type, Marjorie Mann ’22 pulled in from that short description field that I entered. So pretty cool stuff. We can also see my campaign member statuses have all been created for me, and they’re all proper with responded statuses. So, again, very, you know, very user friendly from the marketing perspective.

Speaker 1: Now what’s happening behind the scenes here, this is the, um, Apex trigger code that’s running. So, again, you can kinda see what this looks like here. You pull a developer in for development purposes. And then this is looking at the custom metadata types that we created earlier. Um, I’ll show you how this works. So what you’re doing here when you’re creating a new record, you’re just gonna go in and hit new. You’re going to, um, create the label. So in this case, let’s go back to one. So I’m on the same page here is what I’m doing. So we’ll do another one for, um, trade show. We’ll do, like, um, something different. So we’ll do so make sure I’m staying consistent with my labels. Trade show, um, warm. So I can pull my status in. This would be TSW for my trade show. See my status be warm, and I can set this as responded. I can also set my default status if I want at this time. I hit save. And now next time I create a campaign for a trade show, this campaign member status will be added as well. So pretty simple. Um, works pretty effectively.

Speaker 1: The other thing that we’re gonna look at a little bit is the flow itself. So here’s the flow. I actually did a modified version of the flow for this for this, um, example because I wanted to be able to show you the email that sends. So in this case here, this is a record triggered flow. It’s basically looking at, you know, when the campaign’s creation. So when the campaign is first created, the flow is actually triggering immediately. It’s gonna set my stat my active box to true. And, actually, I forgot to show that. But in my campaign here, you see that I did not activate my campaign when I created it. However, it’s showing an active state now, so it did activate it for me automatically. It’s also going to wait, um, on the scheduled path. It’s going to basically take additional actions. So here I have two scheduled paths. I changed my scheduled path for this example based on created date, and I set a one minute offset so I can show you how things work. In a typical campaign here, typical flow, you would set this to your campaign end date. Set your off date, your offset number to the number of days that you want to run, fifteen days, thirty days after your campaign, whatever, and then have it go proceed on the path. But, again, I did one minute in this example. Now what’ll happen when I refresh my campaign here in a few seconds, you’re gonna see my campaign status is gonna be, um, like, the active box would be unchecked. My, um, status would be changed to complete. And I’m gonna get, actually, an email on my other email boxes, which I can pull up as well here. I should have pulled that up original earlier. But when I hit refresh on this screen now, we will see that my campaign is no longer active. So it’s it’s done that. And the flow has also changed the status to completed. So that’s pretty cool. Um, I’m gonna pull up my other email box here on my other screen so I can show you this. Come on. Where are you? It’s not gonna let me. Well, it’s not letting me pull up my other email right now. Um, but what’ll happen too is it is generating an email back to me as well. And it’s the email itself is showing the campaign name. Let’s see. Maybe inside here. I put them down here just in case emergencies. So the email that comes to me basically looks like this. It basically shows you know, so it’s time like your campaign has the campaign name ended on the date. Actual campaign cost and campaign has not been provided. Um, we need this. And I actually provide a link back to the campaign so the user can easily click the link, go right back to the campaign that I’m referencing, add their actual cost in campaign, hit save, then they satisfy the requirement. So it’s a pretty cool way of getting it done. Now what’ll happen on the second path is if it’s gonna evaluate again. And, again, on this one, I I still have my second path, um, based on my start date because I wanted to show the demo again. But this would be your, um, end date again with a further offset, so forty five days perhaps. This path can go basically go back down and say, you know, has that cost been provided to me yet? If not, it’s gonna send that same email to the creator one more time as a second reminder to update their actual cost and campaign. Now you could choose to do the same email, or you could choose a different email if you’d like, kinda escalate it a little more. Um, in this case, I just need to just use a single email to make keep it easy, but but you do have the ability to customize that and go deeper if you need to. So that’s the real quick view of the solution here. Um, inside the deck itself, there are some additional, um, pictures of these demos. So, you know, if you’re doing this later, you’ll be able to see this too even if you’re not in a live environment. And, Lauren, I guess we’re I’m ready for some questions if we have any.

Speaker 0: Okay. Yeah. We definitely have questions, and thank you, Adam, for helping answer a bunch of them in the chat. Um, we’ll start kind of with some of the first ones. Um, do you have any recommendations for ROI, um, data for evergreen campaigns that don’t really have start and dates, for example, like ongoing paid search?

Speaker 1: On those, what I’ve done typically is I put them into quarterly buckets. So I’ll I know it’s an evergreen campaign, but if you’re doing your paid search with, um, or your search campaigns with organizations, you could put, um, costs in. Because you have you still have marketers’ times involved. You have your team time. You could still put them into a bucket, like a quarterly bucket and associate your internal costs. And at least that way, you can still track back against some costs. It’s email sometimes that falls in the same bucket. People will say email doesn’t have a hard cost to it, and I’d argue it does because you’re still paying your team to create that email. You’re paying your team to, um, develop the email, send the email, you know, paying copywriters, salaries. So in my eyes, everything has a cost. So even if it’s an internal cost, I would attribute that back to the campaign for ROI purposes.

Speaker 0: Perfect. Um, next question. When should we use the responded checkbox? It isn’t a little confusing.

Speaker 1: Yeah. No. That’s a great question. The responded checkbox should be used when the person engages with your campaign. So think about it this way. If you send an email to somebody, the act of receiving an email, the person did not respond to receive the email. So to me, that is not a responded status. Ascent is not a responded status. Um, open, you can argue, but I I’ll I’ll I I don’t generally consider opened. I don’t really track opens because of Apple privacy now. I don’t really look at it very much. But a click, for example, is definitely an action. The user took an action with your email. They responded. They clicked your email. They they, um, engaged with your marketing effort. That, to me, is a responded status. Um, trade show, for example. You know, if someone registers for a trade show and the trade show gives you the list of of pre registrants, that, to me, is not a responded status yet because they they registered for the trade show, but they didn’t come by your booth. They didn’t speak with you. But then coming to your booth, the act of getting their badge scanned by you, that’s responding. They they interacted with you. The act of speaking to your salesperson at your booth, that’s a responded status because they took the time to actually speak with you individually. So it’s it’s engagement is what it really boils down to.

Speaker 0: Makes Does

Speaker 1: that answer your question?

Speaker 0: But I’m gonna assume so. Let’s see if yep. Pardon what I said. Thank you. Next question. So the automation that you showed earlier, how do you deal with the campaign hierarchy within that?

Speaker 1: Well, the thing that’s really cool about this, by having a really solid naming convention, you can you can minimize your hierarchy. You don’t have to get as deep. Um, so that’s something else to keep in mind too. Because you’re having the trade show, uh, element brought into your campaign name, you don’t have to go quite as deep. If you do need to up use campaign names outside of this, if you wanna do different hierarchies or avoid the naming convention in general, you can use record types to offset and bypass the campaign naming process. So, for example, I have some clients who are using this process, but their sales campaigns run a little differently, and they wanna name them differently. So the way we have the campaign name automation set up is to run on marking record types only. So you you could have it run on parent campaigns differently if you needed to versus a child campaign.

Speaker 0: Nice. Okay. Next question. Can campaign name and character length be extended somehow?

Speaker 1: To my knowledge, 85 is the max you can do on those. Um, I’m not sure if anyone I know Adam’s in chat there. I’m not sure if Adam knows anything about that further. But to my knowledge, 85 is the there’s a limit. And that’s frankly why, um, let’s go back to that slide again. When I was actually creating my page layout for the campaign naming, that’s why I’m actually using a short description field here as opposed to the description field because the description field is a much longer box and people can add more data to it. By using the short description field, I could go back and calculate. Like, I know I have, you know, x number of character to four this with my date components. I know I have my three digit type code. So I can go back and calculate. In the example, I knew this could be a max of 60 characters. So when I created this custom field, I actually limited this to 60 characters so people couldn’t go over that limit. That’s that’s a great question and a and a great point, something I didn’t bring up. So I thank you for bringing that one up because that’s a that’s a great question.

Speaker 0: Yep. And Adam says it’s 80 is the max, um, for all name fields in Salesforce.

Speaker 1: I don’t think that I’m I was off by five.

Speaker 0: Those five characters, though, can sometimes make or break, uh, which you wanna be thinking, though. So, um, I know Adam kind of, I think, answered this one in the chat, but I’m gonna throw it to you as well. So we often create targeted contact reports in Salesforce and add them to campaigns so we can pull their records into a dynamic list for Pardot.

Speaker 1: Mhmm.

Speaker 0: When we add the contact to the campaign, we use the sent status, but this often doesn’t represent the true sent audience as not everyone exists in Pardot. Is there a better way to manage this?

Speaker 1: So when you’re when you’re creating campaigns inside Salesforce, ma’am, I’ll make sure I I’m understanding it. When they’re creating campaigns inside Salesforce, they’re adding people to the campaign as a sent status and then using that that as a dynamic list inside Pardot to actually send the list. Okay. Yep. So what you what you could do is you could instead of doing that way, if you could build your dynamic list in Pardot, it’s the very beginning. And then once your, um, email goes out, it’s sent, you could basically do the table action and add people back to a list and then use that to populate your campaign later. Um, I know it’s you can’t use an you can’t use a completion action on a on an email to to put a sent status in. You know, you can do that for the for the open for the clicks. You can’t use it for a sent status. So you do have to go back to a manual process on that, but it might be a bit more accurate if you use this Pardot reports on the backside and see who’s actually sent and then add those folks to your campaign first doing it from the Salesforce on the front side. It really depends on the level of accuracy you need and, frankly, the level of, you know, manual work you wanna do because either solution is not necessarily a a really good automated solution.

Speaker 0: Yeah. I mean, you can always use custom other custom statuses too. So, like, have it as, like, a base with something else and then pardot sent, um, stuff like that. So Yeah. That is it, I believe, for all the questions that have been submitted. So, overall, though, Mike, everyone is loving your presentation and thinks that every all these automations are super cool. I know I definitely learned some things, so thank you so much. You’re welcome. And if there’s no other questions, we can or no parting words, Mike, anything?

Speaker 1: I was gonna say since Adam’s in the audience here, Adam Adam’s the one who built a lot of this cool stuff, so, uh, props to Adam too and team. Yep. Well I’m

Speaker 0: just a user. Gotta give props to where it is. Okay. Everyone, uh, we can wrap a couple of minutes early. You can take a quick break before the next session, but enjoy the rest of the day.

Speaker 1: Alright. Well, thank you all. Thanks.