In our org we use Person Accounts, and they can be added as Campaign Members. We also use CPQ and keep tracking of customers' subscriptions. We have also added two Custom Fields "Subscription" and "Promoted Offer" in the Campaign Member Object.

The problem is, for a "Renewal" Campaign, we want to contact customer via a Campaign to promote some offerings, when their contract(s) are about to expire. If the Customer has 5 Subscriptions that expire soon, we need to contact him 5 times for his contracts expiration and promote specific offers... What is the best practice to handle that, since Salesforce does not allow having the same Contact Id as a Campaign Member? Has anyone faced the same issue and got a proper solution to work?

1 Answer 1


you are dealing with a built-in limitation of the campaign. As you say, a contact can only be inserted once per campaign, meaning you have a 1:1 relationship between Contact and a specific campaign.

This cannot be solved on the Campaign Member in a scalable manner by just "adding another checkbox" for reinsertions. What if there are 10?

Also, it probably makes very little sense to open up "n" campaigns to insert a user, it will get very messy and complicated.

So it's a "systemic" problem of the objects involved. Campaigns would be nice but won't cut it, and you should solve it at a general level. So let's work on that, and create an object that works for you.

In abstract form, your requirement is:

1:n relationship from Contact to [something that triggers journeys].

My recommendation is, I would go for a custom object that does exactly that: Make it very generic to allow for diverse reasons to create a record:

Something like "journeyTriggerEvent__c" with a field structure along those lines:

[systemGenerated & Unique],003xxxxxxxxxxxxxxx,MySubscriptionProcess,MySubProcess,myDetail,[UserID],01042021_13:13:00

Note there is NO limitation on a PersonContact being unique here. Every record has its own unique key and you can create journeyTriggerEvents in whatever way and for whatever usecase you please. As most things involving SFSC, it won't scale without limits, but definitely a couple of usecases can share the same object. Do your own due diligence in terms of load.

To make it easy in daily life, customize the PersonContact Page layout in a form that users can create records on that object via a simple UI, and the various fields are filled in a meaningful way.

Base your journey Entry Source listener(s) on the "journeyTriggerEvent__c" object (when a record is created) and use the various categorizations to identify what usecase a specific record is about. The object can serve as a gateway for one or several journeys. Through timestamping and source logging, it can act as a log of who went where, when and "who did it". It's probably a good idea to periodically clear all records out, potentially archive them elsewhere, so as to not create indefinite growth.

Finlly, build up one or many journeys on those categorizations.

== Yes, a limitation is, you don't have the built-in functionality of campaigns ("add to campaign" on the Contact Page Layout, campaign member tracking), but that is crying over spilled milk- the campaign works as described above and that probably won't change.

Hope that helps!

  • Jonas, thank you so much for your detailed response :) Commented Apr 6, 2021 at 11:07

You must log in to answer this question.

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