Lead Conversion Trigger Order of Execution

The usual order of execution detailed at http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_order_of_execution.htm still applies with some special considerations

The Before triggers and validation rules do not fire unless that checkbox is ticked under Customise > Lead > Settings. Note that for orgs created prior to '08 you'll need to contact support to enable this (related answer)

After triggers still always fire irrespective of the above setting

To check if a Lead has been converted and do custom lead conversion logic, the best home for such is the LeadAfter trigger, where you can check

If (trigger.isUpdate && Lead.IsConverted && !trigger.oldmap.get(lead.id).IsConverted)
//do your stuff

Here you will have access to the convertedAccountId, convertedContactId, ConvertedOpportunityId and any OpportunityContactRoles

This is also a good place to re parent any custom related list records from the converted Lead to either of Company or Contact

Just added some debug logs to triggers, and here's the order of execution : (This is with the Enforce Validations and Triggers on Lead Conversion Enabled)

Account Custom Field Mappings
Account Before                 (Fires based on lead settings)
Account After
Contact Custom Field Mappings
Contact Before                 (Fires based on lead settings)
Contact After
Opportunity Field Mappings
Opportunity Before             (Fires based on lead settings)
Opportunity After              (OCR's not available)
Lead Before
Lead After                     (OCR's available)

If the Enforce Validations and Triggers setting is turned off, none of the Before triggers fire. The After triggers however still fire.


Strangely, if the task details are entered on the lead conversion page, then the lead before and after triggers are called at the last (Lead after event).

Even adding an error on the task trigger (task.addError) will not show any error on screen and will not stop the account, contact, opportunity records being created, but only the task record will not be created for opportunity.

So the final flow is

1.0 Account Custom Field Mappings

1.1 Account Before (Fires based on lead settings)

1.2 Account After

2.0 Contact Custom Field Mappings

2.1 Contact Before (Fires based on lead settings)

2.2 Contact After

3.0 Opportunity Field Mappings

3.1 Opportunity Before (Fires based on lead settings)

3.2 Opportunity After (OCR's not available)

4.0 Lead Before

4.1 Lead After (OCR's available)

5.0 Commit to database

6.0 Task Before

6.1 Task After

7.0 Commit to database (task)