Screen Shot 2022-12-20 at 6.46.03 PM.png

How to Create a Matrix Scoring Model in Marketo Engage

Level 4 - Champion Level 4 - Champion
Level 4 - Champion

A matrix scoring model lets you cross-reference ideal customer profiles (ICPs) against engagement. Rather than qualifying leads based solely on engagement, a matrix scoring model allows you to divide and segment your audience with greater depth and decide who to surface to Sales, when to do so, and who to suppress from qualifying as MQLs. Crucially, you can measure and benchmark your lead groups against small sub-populations of your audience to better refine how you qualify or suppress leads.


Screen Shot 2022-12-20 at 6.46.03 PM.png


In this post, you’ll learn step-by-step how to build and use a matrix scoring model in Marketo Engage.

One key thing to note before getting into matrix scoring: If you build a program like this, you’ll need to be mindful when you turn it on of how many people you’re processing into the program at one time!


Obviously, the last thing you want to do is overload your SFDC sync or general system processing. This means you’ll also need to think about where you’re creating fields and what ACTUALLY needs to sync to SFDC (*hint, most of these fields shouldn’t sync). Depending on the size of your database, you’ll need to batch over time and ideally on weekends or, at a minimum, evenings. Start with very small groups to make sure everything is processing as intended. Then begin processing larger (but not system overloading) groups in whatever portion of your database will live in this model.


0. Your foundation

Before we build the model, we’ll cover some key definitions and points to prepare in advance. First, a look at the matrix when complete:


Here’s a rundown of the field categories we’ll work with:

  • ICP Grade: A gradation of how well our leads fit our ICPs; A being the most fitting down through to F. The asterisk allows us to track and measure MQLs where we’re missing the necessary information to make an accurate ICP gradation.
  • Engagement Score: We have five buckets of engagement; 1 being the most engaged, and 5 being the least.

This report shows us the total summation of people in the database who are scored at each level of engagement and ICP suitability (e.g. A1, A2, and so on). It represents the placement of our entire database within the defined ICP grades and engagement score buckets.


When considering who to MQL, A1 is a natural first choice. Though not as engaged, A2 heavily qualifies as the type of people your organization sells to or targets, so surfacing them early may be to your advantage. You might also choose to qualify the leads in B1 or C1, leaving behind the leads grouped D or F. For the asterisk group, qualifying the most engaged leads (i.e. 1 and 2) makes sense to pursue deals from those most interested. Over time, as you see what converts into opportunities and revenue, you can further refine the groups that you convert to MQLs.


Before we get into the technical wiring of the matrix, two crucial pieces need to be in place:

  1. Organizational alignment on the components that comprise your ICPs. In other words: do sales, marketing, and customer success agree that the elements identified accurately characterize the customers who buy to an ideal extent? I.e., large amounts, long commitment terms, etc.
  2. Complete data. As you pick the data points that contribute to the ranking of leads into ICP grades, consider whether or not you can gather complete data for the factors you identify as significant. When data completeness is low, a majority of people in your database will surface under the asterisk (ungraded) due to missing ICP information.


If you’ve accounted for both of these, you’re ready to start building the model.


01. Fields

First, layer in two data categories relevant to our ICPs:

  • Account Fit: How closely the company aligns with the type of organization to which you tend to sell. It is created as a collaboration between marketing and sales using 6sense data.
  • Persona: Job role and title.

With this data, the model can grade leads A-F based on their job title and company alignment. We construct this process by going to Field Management and creating a number of engagement and ICP fields:


You’ll need a score for each of the elements that will roll up into your ICP (“Score - ICP”), so this might look different depending on the amount of ICP elements you’re using. A few fields to call out:

  • ICP Grade: Allows us to designate letter gradation (A, B, C, etc.) without the additional numeric values.
  • Engagement: Composed of three elements—engagement score, 6sense Person intent, and 6sense Account intent.
  • Engagement Score: Combines data from 6sense Person, 6sense Account, and a rolling 45-Day Behavior score. The latter means that only recent engagement activities will impact the score.
  • Score: Our final roll-up score that evaluates both ICP fit and engagement (A1, A2, etc.).
  • Score at Auto MQL and Score at MQL: Tracking these scores allows you to benchmark where these scores hit as people MQL and eventually approximate future conversion rates after you roll out the model.


02. Webhooks

Next, we need to do some math!

Because addition and subtraction of two or more numeric field values isn’t possible natively in Marketo Engage, we’ll build several Webhooks under Integration. Webhooks can be used to create Excel-based formulas that calculate scores composed of multiple elements. To get your Engagement Score, input a formula under “Payload Template” that adds together 45-Day Behavior, 6sense Account, and 6sense Person data. Then, under “Response Mapping,” define the result of this calculation as your Engagement Score.

3 Images for Matrix Blog.png

This formula bypasses the need to manually input calculations into score fields. Instead, you can run this formula with each score update to revalidate the correct amount.


For Account Fit, your sales-provided value might be a partial number to a decimal point. While you can’t add that into the formula, start your input with an “=” to get this value to roll into a whole number for Account Fit.

4 Images for Matrix Blog 3.png

This allows you to use the same addition formula with Persona and Account Fit to accurately calculate the ICP score.

5 Images for Matrix Blog 2.png

For these calculations to run, we then need to set up several functions to process scores.


(Note: You’ll need to use Triggered Smart Campaigns to call your webhooks. Batch campaigns cannot call webhooks. If you are running batches to call a webhook, you can daisy chain using the “Request a Campaign” function to batch process people into a Smart Campaign that can call a webhook).


03. Gradation and Engagement Data

Start with a requested Campaign under Smart List. Only ICP and Engagement score entries with data (including zeroes) will process for the requested campaign.


Under Flow, you’ll set alignment against the ICP. The sum total of the score you can get here is 200, which you’ll bucket out against the gradation (e.g. A = at least 161, B = between 121 and 160, and so on). Anyone with missing information will go to the asterisk group, which you can identify using a smart list.


This scoring only factors in the positive behavioral elements that people display, with no negative values. You may choose to reduce the score for leads who perform certain actions (such as unsubscribing), but we’ve opted not to do so to maintain a fixed range of 0 to 200.


Next, use the Request Campaign or Executable Campaign under Special to process the Campaign for each ICP grade. Doing this will further segment the audience in your database and arrive at your gradation.


On A, for instance, bucket a total Engagement score of 200 to create engagement tiers for the group (e.g. A1 =  Engagement at least 161, A2 = Engagement between 121 and 160) down to an A5. Under Change Data Value, you’ll also set the ICP Grade (Attribute = ICP Grade, New Value = A). This allows you to pivot engagement buckets against the ICP group and run broader-based reports at the ICP level.


04. ICP Scores

To get your ICP scores, there are two components to process. Wherever possible, run these as nightly batches rather than triggers to minimize the overall load on the system. Try to avoid using triggers unless you’re working with behavior-score based data or webhooks. As you can’t call a webhook from a batch, you’ll need to use triggered Smart Campaigns in those scenarios.


The first element to process is Account Fit. In this particular case, we’re working with the ICP value identified by sales, the Account Profile Fit set by 6sense, and a separate value to include the lead and contact fields from Salesforce. Process any of these entries that have experienced a value change in the past 24 hours.


Moving to Flow, under Request Campaign send the ICPs, which sales may have to a decimal point, through the ICP webhook to normalize. Under Remove from Flow, exit them via “this campaign”, where they’ll then be processed by a secondary campaign (“Account Fit > ICP Webhook”).


Then, under Change Data Value, use string fields to set values for Account Fit (e.g., if Account Profile Fit is “Strong”, Account Fit value = 100; “Moderate” = 60, “Weak” = 20). As you don’t need to add or remove values, scoring fields aren’t necessary here. These are one-time entries that can change or be overwritten and remain mathematically sound. Use the same numerical and descriptive values to fill out your lead field.


