We are starting to use Marketing Cloud with Sales Cloud (and Marketing Cloud Connect between them). When the sync runs, it puts every Contacts I need in my Synchronized DE. That's fine.

Because our marketers are used to use another CustomerId, I created "marketing" Data Extensions with "CustomerId" as a primary key, and Subscriber relationship. This Data Extension receives data with a SQL activity (from our Synchronized DE to this Marketing DE).

It seemed to be a good idea to me, especially because marketers would be able to search their customers (in Contact Builder) using our CustomerId and not the Salesforce Id. You know, when you want to check one specific Customer, or perform some tests on your own Contact name... Also, it allows our Mobile App to send our CustomerId to Marketing Cloud, instead of a SalesforceId (and our backoffice doesn't know this SF Id, we would have to send it to the backoffice).

So, when we send email, this CustomerId is filled in AllSubscribers AND in AllContacts (in Contact Builder). So, let's say we have 1 million Contacts synchronized from SalesCloud (and directly sent to AllContacts)... then we will have another 1 million coming from AllSubcribers. And that's a matter of $$$ because our contract says 1 million Contacts max...

Do you see any workaround to this ?

Thanks a lot for your help !

Kind regards,


Edit: It seems I really have to use the Salesforce Id as a SubscriberKey, or my Individual Email Results will never be filled in Sales Cloud.

Even if it make sense, it's quite ennoying. Here is a consequence I can imagine : If someone just subscribes to our website : we want to send him a transactional message to say hello. For now, we used to send our CustomerId in the payload, so Marketing Cloud will be later able to know who received this email. In the future, I would have to know the Salesforce Id linked to this contact. I would mean that our website has to create the Contact in Salesforce first, then receive the SalesforceId, THEN send the transactionnal message.

I would be very happy to have any confirmation from your part. I'm only doing deductions from what I'm now understanding.


1 Answer 1


This is not an uncommon scenario in large enterprise system landscapes, where Sales Cloud isn't system of record for customer identity. This is not very optimal, but can be solved while maintaining a close-to-standard scope of features.

First of all, as you correctly state, Synchronised Data Extensions (leads, contacts, users) automatically count towards contact count based on the native Salesforce IDs. The only way to avoid this, is using import activity for providing a copy of Sales Cloud objects to Marketing Cloud, as per this example (In email Studio, go to Interactions > Import > Create:enter image description here

This will provide a copy of your objects without automatically adding all records to Contacts in Marketing Cloud.

Another shortcoming in the inability of using native Journey Builder’s Salesforce Entry Events, as these require the use fo native IDs as Contact/Subscriber key in SFMC. You can still use a code-free solution, but it requires a Salesforce Sales Cloud admin to design the “listener” in Process Builder rather than exclusively in Marketing Cloud. Alternative is entry about 1.5 hours after record change using scheduled automation, in which case all work can be done in Marketing Cloud.

You are also correct, when it comes to Individual Email Results (IER). They will not update when using anything but the native IDs. However, I very rarely recommend these anyway. Reason being, the records created in Sales Cloud are in 99% of the cases never looked at, they just use up valuable storage. Also, as the name states, these only cover the email channel. As most of SMFC clients use more than only that channel, the information of text messages sent, will not be included in IER.

What I normally suggest, is to provide this information as an external object, based on a Cloud Page Code Resource. Using the custom ID as a request parameter to the URL of said Code Resource, you can write Ampscript in there, which exposes information about the marketing activities and engagement (clicks/opens) across channels, for that particular individual. As this information is scattered across a number of data views, you might want to preprocess it in Query Activities within Automation Studio, to reduce waiting time when requesting the external object.

You will still be able to use UpdateSingleSalesforceObject and RetrieveSalesforceObjects, as these functions are not dependent on the nature of Contact Key in Marketing Cloud.

  • Thanks a lot for your complete answer ! I understand that if we want to use an external ID it's possible but we have to really need it. It's a lot of constraints.
    – divad
    Commented Sep 28, 2020 at 17:11
  • 1
    Sales Cloud isn't system of record for customer identity - therein lies a fatal flaw. Core platform should be the master identity record. If you don't plan for it, then you end up in situations such as this one. Solving this problem is one of the reasons for Customer 360 Data Manager.
    – identigral
    Commented Sep 28, 2020 at 20:17

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .