A status field on a custom object follows the same pattern as the platform's standard status fields. The steps below cover the canonical setup: picklist with controlled values, default value, validation rule for transitions, history tracking, and a flow that fires on status change.
- Create the Status picklist field
On the object, add a picklist field named Status. Use a Restricted Picklist so users cannot enter ad-hoc values via the API. Apply a Picklist Value Set if the org has one for consistency across objects.
- Set the default value
Pick the initial status (typically New, Open, or Not Started). The default applies on record creation and removes the burden of users picking the right starting value.
- Add a validation rule for invalid transitions
Add a validation rule that uses ISCHANGED(Status) and PRIORVALUE(Status) to block invalid transitions: a record moving from Done to In Progress, a record skipping required stages, a record being Closed without required fields populated. The rule fires on every update path.
- Enable Field History Tracking on the Status field
In Object Manager, Field History Tracking, tick Status. The change history is captured on every status edit with user, timestamp, old value, new value. Reports on the History object surface time-in-status metrics.
- Add a record-triggered flow on status change
Build a record-triggered flow that fires when ISCHANGED(Status) and routes downstream work (notifications, child record creation, integration calls). Use Status as the criterion variable; the flow inherits the order of execution for status-driven side effects.
Prevents users from adding ad-hoc values via the API. Required for a controlled status lifecycle.
Shared status value list reusable across objects. Edits propagate to every field that references the set.
Per-field setting that captures status changes for audit and time-in-status reporting.
- Forgetting to set Closed=true on a Case Status value produces phantom-open records in dashboards. Always audit the Closed flag on every status value, especially after adding a custom Closed status like Closed Without Resolution.
- Picklist Value Set edits propagate immediately to every field that references the set. Renaming a value updates the option everywhere; check every dependent object before renaming.
- Field History Tracking captures only the changes made after tracking was enabled. Existing records have no historical status data until the next edit; do not expect retroactive history.