Next, request an ICP Change Smart Campaign to call the webhook and process the ICP value. This is a useful way to daisy chain a webhook where a batch is running it; Request Campaign allows you to trigger a secondary campaign that calls the webhook in a batched fashion, because it’ll run at the regular time you have it scheduled (see “Recurrence” under Schedule). Scheduling a nightly run at 10 PM, for instance, will call the webhook to process any outstanding people each evening, during off-business hours.


For people in the database that need the ICP value to be set, enter “Account Fit > ICP Webhook”, request a campaign, call the webhook, and add 10 minutes of wait time to process. This is a little bit more than you’ll likely need, but it’s a stable number that’s unlikely to change.  As you’re setting this to process in the middle of the night, you’re sacrificing little practical immediacy in getting MQLs over to sales. You’ll set this value on a nightly basis.


Persona will also run every night based on a segmentation. Use an “Any” filter to run updates if the Persona segment has changed in the past 24 hours, or if the score is empty or greater than 100 due to erroneous processing. Segment Changed will only apply to people who already have a segment—the segment won’t change for people who are new to the database and have just been assigned a segment. Setting Score - Persona “is empty,” in this example, ensures you collect everyone who’s eligible to run through.



Under Flow, use a Score field and fill out your Change values with “=” to ensure that the new value is replaced rather than added to. Your Persona segments can range from highly compatible role profiles (scored positively as such) through to missing job titles (scored neutrally) and undesirable or irrelevant job titles (scored negatively).


As with Account Fit, Persona triggers the ICP Change Campaign to run once filled. Under ICP Change, request the campaign, call the ICP webhook to retrieve the sum of Account Fit and Persona scores, wait 10 minutes, and process through your ICP/Engagement Score Changes Campaign. This is what’ll take you towards having final scores.


If you don’t have Account Fit information for certain individuals, indicate the following values under “Fit Score Empty” (with an “All” filter) so they surface in the model with an asterisk.


05. Engagement Scores

Engagement scores have several key pieces. First, run a subset of the 45-Day Behavior scores that the larger model will reference. If you have legacy behavior scoring that you’re using as a parallel test or don’t want to deprecate, rather than modifying every Smart Campaign to reference these behavior scores, it’s much easier to execute the subset in a separate place and reference it where necessary. If you eventually decide to scrap the 45-Day Behavior score or rework it, running it separately means you’ll be able to maintain your old Behavior or Person scores. If you hit a speed bump with testing, you can also “null” this and start over.


First, request a campaign from the scoring methodology you’re using. As this is a score over 45 days, using a more conservative rubric (e.g., 100, 25, and 5 points) means it’ll be easier to use these scores to assign 1-5 Engagement levels. Change your Score value, Wait 45 days, and change the Score value back by the same amount. Repeat for each score value in your methodology. Note that people can run through the system repeatedly, as needed.


You want to identify timely responsiveness from leads in your model. The 45-Day Behavior score and Engagement Change are both key to this. Engagement Change is triggered as a roll-up by several important things. It’s timely to increase the score regularly, so run a nightly batch change to minimize the load on what you process during business hours.


Run Engagement Change to update upon any positive score change in 45-Day Behavior (e.g. 100, 25, 5), when 6sense Person Intent or Account Intent scores change, and request the campaign for additional processing.

(Note: You can ABSOLUTELY use a different time window for scores. Look at the velocity of sales journeys and lead to MQL timelines and adjust accordingly. If you’re dealing with a longer sales cycle you may want to do a 90-day, 180-day or 365-day, etc.).




Exclude those who have zeroes or empty values. These leads can process at night—what you really want to accomplish during business hours is to immediately flag the people who are actively engaging over to sales.


Then, call the Engagement Score Webhook to retrieve the sum of Account Intent + Person Intent + 45-Day Score. Give it a 5-minute wait time at first, but you can decrease that number once you have a better grasp of how long the webhook takes. Also, request the ICP/Engagement Score Change Campaign.


Your processes for 6sense Account Intent Score are similar—look to identify any Data Value Changed in the past 24 hours. Under Flow, set Account values corresponding to Contact vs. Lead on the SFDC side.


Because this is a data value change, it will trigger an Engagement Change, therefore you don’t have to request a campaign.


