Loading

Salesforce Platform: Track Campaign Member Status History

Data pubblicazione: Sep 22, 2026
Descrizione

Campaign Member History:

  • Tracks the audit trail of status changes for Contacts or Leads in Campaigns.
  • Provides historical insights into engagement behavior, such as email interactions (e.g., sent, opened, clicked).
  • Not enabled by default and requires configuration.

Campaign Member Status:

  • Represents the engagement level of a Contact or Lead in a Campaign.
  • Examples include statuses like "Sent," "Opened," "Responded."
  • Can be customized and used to filter or sort campaign data.

Capturing campaign member history isn't possible with standard functionality, History Tracking isn't available for Campaign Members. However, by customizing the functionality as mentioned below may help to establish the requirement.

Risoluzione

This article explains how to build a custom Campaign Member History solution, since standard Field History Tracking isn't available on the CampaignMember object. A custom object plus an Apex trigger is used to capture insert, update, and delete events on Campaign Members.

Enabling History Tracking Configuration Steps

Step 1: Create the Custom History Object

Create a custom object named "CampaignMemberHistory" (API name: CampaignHistory__c) to store the record of changes made to CampaignMember records.

Step 2: Create Supporting Fields

  1. Create a Lookup field to Campaign that will capture the associated Campaign Id for that Campaign Member, named "CampaignId__c".
  2. Create a Rich Text field with a max character limit to capture the description of changes made, named "HistoryDetails__c".

Step 3: Create the Apex Trigger

Create a trigger on CampaignMember to detect inserts, status/campaign changes on update, and deletes, and log each event as a CampaignHistory__c record. This sample trigger logs three scenarios: Campaign Member deletion, a status or Campaign change during update, and new Campaign Member creation.

Trigger HistoryTrack on CampaignMember (after insert, before update, before delete) {          
List<CampaignHistory__c> ch= new List<CampaignHistory__c>(); 
List<CampaignMember> cmOld= Trigger.old;  
List<String> changes  = new List<String>(); 
List<String> CampHisId  = new List<String>(); 
integer i=0;     
if(Trigger.isDelete){
            for(CampaignMember cm: Trigger.old ){     
                       String s;                            
                       s='Campaign Member id ' + cm.id + 
                       'is Deleted from campaign id: '+ cm.campaignId + 'by user '+ userinfo.getUserName();                                        
                       changes.add(s);
                       CampHisId.add(cm.campaignId);
                       CampaignHistory__c c= new CampaignHistory__c();               
                       c.Name='History'+DateTime.now();  
                       System.debug('CName:'+c.Name);
                       c.CampaignId__c=CampHisId[i];
                       System.debug('CampaignId:'+c.CampaignId__c);                              
                       c.HistoryDetails__c=changes[i];
                      System.debug('CHistory:'+c.HistoryDetails__c);         
                      ch.add(c);                              
                      i++;           
             } 
        }else {      
                     for(CampaignMember cm: Trigger.new ){  
                            String s;
                            if((Trigger.isUpdate)){
                                   if(cmOld[i].status!=cm.status){    
                                          s='on dated ' + DateTime.now() +                        
                                            ' status changed from ' + cmOld[i].status + ' to ' + cm.status +                        
                                            ' by user ' + userinfo.getUserName();

                                           changes.add(s);
                                          CampHisId.add(cm.campaignId);                                                  
                                          CampaignHistory__c c= new CampaignHistory__c();                          
                                          c.Name='History'+DateTime.now();
                                          System.debug('CName:'+c.Name);
                                          c.CampaignId__c=CampHisId[i];                        
                                          System.debug('CampaignId:'+c.CampaignId__c);                                      
                                          c.HistoryDetails__c=changes[i];
                                          System.debug('CHistory:'+c.HistoryDetails__c);
                                          ch.add(c); 
                                      }else if(cmOld[i].campaignId!=cm.campaignId){                        
                                                s='Changed Campaign id from : '+ cmOld[i].campaignId + 'to :' + cm.campaignId +                        
                                                    ' by user '+ userinfo.getUserName();  
                                              changes.add(s);                        
                                             CampHisId.add(cm.campaignId);                                                            
                                            CampaignHistory__c c= new CampaignHistory__c();                           
                                            c.Name='History'+DateTime.now();
                                            System.debug('CName:'+c.Name);              
                                            c.CampaignId__c=CampHisId[i];                   
                                           System.debug('CampaignId:'+c.CampaignId__c);                                          
                                            c.HistoryDetails__c=changes[i];
                                            System.debug('CHistory:'+c.HistoryDetails__c);                         
                                            ch.add(c);
                                         }             
                           }else if(Trigger.isInsert){                                
                                       s='A new Campaign Member id : ' + cm.id + ' is added to Campaign id :' + cm.campaignId +' by user '+ userinfo.getUserName();
                                       changes.add(s);                    
                                       CampHisId.add(cm.campaignId);                    
                                       System.debug('s>>>'+s);                                                                    
                                       CampaignHistory__c c= new CampaignHistory__c();
                                       c.Name='History'+DateTime.now();                   
                                       System.debug('CName:'+c.Name);
                                       c.CampaignId__c=CampHisId[i];
                                       System.debug('CampaignId:'+c.CampaignId__c);                                          
                                       c.HistoryDetails__c=changes[i];
                                       System.debug('CHistory:'+c.HistoryDetails__c);                                        
                                       ch.add(c);
                            } 
                            i++;     
                       }         
                }    
                insert ch;
     }

This trigger builds a human-readable log entry (who changed what, and when) for each Campaign Member insert, delete, status change, or Campaign reassignment, and inserts those log entries into the CampaignHistory__c custom object.

Step 4: Display History on the Campaign Page Layout

Go to Campaign, click Edit Layout, select the Campaign History related list you created, add any other required fields, and click Save.

Note: This is sample code and will not work in all scenarios — please edit and tailor the code to match your specific requirements.

Numero articolo Knowledge

000385967

 
Caricamento
Salesforce Help | Article