A Salesforce Administrator’s Guide to Campaign Setup

Salesforce Administrator's Guide to Campaign Setup Playbook

How to set up your Salesforce campaigns for maximum reporting visibility

Welcome to our Salesforce campaign setup guide! While there are many ways to accomplish anything in Salesforce, we’ve made these recommendations based on many years of experience and our knowledge of how attribution solutions process data. We also have some core principles that we’ll tell you about now.

Table of Contents

What’s getting in the way of easily seeing campaign results?

Salesforce quirks

People think of Salesforce as a sales tool, a “single source of truth,” and a necessary tool for effectively running their businesses.

Salesforce is a relational database with a robust user interface slapped on top. It’s also in the CRM company’s best interest to limit the processing power necessary to support every instance. Because of this:

  • Salesforce limits what kind of automation can run natively in the CRM app out-of-the-box
  • Salesforce limits how you can join information in their reporting tool

Because of these limitations, it’s not the best “source of truth” if you need to combine different data sources and effectively report on them.

These facts often complicate how we implement campaign data in Salesforce and limit what we can expect from our out-of-the-box attribution reports. It also makes it critical to keep the data as simple as possible – because it’s already fundamentally complicated.

A few other quirks also complicate how we approach campaign data:

  • Campaign members – the object that joins a campaign with those who interacted with it – is not linked to an account
  • Lead data is not linked to an account
  • Contact and lead data can’t be viewed in a single report
  • To see campaign efforts represented in Campaign Influence reporting, sales must make a conscious decision to link contacts to the Opportunity Contact Role object (or admins must figure out automation)
  • Salesforce doesn’t like parent-child relationships (especially multiple layers deep)
  • Salesforce doesn’t like complex relationships across objects or honor showing links through several joined objects in reports

If we were to look at a visual representation of how campaign information works, it looks like this:

Campaign information works

Whereas the CEO and sales team use CRM data like this:

CEO and sales team use CRM

 

Marketing needs its efforts linked to opportunity data because the CFO and CEO think exclusively about how much and how efficiently revenue is being generated. As time goes on, the buyer committee keeps expanding for complex sales. And yet, many things need to go right to link an opportunity to a campaign, including extra data entry by sales (we all know how much they appreciate data entry).

Finally, marketing automation tool data and CRM data look nothing alike, which we’ll get into next.

Marketing automation quirks

Marketing thinks of the world through the lens of thousands of individuals interacting with many different tactics. Unfortunately, marketing systems (including marketing automation systems) are not constructed with a single data schema in mind, and they certainly aren’t focused on catering to the B2B sales view of the world.

Automation Gaps

Marketo does not inherently have the concept of an account and opportunity.

If you’re an SFDC admin without marketing ops experience, I’ll give you a minute to pick your jaw up off the ground. It’s a normal reaction by CRM admins who have never worked directly with marketing automation.

Eloqua is the same way.

Pausing again….

Pardot is a little sketchy here too. Very sketchy, actually. It has a concept of Prospects, but those could be leads or contacts that you should keep or opportunity-related reports in your CRM.

The lack of an account or ability to mirror what the CRM does automatically is why it’s extremely common for marketing teams to inaccurately report too much pipeline or too many bookings. The only way to get account information back into their marketing automation system is usually by adding fields on the person record where account and opportunity info can be stored. They rarely go to the time and expense of setting up custom objects and data workstreams.

HubSpot does have the concept of an account (the company), but it’s an automated construct with almost no flexibility. For example, if you have a bunch of contacts from IBM companies around the world, you will have an automatically created IBM account with a bunch of contacts on it. If you want to represent the divisions, regions, subsidiaries, etc. of a complex account; too bad!

HubSpot is straightforward and not very flexible. It’s great for a lot of things, including marketing automation. It has its drawbacks. Like not allowing any flexibility without a lot of heartburn.

When you’re pushing campaign activity back into your CRM, each marketing automation system works differently.

Campaign Activity

Pardot will allow you to determine the campaign and status for a single automation. But it won’t let you send a single form to different campaigns, push custom field data (like UTM parameters) to the campaign member object, or get fancy with member statuses without adding lists and additional automation.

Marketo is very robust in terms of allowing branch logic. You can add custom data to your contact records, use different campaigns in a single workflow, and determine your member status based on logic. It will also give you some flexibility on order of operations, and if you have a skilled admin, it’s very powerful (but difficult to use).

