We successfully implemented automated approval routing for CapEx budget requests in our D365 Finance cloud environment using Power Automate, reducing approval cycle time by 60%. Previously, our capital expenditure approval process was entirely manual - requests would sit in email inboxes for days, and tracking status required constant follow-ups.
Our automated solution routes CapEx requests based on amount thresholds and cost centers. Requests under $50K go to department managers, $50K-$250K require VP approval, and anything above $250K needs CFO sign-off. The Power Automate flow integrates with D365 budget module, pulls request details, and dynamically assigns approvers based on organizational hierarchy stored in our system.
Key implementation aspects: We created custom fields in the budget request entity to track approval status and timestamps. The flow triggers when a budget request status changes to ‘Submitted’ and sends notifications via Teams with embedded approval buttons. Approvers can review budget impact analysis directly in the notification without logging into D365.
Result: Average approval time dropped from 8.5 days to 3.2 days. We’ve processed 340+ CapEx requests through this automated workflow over the past six months with zero routing errors.
We pull the hierarchy dynamically from D365 - that was critical for us too. The flow queries the Worker and Position hierarchy tables in real-time when a request is submitted. We use the ‘Get records’ action in Power Automate to retrieve the reporting chain based on the requester’s position.
The key is using the HcmPosition and HcmPositionHierarchy entities. When someone submits a CapEx request, the flow identifies their position, walks up the hierarchy based on the approval threshold, and assigns to the appropriate level. If a manager changes, it’s automatically reflected because we’re reading live data.
One gotcha: Cache the hierarchy lookup results in a variable to avoid multiple API calls. We initially hit throttling limits by querying the hierarchy multiple times per request.
Let me share the complete technical implementation for anyone looking to replicate this. The solution has three core components that work together to achieve the 60% cycle time reduction.
Component 1: Automated Approval Routing
The Power Automate flow triggers on budget request status change to ‘Submitted’. It uses conditional logic to determine routing path:
- Extract request amount and category from D365 budget request entity
- Query HcmPositionHierarchy to identify appropriate approver based on amount threshold ($50K, $250K breakpoints)
- For parallel approval categories (IT/facilities), create parallel branches that execute simultaneously
- Each approval path uses ‘Start and wait for an approval’ action with 72-hour timeout
- Approver receives Teams notification with embedded approve/reject buttons and budget impact summary
Component 2: CapEx Budget Request Integration
Custom fields added to BudgetRequest entity in D365:
- ApprovalStatus (enum: Pending/Approved/Rejected)
- ApprovalTimestamp (datetime for each approval stage)
- CurrentApprover (lookup to Worker entity)
- RoutingHistory (text field storing JSON array of approval chain)
The flow updates these fields at each stage, providing full audit trail. Integration uses D365 Finance and Operations connector in Power Automate with service principal authentication for secure API access.
Component 3: Approval Cycle Time Tracking
Key to measuring the 60% improvement:
- SubmittedDateTime captured when status changes to ‘Submitted’
- FinalApprovalDateTime captured when last approver acts
- Cycle time = FinalApprovalDateTime - SubmittedDateTime
- Power BI dashboard queries these timestamps to calculate average cycle time, identify bottlenecks by approver/department
Budget Availability Pre-Check Logic:
// Power Automate calls custom API endpoint
GET /api/budget/availability
?costCenter={RequestCostCenter}
&account={RequestAccount}
&amount={RequestAmount}
// Returns: {available: true/false, currentBalance: decimal}
Critical Success Factors:
- Dynamic hierarchy lookup prevents maintenance overhead - reads live from D365 HcmPosition tables
- Parallel approval paths for cross-functional categories eliminated sequential delays
- Budget pre-check at submission prevents approval of unfunded requests
- Teams integration with embedded buttons removes need to access D365 for simple approve/reject
- Automatic escalation after 72 hours prevents requests from stalling
Measurable Results After 6 Months:
- Average cycle time: 8.5 days → 3.2 days (62% reduction)
- 340+ CapEx requests processed with zero routing errors
- Approver satisfaction score increased from 6.2 to 8.9 (out of 10)
- 85% of approvals completed within 48 hours vs. 23% previously
- Finance team time spent on approval tracking reduced by 12 hours/week
The solution scales well - we’re now extending the pattern to OpEx budget requests and vendor contract approvals. The key is treating Power Automate as the orchestration layer while keeping D365 as the system of record for all budget data.
What about budget availability checks? Do you validate against remaining budget before routing for approval, or after? We’ve had situations where requests get fully approved only to discover the budget line is exhausted. Would save everyone time to catch that upfront.
Great point - we do an initial budget availability check at submission time before any routing occurs. The Power Automate flow calls a custom API endpoint that queries the budget register entries and calculates available balance for the specified cost center and account.
If insufficient budget exists, the flow immediately rejects the request and notifies the requester with current available balance. This prevents wasting approvers’ time on requests that can’t be funded. However, we don’t reserve the budget at this stage - that happens only after final approval when the budget reservation is created in D365.
We also include a budget impact summary in the approval notification showing current utilization percentage and projected utilization if the request is approved. Gives approvers context for their decision without switching to D365.
This is exactly what we need! Currently drowning in manual CapEx approvals. Quick question - how did you handle the organizational hierarchy integration? Do you maintain it separately in Power Automate or pull it dynamically from D365? We have frequent management changes and need the routing to stay current automatically.
Yes, parallel approvals were phase two of our implementation. We added a category field to budget requests that triggers different routing logic. For standard CapEx, it’s sequential (manager → VP → CFO based on amount). For IT/facilities, we use Power Automate’s parallel branch feature - finance and operations leads approve simultaneously, then it routes to CFO if both approve.
The tricky part was handling disagreements. If one approver rejects while the other approves, we route back to the requester with both sets of feedback. They can revise and resubmit, which restarts the parallel approval. We also added a timeout - if one approver doesn’t respond within 3 business days, it escalates to their manager with a reminder.
Impressive cycle time reduction. Did you implement any parallel approval paths? We have scenarios where both finance and operations need to approve simultaneously for certain CapEx categories like IT infrastructure or facility upgrades. Sequential routing adds too much delay for time-sensitive projects.