We are creating a journey in Marketing Cloud, where we are using a Salesforce Data Event and the Lead object to inject new Leads into the Journey as Contacts.

The objective of the Journey is to convert the Lead into an Opportunity, and ultimately an Account.

As I understand it, whenever a Lead is converted to a Contact in Sales Cloud, there are up to three records that are created; an Account, Contact and optionally, an Opportunity. At the time, the Lead Object is changed to a System record (effectively making it inaccessible).

When the person (a Sales Cloud Lead) is moving through the Journey and responds to the call-to-action and is converted to an Opportunity, then we can eject them from the Journey (using Exit criteria) and they can enter another Journey as an Opportunity record.

I understand that the Convert Lead Activity in Journey Builder converts a Lead to an Contact, Account, and/or Opportunity record while maintaining the Contact relationship back to the original Lead ID (which is the Contact Key). However, in our scenario, a subscriber in a Journey may change to an Opportunity or a Contact from Sales Cloud.

The issue is that a Contact Record has already been created against the original Lead record and there is effectively no way to delete this; Contact Records in Marketing Cloud are both persistent (you can't change the Contact Key) and perpetual (you can't delete them). As a result, we will now have two records against the same Contact Record (one for the Lead and the other for the Opportunity), then ultimately have 3 records once they convert into an Contact object.

Be aware that you are charged for Contacts in your Marketing Cloud Account, and each of these will use different Contact Keys (which correspond to the Salesforce Id), so this means you can have two or three duplicate Contacts for the same person, representing each stage of their Sales Cloud record lifecycle (Lead -> Opportunity -> Contact).

How are others overcoming this issue to ensure that only one Contact record exists against a person in Marketing Cloud, irrespective of their lifecycle stage in Sales Cloud?

3 Answers 3


Generally speaking, we create Automations that do a Query/Extract/Import to All Subscribers for any email address that's associated with an unsubscribed Subscriber Key. This obviously doesn't prevent the duplication, but it honors the unsubscribes.

Clients unknowingly create duplicate subscribers all the time, but this is an inherent duplication in the platform and is tied to billing.


I feel as though the battle against keeping Contact counts down from a billing perspective is a losing battle.

The fact that all subscriber-based synchronized Data Extensions will count towards the total is alone a huge burden. Converted Leads are never removed from Salesforce, so even in your scenario if were able to remove the original Lead instance from Marketing Cloud (and somehow remove it entirely), it would still count towards the Contact total if we were synchronizing the Lead object.

My main concern is always on unsubscribes: Making sure that once a Lead is converted their new instance new Contact instance will have the same Email Opt-Out status, ensuring if they unsubscribe from an old email sent to their Lead instance they are unsubscribed again as a Contact, etc. The Lead synchronized object holds a converted status so we can always be sure of when Leads are converted, and we can filter from that information to only send to unconverted ones.

Anyway just sharing my thoughts - would definitely also love to hear if anybody has their own tricks for this

  • I agree with everything you say here. That's an interesting workaround to check the converted status of the Lead object, thanks for sharing this. Commented Apr 12, 2017 at 8:19

We were facing the same issue as well. Here is the solution we opted for -

On Lead object, we've created a flag, (boolean type). If it's true then that lead object gets sync with marketing cloud. If that flag is False then corresponding Contact object gets sync with marketing cloud.

Example: A lead was created for a prospectus name : ABC. Initially lead was not converted, hence flag was True and lead object was in sync with marketing cloud. Now after 4 days, lead was converted into Account and correspondingly an account, contact & opportunity was created. As soon as lead is converted, flag value changed to False. So now that lead object sync gets off and Contact object sync is on.

Getting this done is not sufficient. Out of total converted leads, there will be few where you must have sent email. Once an email is sent to a contact, it's get permanently stored in marketing cloud. To minimize contact consumption, on periodically you'll have to delete such contacts manually.

  • How did you achieve this conditional sync of leads and contacts? Commented Mar 10, 2020 at 21:21
  • @Pradeep Singh : Set up a boolean field in sales cloud at lead level, and then when you sync Lead table in marketing cloud, there it gives you an option to put a condition based on the some field already available in sales cloud. Use the boolean field here to filter out contacts.
    – ASHISH
    Commented Aug 15, 2020 at 12:38

You must log in to answer this question.

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