Eloqua is similar in many ways to Marketo but allows less flexibility with transporting data to your CRM and the order of operations.

HubSpot allows complex logic and has a straightforward connection with Salesforce that usually works as expected. Although you may need a tool like Zapier to ensure everything is working perfectly at times.

This is all to say that when you’re working with your marketing automation administrator, you may get answers that surprise you and they’re probably correct, even if it doesn’t make sense in the world of CRMs.

UTM tracking is #complicated

UTM tracking is important. UTM parameters are a type of formula string that’s passed in a URL when someone clicks on a carefully crafted link (that marketers use in a social media ad or other form of marketing, paid or not) and then fills out a form on that page.

If you don’t have a persistent UTM tracking code installed on the website, the UTM parameters disappear as soon as that person clicks on another page. Without this code, the UTM parameters are only captured on the page connected to the ad.

The other complicating factors are data privacy practices, ad blockers, and reluctance to click on ads – because people are wise enough to know that clicking on an ad means you’re probably going to be tracked.

Marketers spend a lot of money on paid advertising. They’re under a ton of pressure to prove that what they spend their budget on is effective. A lot of things need to fall into place for UTM parameters to be captured.

While how marketing should use UTM parameters is out of the scope of this document, we will tell you how to best capture the data and report on it. We recommend that your marketing team research their options and get some education to set expectations on what is and is not possible with today’s legal requirements, privacy-first design trends, and technical limitations of their marketing automation technology.

Data management rules to live by

Whether you want to run reports in your CRM, export them into a database, or use a high-quality attribution solution, there are simple rules to follow to make analysis easier.

  • Standardizing and recording data in standard fields (like picklists) is a much easier way to summarize data than a parent-child relationship
  • Multi-tiered parent-child relationships will severely limit your ability to summarize data in your CRM
  • Being more descriptive is always better than being less descriptive – if you can reliably capture the information
  • Make data capture too complicated, and your end users will revolt
  • Always consider automating data capture where there’s a standard pattern
  • Raw text is always more difficult to analyze than standardized data sets

Challenges to Clear Data

As a team with a lot of consulting experience in addition to working with the clients we serve, we’ve seen the following hinder getting clear insights back out of the data:

  • Using parent-child campaign relationships to track audience, initiative, theme, industry, or some other variable – custom picklists are great for this!
  • Creating child campaigns for every UTM possibility related to a CTA
  • Neglecting to think through responses and campaign members

If you set up your Salesforce campaign framework (or improve the one you have in place), your ability to get more out of your database, visualization tools, and even your CRM will improve dramatically!

What’s out of scope?

There are many configuration steps that can help with lead lifecycle tracking, internal processes, and return-on-investment analysis, but we can’t get to them in a single document.

We will not be covering:

  • “Lead” lifecycle processing & stage measurement
  • Automated lead-to-account matching and lead conversions
  • HubSpot campaign setup and Lifecycle processing
  • Lead feedback and clawback mechanisms
  • How to use UTM parameters
  • Opportunity contact role automation
  • Setting up out-of-the-box attribution (first-touch, last-touch, and campaign influence) in Salesforce

If this guide is useful and you see content in the list above you would appreciate more information on, please let us know so we can create more!

A final note on campaign results

Nothing is set in stone. Your organization will mature over time, and you must re-evaluate your choices. However, we’re confident that following this guide will result in a better chance of maximizing the value you receive from any attribution tool and set you up for maximum coverage in your CRM.

Campaign Basics

The marketer’s view

Every single touchpoint matters to someone on your marketing team. Whether it’s a website page visit or a person asking for a sales meeting, each and every interaction will be worth tracking.

The rest of the business doesn’t think this way, and it will require some tact and education to help the marketing team understand that different audiences will care about different data. It doesn’t mean the things we don’t report on for attribution purposes are unimportant. They simply need to be reported on in a different way.

You also need to know that the labels your CRM uses and the language your marketers use are very different.

In marketing, a “channel” is any tactic marketers use to attract a target audience. Usually, a given campaign leverages multiple channels, and they’re all interconnected.

For example, a tradeshow.

You’re not just focused on the tradeshow itself as a marketer. It looks more like this:

Marketers view graphic

 

You will need to educate the marketing team about how the executive team and your CRM “think” about campaigns and related data. You’ll also need to explain why specific tactics will be reported on in custom fields (more on that later) on the campaign member level versus campaigns, why campaign names are just as much about informing sales why they’re following up on an action, and why certain interactions will be assigned dollar amounts while others are not.

We’ll help you along the way and have a section on enablement at the end of this guide. Education and communication are the two most important factors in successfully implementing anything in any system.

The broader view

One of the most important takeaways from this guide is the following:
Always prioritize what is useful to the end user over what is convenient for the admin or marketer.

Campaigns should be just as much about communicating to sales why someone is deemed a “hot” lead they should follow up on. Sales must know why they’re calling someone – they often use it in their initial email or call!

If we prioritize capturing actions that are important to marketing (paid advertising is an excellent example), we won’t communicate to sales what matters most to them (that they filled out a contact us form).

Using this same logic, how we use campaign member responses (a great mechanism for triggering sales to follow up on something) must correlate to what sales also sees as a meaningful action. You can (and should) track touchpoints that won’t necessitate sales outreach. But you must remember that the campaign member status and whether it’s a response should always correlate to an action that would warrant sales outreach (a “hand raise” like a contact us form, chat meeting request, in-person meeting at a tradeshow, etc.).

Campaigns will be used with the following in mind:

  • Campaigns are meant to track meaningful interactions marketing generates first.
  • Campaigns will capture the CTA or WHAT the person does with the brand.
  • We will use campaign members to help describe, in more detail, what action a person takes.
  • Campaigns need a name that is easy for sales to interpret.
  • Campaign members will be used to capture UTM data or which channel a campaign comes through.
  • Data is easier to analyze when it’s flat – parent campaigns should be used on an extremely limited basis.
  • Tracking spend data will always be complicated without direct integrations and more complex tooling in place.

This is how the data will be mapped in your CRM:

campaign broader view graphic

Always make campaign statuses and responses a cross-functional project

Campaign responses are a great trigger for a lead or contact to be flagged for follow-up, but there needs to be an agreement between sales and marketing around what is worthy of follow-up. The two teams will always have very different opinions – and they will change over time. It will be operations’ job to act as the mediator and continually refine what should be considered a response and what isn’t.

Using the data structure we recommend plus lifecycle stage tracking, you should be able to analyze the conversion rate from marketing-qualified lead to sales-qualified opportunity by campaign type. This should guide your conversation and allow you to “myth bust” when opinions form.

Campaign configuration & maintenance

Now that you know how different departments think about these objects and how Salesforce links them to one another, we’ll get into the fun stuff. Configuration!

Campaign structure

Your mantra should be “flatter is better.” Salesforce will summarize one level of parent-child data. No more. When marketing or consultants propose creating parent-child relationships, always challenge them and look for ways to standardize the information into a short picklist instead.

For example, instead of:

1. Industry (Top Campaign Parent)

2. Audience (Campaign Parent Level 2)

3. What they’re doing (the CTA) (Campaign Parent Level 3)

4. UTM Option (Campaign Level 4 – Child)

A. Campaign Member

Do this:

1. What they’re doing (CTA) (Campaign)

1.a. Campaign custom fields: Industry, Audience

a. Campaign Member

a.2. Campaign Member custom fields: UTM Parameter fields

By following this data structure, you can report on Industry results, Audience results, and UTM results without losing data due to too many parent-child relationships.

Campaign Type

This Campaign Type list may make your marketing team nervous. That’s why it will be necessary to convince them that UTM data and the “missing” channels will still be something they can analyze–they’ll just be located on the campaign members themselves.

Recommended campaign types and when to use them

Marketing Types

Campaign Type
When to use it
Gated Content
Used for gated pieces, thought leadership, or any download that promises a worksheet/template/value exchange for personal information. Your company hosts these pieces.
Chat
This is used to capture form fills captured through a chat bot, such as demo requests, solutions page questions, etc.
Content Syndication
When content (e.g. a webinar, an article, a video) is hosted on a third-party platform or publisher that caters to your target audience. This can look like an email blast by a different vendor promoting a piece of content, a webinar hosting platform that passes you user information when people view your content, etc.
Direct Mail
If you send physical assets or gift cards as part of a marketing program, they should be bundled under this category.
Email
This should be used to capture marketing (only) email interactions.
Form Fill
This is used for every form fill on your website outside of thought leadership or gated content, such as contact us, demo request, etc.
In-Person Event
These are for small regional events that are sponsored by your company. Such as a customer advisory board dinner, a meet-and-greet happy hour, etc.
Operational
A bucket to capture any operational campaigns like Pardot’s “Contact Create” auto-campaign.
Paid Search
This campaign type should only be used when you’re using a Google form or search form attached to an ad that is not on your website. For website forms, use “Form Fill” and capture UTM data on the campaign member level.
Paid Social
This campaign type should only be used when you’re using a lead generation form in the social platform. Any referrals should be caught through UTM reporting.
Tradeshow
Used for major conferences hosted by other companies/organizations. For example, the International Sales Enablement Conference would be a tradeshow. A dinner you hold offsite with a small group sponsored by your company would be a separate “In-Person Event” campaign type.
Webinar/Virtual Event
Used for online events where you have the ability to collect attendee information. Sometimes this is a sponsored community event, sometimes this is entirely hosted by your company.
Website Visit
Only used to capture key page visits (low funnel pages like a solutions page or demo video page) and is never treated as a response. The visitor does not expect to be contacted by sales.

Non-Marketing Types

Campaign Type
When to use it
BDR
In-house or outsourced BDR
Sales Outreach
Full cycle seller prospecting
Partner Referral
Referrals from partners

Standardize Campaign Type and Member Status Mapping

Member statuses are a great way to tell sales exactly what someone did to be on a campaign list. For example, if you’re at a tradeshow or conference, did the person scan a badge, talk to someone at the booth, or just show up on an attendee list you got from the organization running the show?

Default member statuses are not descriptive and more thought needs to go into whether they are a response.

A response should be “an action that would reasonably lead to a salesperson reaching out.” This should not include page visits, email clicks, etc. A response should trigger follow-up from sales, and that follow-up should be prompt to maximize the lead’s chance of converting into an opportunity. Research shows that the further leads get from a 5-minute follow-up, the more drastically your chances of conversion fall.

Your teams will need to meet (yes – both marketing and sales) and decide on what qualifies as a response, but this is a recommended starting point.

Note: It’s common for people to try to track email invitations as part of an event or tradeshow. We don’t recommend this. Use a campaign with the Type field set to “Email” instead and track the activity as non-responses. A form fill or RSVP can and should be captured in the event or tradeshow campaign. On the other hand, UTM parameters should show that Email was the UTM medium.

Marketing Types

Campaign Type
Member Status
When to use it/Notes
Response?
Gated Content
Downloaded
Form fill or progressive form click to download.
True
Chat
Chat / No request
Someone types into the chat window but either doesn’t send or doesn’t request something meaningful.
False
Chat
Contact Request
Only if you don’t have routing automation, which we highly recommend.
True
Chat
Meeting Booked
True
Chat
Content Download
True
Content Syndication
Download
Not all lead sources are created equal. This tends to convert at less than 1% so gate unless it’s a demand for contact.
False
Content Syndication
View
False
Content Syndication
Form Submission
True
Direct Mail
Sent
False
Direct Mail
Received
True
Direct Mail
Failed
If the carrier can’t deliver.
False
Form Fill
Not Submitted
If you have fancy GA4 or other tracking you can tie to it via engagement. Otherwise, skip adding this in the system.
False
Form Fill
Submitted
True
In-Person Event
Registered
True
In-Person Event
Registered
True
In-Person Event
Attended
True
In-Person Event
No-Show
Will show up as responded when they register. But revert once they fail to attend.
False
False
Operational
Processed
False
Paid Search
Form Fill
Again, only use this type when you’re using an in-app lead gen form. Anything with a website landing page should be a Form Fill or Gated Content.
True
Paid Search
Non-Response
False
Paid Social
Form Fill
Again, only use this type when you’re using an in-app lead gen form. Anything with a website landing page should be a Webinar, Event, Form Fill or Gated Content.
True
Paid Social
Non-Response
False
Tradeshow
Attended
For full attendee lists from the venue/organization. Does not indicate intent for your brand.
False
Tradeshow
Badge Scan
Let your grade/fit determine whether this triggers sales follow-up instead of using member status variations.
True
Tradeshow
Swag Only
Badge scanners are pretty advanced now. If you give away swag as an incentive for a badge scan, consider asking if they’re just there for the swag.
False
Tradeshow
In-Booth Meeting
True
Webinar/Virtual Event
Registered
True
Webinar/Virtual Event
Attended
True
Webinar/Virtual Event
No-Show
False
Website Visit
Page Visit
False

Non-Marketing Types

Campaign Type
When to use it
BDR
Default settings
Sales Outreach
Default settings
Partner Referral
Default settings

UTM override fields – Custom fields on the campaign object

UTM override fields are helpful when forms or other landing page data (like chatbot flows) are specifically tied to a single paid advertising campaign. We rarely recommend landing pages unless the message is specific to an audience and the campaign is set to run for a particular period of time.

Note: These fields should never be used for a CTA that appears on multiple pages or can be accessed through normal navigation / SEO, such as a Contact Us CTA throughout the website.

Field Name: UTM Campaign ID
Field Type: Text/string
Help Text: If you enter anything in this field, it will overwrite any form-captured UTM data.
Field Purpose/Help Text: This should be populated when this is a paid campaign only.
Why we do this from a technical perspective: Including a unique ID that’s used by the source system will allow future attribution technology to map the spend data quickly and effectively.
Example expected value: 1a4452b3242c12355

Field Name: UTM Campaign Name
Field Type: Text/string
Help Text: If you enter anything in this field, it will overwrite any form-captured UTM data.
Field Purpose/Help Text: This is the campaign name as you’ve entered it in the paid advertising platform.
Example expected value: 2024.04 Partner Major Draw CTA

Field Name: UTM Campaign Medium
Field Type: Text/string
Help Text: If you enter anything in this field, it will overwrite any form-captured UTM data.
Field Purpose/Help Text: This is the mode or general method the campaign is leveraging.
Example expected value: paid-social

Field Name: UTM Campaign Source
Field Type: Text/string
Help Text: If you enter anything in this field, it will overwrite any form-captured UTM data.
Field Purpose/Help Text: This is the expected platform where the advertising is taking place.
Example expected value: linkedin

Should I also use Content, Term, and other UTM fields?

In your UTM strings? Yes! This will help you leverage in-app or GA4 conversions much more easily. In Salesforce? We have rarely seen people get to this level of detail. It’s not particularly useful outside of detailed campaign analysis done using early indicators when optimizing a campaign, which should be done in-app, in my opinion.

Contact & Lead Configuration

Why we push UTM parameters to leads and contacts

It’s easy to use Marketo or HubSpot to leverage logic to push people to different campaigns for the same form based on what kind of UTM parameters are associated with the form fill. However, prioritizing UTM-driven campaigns doesn’t make sense to your sales team. (Pardot doesn’t have a mechanism for this, so you must follow our advice.)

By pushing UTM data to the campaign member record from the Lead or Contact, you can report on your UTM data and showcase what sales cares about in your primary campaign information. Here’s why they will care more about the CTA or what the person is doing with your brand than the UTM parameter or how they found the page with the CTA.

Advertising and organic traffic do convert differently. However, the campaign type or the CTA has the largest correlation to whether or not they are likely to commit to a sale. For example, we all know demo requests convert better than gated content.

Because sales is interested in following up on the leads that are most likely to convert, they want to know what kind of CTA the person did so they can reference it in their follow-up and have a way to gauge whether or not the person is likely to engage with them.

Pushing UTM information to the campaign member level gives you a concrete record of how a channel is tied to a campaign (or multiple campaigns). It also allows you to keep a running, complete (as best as we can with cookie data and multiple clicks) UTM data history rather than repeatedly overwriting the same fields.

If you use Marketo, we recommend this article by Andy Caron, which showcases a few options for writing over UTM data to campaign members.

Recommend lead and contact fields

Field Name: Last UTM Campaign ID
Field Type: Text/string
Field Purpose/Help Text: This should be populated when this is a paid campaign only.
Why we do this from a technical perspective: Including a unique ID the source system uses will allow future attribution technology to map the spend data quickly and effectively.
Example expected value: 1a4452b3242c12355

Field Name: Last UTM Campaign Name
Field Type: Text/string
Field Purpose/Help Text: This is the campaign name as you’ve entered it in the paid advertising platform.
Example expected value: 2024.04 Partner Major Draw CTA

Field Name: Last UTM Campaign Medium
Field Type: Text/string
Field Purpose/Help Text: This is the mode or general method the campaign is leveraging.
Example expected value: paid-social

Field Name: Last UTM Campaign Source
Field Type: Text/string
Field Purpose/Help Text: This is the expected platform where the advertising is taking place.
Example expected value: linkedin

I suggest we also add to both objects:

