Customizing Status Reasons in Power Platform
Neil Haddley • May 24, 2026
How to add custom Status Reason choices, surface them on forms and views, and enforce allowed transitions using Status Reason Transitions in the classic Solution Explorer
Every Dataverse table ships with two system columns you can't delete: Status (statecode) and Status Reason (statuscode). Status has exactly two values — Active and Inactive. Status Reason is the refinement: it tells you why a record is in that state. Out of the box each group has one choice — "Active" and "Inactive" respectively — but you can add as many custom reasons as your process needs.
In this post I walked through the full lifecycle on a new Time Off Request table: adding custom Status Reason choices, surfacing them on forms and views, and then using Status Reason Transitions in the classic Solution Explorer to enforce which reasons are reachable from which, turning a free dropdown into a real workflow guard.
Creating the table
I started by creating a new unmanaged solution and adding a Time Off Request table to it.
Once the table was created, I opened its columns list to see what Dataverse had generated automatically.
The defaults: read-only Status, customisable Status Reason
Opening the Status column shows why you can't add choices to it directly.
Status Reason is different. Dataverse groups its choices by Status, so the Active group and the Inactive group each start with one default option.
Building a model-driven app to test with
I needed a live app to see how the Activate and Deactivate buttons behave, so I created a model-driven app against the new table.
Default activate/deactivate behaviour
I published and opened the live app to see how the default Activate and Deactivate buttons behave before any customisation.
The key finding: with only the default "Active" and "Inactive" choices, Power Platform skips the Status Reason picker entirely on both dialogs. The next step is to add custom choices.
Adding custom Status Reason choices
I went back to the Status Reason column editor and added meaningful options for a time-off workflow. For the Active group I added three progression stages:
- Submitted (Pending Approval) — value 623,460,001
- Approved by Manager — value 623,460,002
- HR Review — value 623,460,003
For the Inactive group I added four terminal states:
- Approved (Time Taken) — value 623,460,004
- Denied - Insufficient Balance — value 623,460,005
- Denied - Blackout Period — value 623,460,006
- Cancelled by Employee — value 623,460,007
What changes after adding custom choices
With custom options in place, both dialogs now prompt for a Status Reason.
Once you have more than one option in a status group, both the Activate and Deactivate dialogs prompt you to pick a Status Reason.
Adding Status and Status Reason to the form header
To make Status Reason editable directly on the form — and to make the current status visible at a glance — I added both fields to the form header.
Status is a read-only system field, so I locked it down in properties to make the intent explicit.
With the header updated, the record now showed both fields prominently.
I updated the record to "Approved by Manager" to test the deactivation flow now that Status Reason was on the form.
Adding Status Reason to the form header is the mechanism that makes the Deactivate dialog prompt for a reason. Without it on the form, the Confirm Deactivation dialog skips the picker entirely.
Adding Status Reason to views
To surface the Status Reason in list views, I opened the table's Views in the modern maker portal and added the Status Reason column.
Status Reason Transitions
So far the Status Reason dropdown showed all options for the current status group — a user could jump from "Submitted (Pending Approval)" straight to "HR Review" without going through "Approved by Manager". Status Reason Transitions locks that down: you define which reasons can follow which, so the dropdown only shows valid next steps.
This feature lives in the classic Solution Explorer, not the modern maker portal. To get there I clicked the "..." menu on the Solutions page and selected Switch to classic.
Inside the solution I navigated to Entities > Time Off Request > Fields, found statuscode (Status Reason), and opened it.
I clicked Edit Status Reason Transitions to open the transitions dialog.
For each current Status Reason I clicked the "..." button to open the Select Status Reason picker and chose which options should be reachable next. The transition logic I configured:
- Submitted (Pending Approval) → Approved by Manager, Denied - Insufficient Balance, Denied - Blackout Period, Cancelled by Employee
- Approved by Manager → HR Review, Denied - Blackout Period, Cancelled by Employee
- HR Review → Approved (Time Taken), Denied - Insufficient Balance
Seeing transitions in action
I created a new record — "Second Example Time Off Request" — to walk through the enforced workflow.
I saved the record, then advanced the Status Reason step by step.
Summary
Status and Status Reason are powerful columns that ship with every Dataverse table. The key things to know:
- Status is expected (Active/Inactive only) and managed by the platform — you should not add choices to it.
- Status Reason accepts custom choices grouped under Active or Inactive — add as many as your process needs.
- Status Reason Transitions (only available in the classic Solution Explorer) lets you define which reasons can follow which, turning a free dropdown into an enforced approval path.

































































