# Workflow Triggers

<p class="callout warning">**Workflow Rules (along with Process Builders) are now on a deprecation / End-of-Life plan. Existing Workflow Rules will continue to operate for the foreseeable future, but in the near future (Winter 23) Salesforce will begin to prevent creating new Workflow Rules. Establish a plan to migrate to Flows, and create any new automation using Flow Builder.**  
  
*These naming convention best practices will remain in place for reference purposes so long as Workflow Rules may exist in a Salesforce org*</p>

A workflow trigger ***MUST*** always be named after what Triggers the workflow, and not the actions. In all cases possible, the number of triggers per object ***SHOULD*** be limited - reading the existing trigger names allows using existing ones when possible. Knowing that all automations count towards Salesforce allotted CPU time per record, a consultant ***SHOULD*** consider how to limit the number of workflows in all cases.

1. All Workflow Triggers ***MUST*** contain a Bypass Rule check.
2. A Workflow Trigger ***SHALL*** always start by `WF`, followed by a number corresponding to the number of workflows on the triggering Object, followed by an underscore.
3. The Workflow Trigger name ***MUST*** try to explain in a concise manner what triggers the WF. Note that conciseness trumps clarity for this field.
4. All Workflows Trigger ***MUST*** have a description detailing how they are triggered.
5. Wherever possible, a Consultant ***SHOULD*** use operators over functions.

#### Examples

<table id="bkmrk-object-wf-name-descr"><tbody><tr><th>Object</th><th>WF Name</th><th>Description</th><th>WF Rule</th></tr><tr><td>Invoice</td><td>WF01\_WhenInvoicePaid</td><td>This WF triggers when the invoice Status is set to "Paid". Triggered from another automation.</td><td>`!$User.BypassWF__c && ISPICKVAL(Status__c, "Paid")`</td></tr><tr><td>Invoice</td><td>WF02\_CE\_WhenStatusChanges</td><td>This WF triggers every time the Status of the invoice is changed.</td><td>`!$User.BypassWF__c && ISCHANGED(Status__c)`</td></tr><tr><td>Contact</td><td>WF01\_C\_IfStreetBlank</td><td>This WF triggers on creation if the street is Blank</td><td>`!$User.BypassWF__c && ISBLANK(MailingStreet)`</td></tr></tbody></table>