6sense Person Intent Score follows a near-identical process, but with person-based fields. In addition to data value changes, you’re also looking to include leads created. Configure your filter so that it includes people created with non-empty contact engagement or lead scores.


Under Flow, the New Values will also correspond to the Contact Engagement and Lead Engagement scores. As this will result in a numeric value between 1 and 100, you can use the tokenization rather than break down values based on verbal cues. This will also run nightly.


To reduce system load further, we can process people with all zero scores or score reductions without using the webhook. Under “Engagement Change [BATCH]”, run for negative score changes to the relevant values (e.g. -100, -25, 5) that are not members of the Zero Scores or No Scores Smart Lists.


Request the Engagement Change campaign and set these to update daily.


Under the No Scores Smart List, input that the 45-Day Behavior, 6sense Account Intent, and 6sense Person Intent are all empty. Under Zero Scores, input that each of these scores equals 0.


Under the No Behavior, No 6sense Account, and No 6sense Person Smart Lists, add on a nightly basis that the relevant data point is empty, set the New Value under Flow to 0, and schedule them to run early in the morning after your 45-Day Behavior, 6sense Account, and Person Intent value changes have been able to refresh. 


Following that processing, you can also look for anyone under Zero Engagement with the same three 0 values and an empty Engagement Score. Under Flow, change the value to “=0”, and request the ICP/Engagement Changes campaign.


This is an easy way to configure that, if all of those values are 0, the Engagement Score should also be 0. Configuring this without a webhook contributes to minimizing Marketo Engage’s trigger load. Run this around a half hour after your final No Behavior to factor in the remaining people with zero engagement.


06. Your Matrix Scoring Model

All the processes we’ve outlined then run in tandem to produce the complete matrix scoring model:


As you start leveraging this in your lifecycle and decide which groups are worth qualifying as MQLs, those groups (e.g. A1, A2, B1, C1, *1) would kick off the MQL process in the lifecycle for a score-based MQL or AQL.


While this scoring model is intended to replace any score-based MQLs, it does not replace Auto MQLs; people you want to surface to sales as quickly as possible thanks to actions like requesting a demo or trial. Use this model in tandem with a separate process to automatically qualify and route AQLs to sales to realize every opportunity to close a deal.


Bonus: How to Create People Performance Reports

In the case of a matrix scoring model, the report allows you to get a clear understanding of who falls where within the dataset of engagement scores and ICPs. Additionally, you can use the same report format to visualize any number of functions inside Marketo Engage.


To create a People Performance report, go to New Local Asset, then Report, then select People Performance under Type. You might be familiar with People Performance reports that display rows based on creation date (when someone entered the system), which you can sort by month, quarter, or year. However, by heading to Setup, then Group People By, you can select from a wide range of alternative fields in your system to surface different subsets of your database. For the matrix scoring model, you’ll use ICP Grade.


Not all reports can add additional columns, but this particular report does. Under Setup, you can drag Custom Columns over from the right-hand Settings menu. Once your columns are set up, double-click them to edit.


Smart Lists can be used as Custom Columns in your report, as long as they exist in your database rather than your marketing activities area. You can search for and add Smart Lists under the Manage Custom Smart List Columns menu.


To build the Smart Lists you’ll use Custom Columns. Head to Database, then Group Smart Lists, then build various lists under an Operational folder. For your matrix score model, create a Smart List for each ICP letter grade, the asterisk, and engagement tiers 1-5. 


For each engagement score subset, configure the Smart List to contain the relevant number for your group (e.g., “contains 1”)—this allows you to include all the ICP variations in an engagement group (A1, B1, *1, etc.) without needing to input multiple values.


Once you’ve created these values, you can add them as columns to your People Performance report. Run the report and you’ll see the total dataset sorted into the groups and columns of your choice (in your matrix score model, this will be your ICP grade groupings and engagement scores):


Selecting the “People Created At: All Time” filter gets you the entirety of your database, but you can play around with this to identify people added in more particular intervals of time. Reports containing many people won’t automatically refresh when you come to view them, so hit Refresh Report under Report Actions to get the most current data.