function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
dtravellerdtraveller 

Campaign Member after update trigger doesn't fire during lead conversion?

Hello.  Does lead conversion skip the CampaignMember AfterUpdate trigger if a lead is a campaign member?  The new contact is populating the campaignmember record so it should fire the trigger, but it does not.  I have tested in a clean dev instance using a basic trigger and a unit test, and my afterupdate trigger doesn't fire when I run the unit test.
dtravellerdtraveller
I have enabled "Require Validation for Converted Leads"
dtravellerdtraveller
trigger CampaignMemberTriggers on CampaignMember (before update, after update) {
	if (Trigger.isUpdate) {
		system.debug('*** update ***');
	}
}


@isTest
public class UnitTest {
	static testmethod void testTrigger() {
		Account acct = new Account(Name = 'Apex Test');
		insert acct;

		Campaign camp = new Campaign(Name = 'apex test', isActive = true);
		insert camp;

		Lead myLead = new Lead(LastName = 'Apex Test', Company = 'Apex Test');
		insert myLead;

		CampaignMember cm = new CampaignMember(CampaignId = camp.Id, LeadId = myLead.Id);
		insert cm;

		CampaignMember cmNew = [SELECT LeadId, ContactId FROM CampaignMember WHERE Id = :cm.Id];
system.debug('*** cmNew: ' + cmNew);

		Database.LeadConvert lc = new Database.LeadConvert();
		lc.setLeadId(myLead.Id);
		lc.setAccountId(acct.Id);
		lc.setDoNotCreateOpportunity(true);

		LeadStatus convertStatus = [SELECT Id, MasterLabel FROM LeadStatus WHERE IsConverted = true LIMIT 1];
		lc.setConvertedStatus(convertStatus.MasterLabel);
system.debug('*** converting the lead ***');
		Database.LeadConvertResult lcr = Database.convertLead(lc);
		System.assert(lcr.isSuccess());
cmNew = [SELECT LeadId, ContactId FROM CampaignMember WHERE Id = :cm.Id];
system.debug('*** lcr: ' + lcr);
system.debug('*** cmNew: ' + cmNew);

	}
}
JeeTJeeT
Hi dtraveller,
The contact created by Lead convertsion is attached to CampaingMember, it means that it creates a record on CampaignMember Object.
On lead conversion update event is not happening on CampaingMember. while an insert event will trigger at this situation.
So your trigger will execute in case of only Before Insert and After Insert
trigger CampaignMemberTriggers on CampaignMember (before update, after update, before Insert, after insert) {
    if (Trigger.isUpdate) {
        system.debug('*** update ***'); // will not work at Lead conversion
    }
    if(Trigger.isInsert){
        system.debug('*** insert ***'); // will work as new record inserted to CaampaignMember object at Lead conversion
    }
}

 
dtravellerdtraveller
The Campaign Member record is being updated during the lead conversion process because the ContactID field is being populated.  That is why expected the AfterUpdate trigger to fire.