Avoid paying too much for your contacts in Marketing Cloud

Stop throwing away your money

You probably already know, that contact count is one of the main variable cost drivers of your Salesforce Marketing Cloud license. However this is also one of the factors which is most in your control. Let’s revisit what the contact count actually is:

A contact in Contact Builder is an individual added to any contact database in Marketing Cloud Engagement. A contact can be someone who received a message from any Engagement tool, such as GroupConnect, Journey Builder, MobileConnect, or MobilePush.
Marketing Cloud combines contacts from all sources based on the Contact Key value. The Contact Key value is normally provided by the system of record for contacts, and is used specifically to identify a single individual.

Different data sources can include duplicate contact records, so the total contact count in a tenant can differ from the total contacts contained in all available data sources. For example, this figure shows the overlap in an account with 500,000 email contacts, 300,000 synchronized data source contacts, and 125,000 mobile contacts:

For a number of years, keeping track of your contact count was actually not possible within the platform itself, but you had to rely on your Account Executive to provide you with your consumption numbers. This process btw still applies to your consumption of Super Messages. Luckily we now have the Contacts Count report, which can show us a number of contacts in our instance of SFMC:

There are multiple ways of presenting this data, e.g. using this chart showing development in your contact count week on week:

In addition to the chart, you can also export the data as a csv file, and place it on your Enhanced FTP, from where it can be picked up by a file import. Why does it need to be scheduled and picked up by a file import, you ask?

Successfully scheduled report generation can be found under your overview, and will have following details:

Successfully scheduled report

Remember that contact count is internally only updated once a week (on Sunday) so there is no need to run the report more frequently. I have set it to run every Monday.

By importing it into a data extension, you will be able to store historical contact count in a location where you can utilise it for notifications. Let’s quickly set up the import (you must of course observe the location where your recurring report run is dropping the file):

The data extension where you need to import this file only needs to have two fields: Count_Date (Date) – which will be our primary key, and Total_Distinct_Contacts_Count (Number) which will show the current contact count on that date. There are other columns in the exported report file, but for now, these will be only ones that matter:

Count_DateTotal_Distinct_Contacts_Count
04/13/20241234567
04/06/20241234568
04/01/20241234569
03/30/20241234570
03/23/20241234571

You will have two data extensions with similar fields: ContactCountImport and CountactCountAlert.

Between these two, you will add a query activity, which will select records in your which exceed your desired threshold, e.g. 80% of your allowed contact count:

select top 1 * from ContactCountImport where Total_Distinct_Contacts_Count > 1000000 order by Count_Date desc

Output of this Query Activity should overwrite your CountactCountAlert data extension. And immediately after this activity, you will add a Verification Step:

You have probably already realised what will happen:

  1. File gets generated by the weekly report run (this is happening outside of Automation Studio)
  2. File gets imported into ContactCountImport
  3. You are querying this data extension to find if the latest row matches your alert criteria
  4. If it matches, your destination data extension will now have more than 0 records
  5. An email goes out to the email address specified in your Verification step

If you have found out, that you have too many contacts, you should of course consider deleting them, as described here.

Scroll to Top