Field Name: COPY UTM Campaign ID
Field Type: Text/string
Field Purpose/Help Text: This should be populated when this is a paid campaign only.
Why we do this from a technical perspective: Including a unique ID that’s used by the source system will allow future attribution technology to map the spend data quickly and effectively.
Example expected value: 1a4452b3242c12355

Field Name: COPY UTM Campaign Name
Field Type: Text/string
Field Purpose/Help Text: This is the campaign name as you’ve entered it in the paid advertising platform.
Example expected value: 2024.04 Partner Major Draw CTA

Field Name: COPY UTM Campaign Medium
Field Type: Text/string
Field Purpose/Help Text: This is the mode or general method the campaign is leveraging.
Example expected value: paid-social

Field Name: COPY UTM Campaign Source
Field Type: Text/string
Field Purpose/Help Text: This is the expected platform where the advertising is taking place.
Example expected value: linkedin

We want to push the latest values to the “LATEST” field first and then use that to trigger a flow that:

  1. Updates the latest campaign member record created to have these LAST field values ONLY if those fields on the campaign member are already blank.
  2. Updates the field values on the lead/contact for COPY UTM field values so the system doesn’t continue to attempt to process the same flow.

For more instructions on setting up the automation, click here.

Should I also use Content, Term, and other UTM fields?
In your UTM strings? Yes! This will help you leverage in-app or GA4 conversions much more easily. In Salesforce? I have rarely seen people get to this level of detail. It’s not particularly useful outside of detailed campaign analysis done using early indicators when optimizing a campaign, which should be done in-app, in my opinion.

Campaign member configuration

The campaign member object can be extremely valuable when leveraged to its fullest. A campaign member combines who does the action with which campaign and then when and how they got there.

Why capture UTM data on the campaign member?

We’ve already covered why campaigns and UTM parameters should be considered separately and why this supports better alignment with Sales. However, this is such a critical concept that we’ll belabor it more.

UTM parameters are the “how” someone arrived at a campaign action and are applicable when using digital marketing to drive responses.

Storing this data on the Contact or Lead typically leads to either repeatedly overwriting the same fields and losing historical data or turning on field tracking history and struggling to make sense of contact and lead history reports. Capturing this information on the campaign member record lets you keep a running history of which ads drove specific campaign interactions.

It also lets you keep the campaign naming convention focused on the CTA, which sales cares about more than how they found the CTA.

UTM data will always be hit or miss, even if captured using first-party cookies (or your original marketing automation method). Ad blockers, GDPR cookie managers, and other tools make data capture problematic. The other issue is that without invasive monitoring, it’s difficult to track UTMs persistently or understand where someone who has clicked around your site originally came from.

Even with dedicated landing pages, there is no sure-fire way to capture advertising data when people click around and interact with unexpected pages. Our goal is directional accuracy with paid advertising and some amount of intuition and leading indicators (CPC, CPL, conversion rate) will always need to be used.

Recommended campaign member custom fields

Field Name: UTM Campaign ID
Field Type: Text/string
Field Purpose/Help Text: This should be populated when this is a paid campaign only.
Why we do this from a technical perspective: Including a unique ID that’s used by the source system will allow future attribution technology to map the spend data quickly and effectively.
Example expected value: 1a4452b3242c12355

Field Name: UTM Campaign Name
Field Type: Text/string
Field Purpose/Help Text: This is the campaign name as you’ve entered it in the paid advertising platform.
Example expected value: 2024.04 Partner Major Draw CTA

Field Name: UTM Campaign Medium
Field Type: Text/string
Field Purpose/Help Text: This is the mode or general method the campaign is leveraging.
Example expected value: paid-social

Field Name: UTM Campaign Source
Field Type: Text/string
Field Purpose/Help Text: This is the expected platform where the advertising is taking place.
Example expected value: linkedin

Should I also use Content, Term, and other UTM fields?
In your UTM strings? Yes! This will help you leverage in-app or GA4 conversions much more easily. In Salesforce? We have rarely seen people get to this level of detail. It’s not particularly useful outside of detailed campaign analysis done using early indicators when optimizing a campaign, which can be done in the original app the ads were generated in.

Flows – Automation configuration

Automatically create Campaign Member Status records for new Campaigns

In plain English, the purpose of this flow is to automate Member Status creation when a campaign is created.

We could coach marketers to clone existing campaigns and achieve a similar outcome. But this approach is problematic. When a new person joins the team, or someone forgets to clone an existing campaign, your member status data is immediately out of alignment with the ideal.

Other alternatives to creating a flow include free Salesforce plug-ins to help you automate member status creation by Campaign Type.

The Flow

Begin the flow with a Record Created trigger with object equals Campaign. Add a Branch logic element that creates a branch for each known Campaign Type picklist value and an “Other” for default.

Note: When new Campaign Types values are created, they will go down the “other” track unless you remember to update the flow. Adding some notes in the Campaign Type field description may help you remember to update this flow.

Other Note: The default Member Status records auto-generated when a campaign is created will still be associated with the Campaign. However, when you set a Member Status record to the new Default, it will uncheck the normal “Default” Member Status and respect your setting.

For all branches except “other,” you will create an Assignment rule and a record for each Campaign Member Status. Each Campaign Member Status should include the Campaign ID that triggered the flow, the name of the Campaign Member Status, whether or not the member status is Responded, and whether or not the status is the new default (keep in mind there should only be one, and we would recommend a Non-Response status be the default).

Once a Campaign Member Status record is created, you want to add it immediately to the collection. Once you’re finished adding the Campaign Member Status records (you should have one per Campaign Member Status related to the Campaign Type), you’ll go to the next step and Create Records of the object Campaign Member Status.

The Other branch is the exception. You will not add Campaign Member Status records and keep the default values as-is. The Other branch will exit.

Note: Campaign records will only have one Campaign Type. This is a single-select picklist.

Here’s an illustration of the logic steps, which will not directly mirror your Salesforce flow visual:

 

The flow graphic

Three automations to copy UTM values

Automation 1: Copy UTM data from Contact to Campaign Member

In plain English, this flow aims to push the UTM data transferred from your marketing automation system to your Salesforce Contact record to the most recent Campaign Member.

Create a flow with a trigger of Record Update where the object is Contact. On trigger, you’ll want to add conditions. If any of the following is true, then the criteria to continue in the flow are met.

1 Last UTM Source Is Changed Is True
2 Last UTM Medium Is Changed Is True
3 Last UTM Source Is Changed Is True
4 Last UTM Campaign Name Is Changed Is True
5 Last UTM Campaign ID Is Changed Is True

Next, add a Decision element. This element will need to check whether all of the Last UTM fields are the same as their corresponding COPY UTM field on the Contact record that triggered the flow. If all COPY field values equal the correlating Last UTM field value, they should enter a branch that immediately exits. If any of the corresponding fields do not match, the flow should move to the next element.

The next element is a Get Record element where object is Campaign Member.

  • Campaign Member Contact ID = Record ID
  • Campaign Member Last Updated Date = TODAY()
  • Sort Descending by Create Date
  • Check Only the first record (radial dial)

The next element should be a Decision that simply checks whether or not a Campaign Member was returned. If not, it should go to the Final Step in the Flow. If there is a Campaign Member, go to the next element.

The next element is a Decision element that has four branches. The first branch is for Campaign Member records that already have UTM values. The second is for records that have Null UTM fields on the Campaign Member and Non-Null UTM Fields on the Campaign record related to the Campaign Member looked up earlier. The third branch is for records with Null UTM fields on the Campaign Member and Null UTM fields on the Campaign. The fourth branch is for records where the prior logic does not apply.

The actions that should take place for the branches are as follows:

  1. Go to Final Step.
  2. Update Triggered Record
    • Specify conditions to identify the record as Campaign Member ID = ID from your Lookup step in the Flow
    • Set Field Campaign Member UTM field values to Campaign UTM field values
  3. Update Triggered Record
    • Specify conditions to identify the record as Campaign Member ID = ID from your Lookup step in the Flow
    • Set Field Campaign Member UTM field values to Contact UTM field values
  4. Go to Final Step

The Final Step is an Update Triggered Record element that writes the Contact’s Last UTM field values to the same Contact record’s COPY UTM field values.

Here’s an illustration of the logic steps, which will not directly mirror your Salesforce flow visual:

initial automation graphic

 

Automation 2: Form Fill data from Lead to Campaign Member

We’re going to create the same flow for the Lead object.

Create a flow with a trigger of Record Update where the object is Lead. On trigger, you’ll want to add conditions. If any of the following is true, then the criteria to continue in the flow are met.

1 Last UTM Source Is Changed Is True
2 Last UTM Medium Is Changed Is True
3 Last UTM Source Is Changed Is True
4 Last UTM Campaign Name Is Changed Is True
5 Last UTM Campaign ID Is Changed Is True

Next, add a Decision element. This element will need to check whether all of the Last UTM fields are the same as their corresponding COPY UTM field on the Lead record that triggered the flow. If they are all the same, they should enter a branch that would immediately exit. If any of the corresponding fields do not match, the flow should move to the next element.

The next element is a Get Record element where object is Campaign Member.

  • Campaign Member Lead ID = Record ID
  • Campaign Member Last Updated Date = TODAY()
  • Sort Descending by Create Date
  • Check Only the first record (radial dial)

The next element should be a Decision that simply checks whether or not a Campaign Member was returned. If not, it should go to the Final Step in the Flow. If there is a Campaign Member, go to the next element.

The next element is a Decision element that has four branches. The first branch is for Campaign Member records that already have UTM values. The second is for records that have Null UTM fields on the Campaign Member and Non-Null UTM Fields on the Campaign record related to the Campaign Member looked up earlier. The third branch is for records with Null UTM fields on the Campaign Member and Null UTM fields on the Campaign. The fourth branch is for records where the prior logic does not apply.

The actions that should take place for the branches are as follows:

5. Go to Final Step.
6. Update Triggered Record

    • Specify conditions to identify the record as Campaign Member ID = ID from your Lookup step in the Flow
    • Set Field Campaign Member UTM field values to Campaign UTM field values

7. Update Triggered Record

    • Specify conditions to identify the record as Campaign Member ID = ID from your Lookup step in the Flow
    • Set Field Campaign Member UTM field values to Lead UTM field values

8. Go to Final Step

The Final Step is an Update Triggered Record element that writes the Lead’s Last UTM field values to the same Lead record’s COPY UTM field values.

Here’s an illustration of the logic steps, which will not directly mirror your Salesforce flow visual:

 

secondary automation graphic

Automation 3: Default campaign UTM data to campaign members

In plain English, we’ll check for default UTM field values on the Campaign every time a Campaign Member is created. If default values are populated on the Campaign (in the UTM Source, UTM Medium, UTM Campaign Name, and UTM Campaign ID fields), we will write them to the corresponding Campaign Member UTM fields of the same name.

Create a flow that’s triggered by Record Creation of object Campaign Member.

Add a Decision element that checks whether any of the Campaign UTM field values are not blank. Exit the flow for the branch that is blank. Create an Update Triggered Record element for the branch with at least one Campaign UTM field populated.

The Update Triggered Record element should copy the values in the Campaign UTM fields and write them to the corresponding Campaign Member fields. Once this is done, it should exit the flow.

 

Automation graphic

Opportunity configuration must-dos

Gate Opportunity Creation from Contact/Lead Conversion

Now that you have your campaign automation in place and the data in a much flatter, better spot, it’s time to ensure that the Sales team is doing their part to give you the best chance of getting at least single-touch attribution working out of the box.

Campaign data (except for Account Campaigns, which are not recommended for marketing campaigns covered in this document) does not have a link to the Account object through the Campaign Member. That means we rely on Sales to tell us which Contacts are associated with an Opportunity before assuming any association with Campaign activity.

This means if your system is not configured to force Opportunity creation at the Contact record or on Lead Conversion (which automatically associates a person as a Primary Contact on the opportunity).

Remove the “Create” button from your Account pages

Remove the “Create” button in the Opportunity Related List on your account page layouts and make sure the button is not accessible in any app settings.

Remove the “Create” button from your Opportunity tab

Remove the New button from the Opportunity tab in any of your apps.

Opportunity tab

 

This is a bit painful to find but can be done. You’ll want to remove the option from the Search Layout in your Setup section of Salesforce under App Setup -> Customize -> Opportunities. There are also some great YouTube tutorials for Salesforce Classic and Lightning.

Validation Rule on Opportunity Create of Type New Business

This validation rule should never be triggered if you’ve configured things correctly. This is a catch-all to help end users tell you when you haven’t hidden all the many ways an opportunity can be created without a Primary Contact.

The logic should fire if the Opportunity Type correlates to your New Business type and the Primary Contact field is blank.

The message should read: “Oops! Please contact your admin and tell them you found a new way to create opps.”

Something to consider: Opportunity Contact Role Automation

If you have call analytics through programs like Gong.io, consider using the data to automatically relate contact records to the Opportunity Contact Role. There are some fantastic tutorials and articles on YouTube that can help support you on this journey.

We hope these configuration steps help your team understand how systems process campaign data and set you up for more streamlined reporting.