Problem
When Hold is applied during pre-submission or at any step in a multi-level approval, it causes the system to bypass the hold state, which prevents approvers and submitters from pausing an expense and resuming review at the same approval step.
Solution
To remove duplication of efforts and ensure Hold works as intended at every level, we’ll update the Hold logic so that held expenses remain at their current status (either draft or submitted) when either submission or approval takes place, allowing unheld expenses to flow through the process without delay.
With this project, the following will happen when a report is approved and there are held expenses on it:
-
Create a new processing report at the current approval level and move the held expense onto it
- This ensures that we’re not kicking back the held expense(s) back to the beginning of the workflow
-
Add a new system message to the new processing report that ensures a paper trail exists for auditing purposes
- The message will link the new processing report to the original report, allowing customers to trace the flow of expenses and audit for approvals as necessary.
- This ensures we’re not leaving any gaps in the workflow from an audit perspective
-
Have the approved, unheld expenses on the original report continue onwards to the next step in the approval chain
- This ensures that we do not hold back any unheld expenses from moving forward in the workflow while waiting for the held expenses to be clarified/fixed.
To ensure consistent patterns, we’ll update the draft report/hold behavior to do the following when delay submission triggers:
-
Create a new draft report at the submitter level and move the held expenses onto it
This ensures that we’re not submitting expenses when the submitter has intentionally held them back.
-
Move the unheld expenses and the original report to the next step as normal
This ensures that our hold functionality is working as intended, pausing expenses at their current state while other expenses move forward.
Tracking issue for #migrate Hold for Advanced Approval
DESIGN DOC ➡️: Here
Figma Folder: Here
Proposal: Here!
Pre-design 1: Here
Pre-design 2: Here
Pre-design 3: Here
Implementation issues
TBD
Cleanup tasks
TBD
Tasks
Backend issues
Frontend issues
Problem
When Hold is applied during pre-submission or at any step in a multi-level approval, it causes the system to bypass the hold state, which prevents approvers and submitters from pausing an expense and resuming review at the same approval step.
Solution
To remove duplication of efforts and ensure Hold works as intended at every level, we’ll update the Hold logic so that held expenses remain at their current status (either draft or submitted) when either submission or approval takes place, allowing unheld expenses to flow through the process without delay.
With this project, the following will happen when a report is approved and there are held expenses on it:
Create a new processing report at the current approval level and move the held expense onto it
Add a new system message to the new processing report that ensures a paper trail exists for auditing purposes
Have the approved, unheld expenses on the original report continue onwards to the next step in the approval chain
To ensure consistent patterns, we’ll update the draft report/hold behavior to do the following when delay submission triggers:
Create a new draft report at the submitter level and move the held expenses onto it
This ensures that we’re not submitting expenses when the submitter has intentionally held them back.
Move the unheld expenses and the original report to the next step as normal
This ensures that our hold functionality is working as intended, pausing expenses at their current state while other expenses move forward.
Tracking issue for #migrate Hold for Advanced Approval
DESIGN DOC ➡️: Here
Figma Folder: Here
Proposal: Here!
Pre-design 1: Here
Pre-design 2: Here
Pre-design 3: Here
Implementation issues
TBD
Cleanup tasks
TBD
Tasks
#whatsnextstrategy@expensify.comand paste in the Proposalstrategy@expensify.com(continue the same email chain as before) with the link to your Design Docstategy@expensify.comagain with links to the doc and pre-design conversation in SlackDesignDocReviewlabel to get the High-level of proposed solution section reviewedDesignDocReviewlabel to this issuestrategy@expensify.comone last time to let them know the Design Doc is moving into the implementation phaseBackend issues
Frontend issues
[Due for payment 2026-01-28] [$250] [AA Hold] Optimistically copy submission/approval related report actions to the new report after partial approval #74575
[Due for payment 2026-01-21] [$250] [AA Hold] Optimistically create the new system message linking to the original report after partial approval #74577
[Due for payment 2025-12-25] [$250][AA Hold] Show the CREATED report action when the expense report was created during harvest #74580
Send out a follow up email to
strategy@expensify.comonce everything has been implemented and do a Project Wrap-Up retrospective that provides: