Setting up Stage Duration involves choosing the right capture mechanism, configuring the calculations, and operationalizing the metric in the team's pipeline reviews. The workflow below covers the standard sequence for a Sales Cloud implementation.
- Decide the implementation pattern
Choose between a custom Date field updated by automation, the OpportunityHistory standard object, or a custom history object. For most orgs, the custom Date field is the right starting point: simpler to configure, easier to query, integrates cleanly with formula fields. Document the choice in the org's design wiki along with the rationale, so future admins understand why the org went with this pattern.
- Configure the stage-entry capture
Create a custom Date field on Opportunity (Stage_Entry_Date__c). Build a Record-Triggered Flow that updates this field whenever the StageName field changes, setting it to the current date. Test the Flow by updating an opportunity's stage and confirming the date field updates correctly. Add the Stage_Entry_Date__c field to the relevant page layouts and report types.
- Build the Stage Duration formula and dashboards
Create a formula field Days_In_Stage__c that calculates TODAY() minus Stage_Entry_Date__c. Add the field to the Opportunity page layout. Build a standard report: Opportunities with Stage Duration over X days, grouped by Stage and Owner. Build a dashboard component highlighting stalled deals exceeding the team's threshold per Stage. Schedule the dashboard for review in the weekly pipeline meeting.
- Operationalize the stalled-deal review
Make Stage Duration a standing topic in the weekly pipeline review. Walk through the stalled deals dashboard with the team, asking specific questions about each deal: why has it stalled, what is blocking progress, what action will move it forward. Update the sales playbook based on patterns: which stages consistently produce stalled deals, what interventions help. The metric becomes valuable through this disciplined use, not through the technical implementation alone.
- Stage Duration only resets when the stage changes. Opportunities held in one stage indefinitely accumulate large durations without explicit reset.
- The OpportunityHistory object has its own quirks: it records every change but querying for the most recent stage entry is non-trivial.
- Stage Duration formulas using TODAY() refresh only when records are saved or queried. Dashboards may show slightly stale values until the next save.
- Stalled-deal thresholds should be stage-specific. A single global threshold misclassifies fast-stage deals as healthy and slow-stage deals as stalled.
- Stage skipping (jumping from Discovery directly to Proposal) creates orphaned stage entries. The automation should handle skipping gracefully.