Repository navigation
[$175] All - Empty "Check your info" page appears in RHP after adding BA to Wallet #104515
Description
If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.
Version Number: 9.5.15-1
Reproducible in staging?: Yes
Reproducible in production?: Yes
If this was caught during regression testing, add the test name, ID and link from BrowserStack: #103902
Email or phone of affected tester (no customers): fischer9966+102026+103902wmem2@gmail.com
Issue reported by: Applause Internal Team
Bug source: Pull Request QA execution
Device used: MacOS 26.6.2 / Chrome, safari. iPhone 17 Pro / 27.0.1. Google Pixel 5 / Android 14
App Component: User Settings
Action Performed:
Preconditions:
- Admin invite a member to workspace. Member should not be admin of any workspace.
- Admin go to OD: Workspace > Workflows > Enable 'Collect bank account details' and select United States only
Steps:
- Log in as member from precondition step 1/
- Go to Account > Wallet
- Click Add bank account
- Select United States > Next
- Enter Routing Number 011401533
- Enter Account Number 1234567890
- Fill in the rest fields
- Click on Next
- Verify that the meaningful error message is shown and there's no duplicate message
- BA added to Wallet after review info and confirm
Expected Result:
Meaningful error message about info Review is shown before confirm, no duplicate message. RHP closed and BA added to Wallet after Review and Confirm without any issues.
Actual Result:
BA added to Wallet. But the empty "Check your info" page appears in RHP after review and confirm information. RHP is not closed. Unexpected error message appears after click Confirm on the empty "Check your info" page.
Workaround:
Unknown
Platforms:
- Android: App
- Android: mWeb Chrome
- iOS: App
- iOS: mWeb Safari
- iOS: mWeb Chrome
- Windows: Chrome
- MacOS: Chrome Safari
Screenshots/Videos
Bug7291406_1792529722380.103902-Web.mp4
Bug7291406_1792529871394.103902-iOS.mp4
Bug7291406_1792530291028.103902-Android.mp4
Applause Internal Information
Exported by: Chandana Kiran
Bug ID: 7291406
Upwork Automation - Do Not Edit
- Upwork Job URL: https://www.upwork.com/jobs/~022112662032795692456
- Upwork Job ID: 2112662032795692456
- Last Price Increase: 2026-10-20
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsNo status
Activity
applause-bot commentedon Oct 20, 2026
While Applause doesn't embed attachments for this bug, here are the links for quick view:
https://platform.applause.com/services/links/v1/external/6795c5b35884228875e350fce465d0913235169cf2eda56b500c4d2a5b1183f6
https://platform.applause.com/services/links/v1/external/203bb7b176a12cd8e149aab019cb76e538bbfaa7dc957e3e6829f79ef96734bf
https://platform.applause.com/services/links/v1/external/5cacbe53c89d44c33a6b2a42c455f414455735c4e2d3a95d2b1f45c8c36a1874
MelvinBot commentedon Oct 20, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
After a member adds a bank account through the Collect Deposit Account flow, the RHP doesn't close. Instead, an empty "Check your info" page appears, and clicking Confirm on it shows an error.
What is the root cause of that problem?
Each step of the flow is pushed as its own screen, so the RHP stack is Country → Details → Confirm → Success. When the account is created, Confirmation moves to Success and clears the form draft. The Confirm screen stays mounted underneath with blank values.
On Success, Continue (and the back button) calls
goBack()inCollectDepositAccount/index.tsx:58-61. That runs a bareNavigation.goBack(), which removes only the Success screen and reveals the stale, empty Confirm screen. Clicking Confirm there submits empty values, so the backend rejects it with the genericwalletPage.addBankAccountFailureerror.This regressed in Add a time sensitive task for setting up a deposit account, which changed
Navigation.goBack(ROUTES.SETTINGS_WALLET)toNavigation.goBack()so the flow could also open from Home. Surface verification error in Collect Deposit Account flow only exposed the bug during QA. It didn't cause it.Code references
useSubPage/index.tsx:38-44.linkTodefaults to PUSH:linkTo/index.ts:231-239.onNext()and then clears the draft right away:Confirmation.tsx:46-53.shouldReturnToCountryStepstays false and the stale page renders blank labels:index.tsx:52-56,index.tsx:85.nextPage()→ past the last page →onFinished(goBack):useSubPage/index.tsx:72-90. The header and Android back buttons on Success also callgoBack():index.tsx:100-104.walletPage.addBankAccountFailure:BankAccounts.ts:79-111.What changes do you think we should make in order to solve the problem?
In
CollectDepositAccount/index.tsx, close the whole flow when the user leaves Success:finishFlowhandler that clears the draft and callsNavigation.closeRHPFlow(). Other sub-page flows already use this pattern, for exampleMissingPersonalDetailsContent.finishFlowasonFinishedand inhandleBackButtonPresswhenpageIndex === SUCCESS.goBack()for the back button on the Country step.What alternative solutions did you explore? (Optional)
goBack(ROUTES.SETTINGS_WALLET): this fixes the Wallet entry point but sends users who started from Home to Wallet.shouldReplaceRoute: trueinuseSubPage: this keeps a single screen in the stack, but it changes how editing and going back to Confirm work, so it needs more testing.Confidence and open questions
Confidence: High from code reading. I didn't reproduce the bug in the app, because it needs an OldDot workspace with "Collect bank account details" enabled.
BankAccountPurposePage, another RHP screen sits before it. Check thatcloseRHPFlowgives the intended result there.shouldShowSuccess. If it does, dismissing the warning could fire the success effect early. That would be a separate edge case.Next Steps for Contributor+ team:
To accept:
@MelvinBot implement [this](https://github.com/Expensify/App/issues/104515)to create a draft PR.To refine:
@MelvinBot <your feedback>To reject: Explain why you are rejecting Melvin's proposal.
view run
melvin-bot commentedon Oct 20, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @brunovjk (
External)[-]All - Empty "Check your info" page appears in RHP after adding BA to Wallet[/-][+][$175] All - Empty "Check your info" page appears in RHP after adding BA to Wallet[/+]melvin-bot commentedon Oct 20, 2026
Job added to Upwork: https://www.upwork.com/jobs/~022112662032795692456
juni2003 commentedon Oct 20, 2026
Contributor details
Your Expensify account email: juni.xatti@gmail.com
Upwork Profile Link: https://www.upwork.com/freelancers/~01867ae3203c9b7815?mp_source=share
Proposal
Please re-state the problem that we are trying to solve in this issue.
After successfully adding a bank account via the Collect Deposit Account flow, tapping "Continue" (or the back button) on the Success screen drops the user onto a stale, blank "Check your info" screen instead of closing the Right-Hand Panel (RHP) flow.
What is the root cause of that problem?
The root cause is a Navigation stack management bug in the
useSubPageflow configuration.CollectDepositAccountflow pushes each sub-step (Country -> Details -> Confirm -> Success) onto the RHP navigation stack independently.src/pages/workspace/accounting/CollectDepositAccount/index.tsx(lines 58-61), theonFinishedcallback executes a bareNavigation.goBack().Navigation.goBack()only pops theSuccessscreen off the top of the stack. This drops the user right back onto theConfirmscreen.ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM_DRAFTstate upon reaching the Success screen, theConfirmscreen now renders with completely blank values. Clicking Confirm submits empty data, causing the genericaddBankAccountFailurebackend error.What changes do you think we should make in order to solve the problem?
We must use Expensify's global RHP dismissal method instead of a localized
goBack()when terminating a completed multi-step flow.In
src/pages/workspace/accounting/CollectDepositAccount/index.tsx, update thegoBackhandler to completely dismiss the modal stack when finishing the flow, rather than just popping the top screen.(Ensure handleBackButtonPress from useSubPage is still used for intermediate steps so users can navigate backward during data entry).
What alternative solutions did you explore? (Optional)
MelvinBot suggested manually calling
Navigation.closeRHPFlow()and manually clearing drafts inside onFinished. I rejected this becauseNavigation.dismissModal()is the canonical Expensify standard for terminating complete wizard flows (like Onboarding or Workspace Creation) as it correctly handles the modal unmount animation and state cleanup universally, regardless of whether the user entered from the Wallet page or the Home tab.melvin-bot commentedon Oct 20, 2026
✅ Contributor details stored successfully. Thank you for contributing to Expensify!
camesenin commentedon Oct 20, 2026
Contributor details
Your Expensify account email: camesenin@gmail.com
Upwork Profile Link: https://www.upwork.com/freelancers/~0170d6b02e9440e604
Proposal
Please re-state the problem that we are trying to solve in this issue.
In the Collect Deposit Account flow (adding a Bank Account to Wallet as a non-admin workspace member), after reviewing and confirming bank account information, the RHP fails to dismiss. Instead, a blank "Check your info" page appears and tapping Confirm results in an unexpected failure.
What is the root cause of that problem?
In
src/pages/settings/Wallet/CollectDepositAccount/index.tsx:Country->Details->Confirmation->Success) are pushed sequentially onto the RHP stack viauseSubPage.Confirmation.tsxtransitions toSuccessand immediately clears the form draft from Onyx.CollectDepositAccount/index.tsx:58-61and lines100-104:Successsub-page, it triggersonFinished(), which executes a bareNavigation.goBack().Navigation.goBack()only pops the topmostSuccessscreen from the RHP stack, revealing the staleConfirmationscreen underneath. Because the draft was already cleared, the Confirmation screen renders blank fields.walletPage.addBankAccountFailure.What changes do you think we should make in order to solve the problem?
In
src/pages/settings/Wallet/CollectDepositAccount/index.tsx:Define a
finishFlowhandler:finishFlowasonFinishedinuseSubPage.handleBackButtonPress, ifpageIndex === CONST.COLLECT_DEPOSIT_ACCOUNT.STEP.SUCCESS, callfinishFlow()instead of popping to the stale confirmation view.Navigation.goBack()for the initialCountrystep so users can smoothly return to Wallet or Home.Navigation.closeRHPFlow()is the standard pattern used across all multi-step RHP onboarding workflows (such asMissingPersonalDetailsContent), ensuring the entire sub-page stack is dismissed cleanly regardless of entry point (Wallet or Home time-sensitive task).Proof of Concept (Reproduction Demo)
What specific scenarios should we cover in automated tests?
In
tests/unit/CollectDepositAccountTest.tsx:Navigation.closeRHPFlowand does not reveal the underlyingConfirmationstep.melvin-bot commentedon Oct 20, 2026
✅ Contributor details stored successfully. Thank you for contributing to Expensify!
khizzcr7 commentedon Oct 21, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
After a member adds a bank account through the Collect Deposit Account flow, the RHP does not close. Instead, an empty "Check your info" page appears, and tapping Confirm on it shows an unexpected error.
What is the root cause of that problem?
useSubPage(src/hooks/useSubPage/index.tsx:38-44).onFinished, which is thegoBackhandler insrc/pages/settings/Wallet/CollectDepositAccount/index.tsx:58-61:Navigation.goBack()pops only the Success screen and reveals the stale, empty Confirm screen underneath (its draft was cleared when transitioning to Success inConfirmation.tsx:46-53).walletPage.addBankAccountFailureerror.Navigation.goBack(ROUTES.SETTINGS_WALLET)toNavigation.goBack()so the flow can also open from Home. PR Surface verification error in Collect Deposit Account flow #103902 only exposed the bug during QA.What changes do you think we should make in order to solve the problem?
Close the whole flow when the user leaves Success:
finishFlowhandler that clears the draft and callsNavigation.closeRHPFlow()(exported atsrc/libs/Navigation/Navigation.ts:1321; the same pattern other sub-page flows likeMissingPersonalDetailsContentuse).finishFlowasonFinishedand inhandleBackButtonPresswhenpageIndex === SUCCESS.goBack()for the back button on the Country step.BankAccountPurposePage(another RHP screen sits before it) socloseRHPFlowlands on the intended screen.Tests: complete the flow, press Continue on Success, assert the RHP closes and no stale Confirm screen is reachable; assert the back button on the Country step still goes back one screen.
jloa-dev commentedon Oct 21, 2026
Contributor details
Your Expensify account email: jloa.dev@gmail.com
Upwork Profile Link: https://www.upwork.com/freelancers/~0163955a2ba221e513
Proposal
Please re-state the problem that we are trying to solve in this issue.
In the Collect Deposit Account flow (adding a Bank Account to Wallet as a non-admin workspace member), after reviewing and confirming bank account information, the RHP fails to dismiss. Instead, an empty "Check your info" page appears and tapping Confirm results in an unexpected error.
What is the root cause of that problem?
src/pages/settings/Wallet/CollectDepositAccount/index.tsx,useSubPageconfigures the sub-page navigation:shouldReplaceRouteisfalse, so each step (Country->Details->Confirmation->Success) pushes a new screen instance onto the modal navigation stack viaNavigation.navigate().Confirmation.tsx,personalBankAccount.shouldShowSuccessbecomes true.Confirmation.tsxcallsonNext()(which advances toSuccess) and immediately callsclearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM)to clean up the draft data from Onyx.Successscreen, tapping "Continue" (or the back button) invokesonFinished, which triggersgoBack()inCollectDepositAccount/index.tsx:Navigation.goBack()only pops theSuccessscreen off the navigation stack, exposing theConfirmationscreen that is still sitting underneath it in the stack.Success, the exposedConfirmationscreen renders with empty values (showing the blank "Check your info" header without any fields).walletPage.addBankAccountFailure.What alternative solutions did you explore? (Optional)
None, ensuring modal dismissal via
Navigation.dismissModal()and enabling route replacement viashouldReplaceRoute: truealigns this flow with standard Expensify RHP patterns.What changes do you think we should make in order to solve the problem?
In
src/pages/settings/Wallet/CollectDepositAccount/index.tsx:Navigation.dismissModal()when dismissing/finishing the flow instead of a singleNavigation.goBack().shouldReplaceRoute: trueinuseSubPageoptions so intermediate subpages replace each other in place rather than stacking up in navigation history:What automated tests can you add to prevent this from re-occurring?
Add a unit test in
tests/unit/pages/CollectDepositAccountTest.tsxverifying that:CollectDepositAccountreplaces subpage routes without stacking multiple instances.onFinishedon theSuccesspage invokesNavigation.dismissModal(), cleanly closing the entire RHP.melvin-bot commentedon Oct 21, 2026
✅ Contributor details stored successfully. Thank you for contributing to Expensify!
melvin-bot commentedon Oct 21, 2026
✅ Contributor details stored successfully. Thank you for contributing to Expensify!
emkhalid commentedon Oct 21, 2026
@brunovjk I was able to successfully reproduce this issue and test the fix locally. Before you review Melvin’s proposal, please note that Melvin's proposed solution actually does not work and leaves the bug intact.
Why Melvin's solution is not correct:
Melvin suggests using
Navigation.closeRHPFlow()to exit the flow. However, when multiple sub-pages are pushed onto the RHP stack (asuseSubPagedoes here:Country→Details→Confirm→Success),closeRHPFlow()detects thatroutes.length > 1and only executes a singleStackActions.pop().This means
closeRHPFlow()only pops theSuccessscreen—leaving the user right back on the blank "Check your info" screen, exactly likegoBack()does.melvinproposal.101545.webm
The correct fix:
Instead of
closeRHPFlow(), we need to dismiss the modal stack usingNavigation.dismissModal()when finishing or backing out of theSuccessscreen, while preserving standard back navigation (Navigation.goBack()) on the initialCountrystep. This cleanly closes the RHP regardless of how many steps were pushed and works seamlessly across all entry points (Wallet, Home task, or Admin purpose selection).Demo Videos
ReproDemo104515.webm
FixDemo104515.webm
Would you like me to post the full proposal with the exact code changes and verified steps?
RajGahoi commentedon Oct 21, 2026
Contributor details
Your Expensify account email: gahoiraj01@gmail.com
Upwork Profile Link: https://www.upwork.com/freelancers/~014898525b9c53fc32
Proposal
Please re-state the problem that we are trying to solve in this issue.
After adding a bank account in the Collect Deposit Account flow, the Right Hand Pane (RHP) does not close. Instead, an empty "Check your info" page appears with a blank form, and clicking "Confirm" triggers an unexpected error message.
What is the root cause of that problem?
In
src/pages/settings/Wallet/CollectDepositAccount/index.tsx:CountrySelection→BankAccountDetails→Confirmation→Success.Confirmation.tsx:Success.Successscreen (or uses the header back button while onSuccess),onFinished: goBackexecutesNavigation.goBack().Navigation.goBack()only pops the top screen on the stack (Success).Successon the stack sits the priorConfirmationscreen ("Check your info").Confirmationre-renders with completely empty fields. Clicking "Confirm" submits empty payload parameters, triggering an API error.Navigation.closeRHPFlow()insidegoBackalso fails because when multiple sub-pages are pushed into the RHP stack,closeRHPFlowonly executesStackActions.pop(), once again revealing the previous sub-page instead of exiting the entire modal.What changes do you think we should make in order to solve the problem?
src/pages/settings/Wallet/CollectDepositAccount/index.tsx:Success, dismiss the modal entirely usingNavigation.dismissModal().Navigation.goBack()for exiting from the initialCountrySelectionstep so normal back navigation is preserved when the user cancels out of the flow before starting.Confirmation.tsx/shouldReturnToCountryStep:Ensure that if the
Confirmationscreen is ever mounted or re-focused without draft details (for example via browser navigation or deep linking after completion), it automatically redirects back toCountrySelectionrather than rendering an empty form:What specific scenarios should we cover in automated tests to prevent reintroduction of this issue in the future?
In
tests/unit/CollectDepositAccountTest.tsx:Successscreen. Verify thatNavigation.dismissModalis called and no intermediate sub-pages (/confirm,/details) remain open in the RHP.Successdismisses the modal rather than stepping backward toConfirmation.CountrySelectionstep callsNavigation.goBack()without dismissing external screens.What alternative solutions did you explore? (Optional)
Navigation.closeRHPFlow()was explored, but as noted,closeRHPFlow()only executes a single pop if other routes exist in the stack, which does not close multi-step sub-page flows.shouldReplaceRoute: trueinuseSubPagewas explored, but that disables normal backward navigation between Country and Details during editing. Dismissing the modal on completion while keeping step navigation intact is the standard architecture across Expensify RHP flows.melvin-bot commentedon Oct 21, 2026
✅ Contributor details stored successfully. Thank you for contributing to Expensify!
emkhalid commentedon Oct 21, 2026
Hi @juni2003 @camesenin @khizzcr7 @jloa-dev @Mannerless @RajGahoi thanks for your interest in contributing to Expensify!
If you're human contributors and not automation bots, please read the Contributing Guidelines and wait for the
Help Wantedlabel before posting proposals.App/contributingGuides/CONTRIBUTING.md
Line 164 in ccc47b1
Since you're new to the repo, I'd recommend going through the Contributing Guidelines before your next proposal.
You can find issues actually open for proposals here:
https://github.com/Expensify/App/issues?q=is%3Aissue+state%3Aopen+label%3A%22Help+Wanted%22
juni2003 commentedon Oct 21, 2026
Thanks for pointing that out, @emkhalid! I had read
CONTRIBUTING.mdbut misunderstood and assumed theExternallabel was the trigger to submit. I appreciate the clarification and will wait for theHelp Wantedlabel on all future issues. Thanks again!brunovjk commentedon Oct 22, 2026
I can no longer reproduce the bug. @emkhalid, are you able to? Thanks.
emkhalid commentedon Oct 22, 2026
@brunovjk , I was still able to reproduce the issue on my end. Here is the reproduction video:
ReproDemo.webm
Could you please double-check under these exact preconditions? If any of these are missing, the app diverts to a completely different bank account flow where the bug does not trigger .
Preconditions:
Reproduction Steps:
Please let me know if you are able to reproduce it with these preconditions.
brunovjk commentedon Oct 26, 2026
Thanks @emkhalid! Your finding about closeRHPFlow() is correct: with multiple routes in the RHP stack, it only pops one screen and would leave the original issue unresolved.
While reviewing the current code, I noticed that #104434 introduced shouldReplaceRoute: true and Navigation.goBack(basePath) in this flow. These changes appear to address the original navigation issue. That PR reached production in 9.5.18-1 on October 23, after your latest reproduction report. Can you still reproduce it? Thanks for the hard work.
emkhalid commentedon Oct 26, 2026
On it, thanks!
emkhalid commentedon Oct 27, 2026
@brunovjk I can no longer reproduce this issue, it seems to be fixed as you said, thanks!
brunovjk commentedon Oct 27, 2026
Thanks a lot @emkhalid. I also can no longer reproduce. Asked for help here.
Kabeer099 commentedon Oct 29, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
After a workspace member adds a bank account through the Collect Deposit Account flow (
Account > Wallet > Add bank account), the RHP does not close upon completion. Instead, an empty "Check your info" (Confirmation) page appears in the RHP, and clicking Confirm on that empty screen shows an unexpected error message.What is the root cause of that problem?
src/pages/settings/Wallet/CollectDepositAccount/index.tsx(lines 58-67),useSubPagepushes each step (Country->BankAccountDetails->Confirmation->Success) as a separate screen onto the RHP stack (shouldReplaceRoutedefaults tofalseinsrc/hooks/useSubPage/index.tsx:38-44).Confirmation.tsx(lines 46-53), it advances toSuccess(onNext()) and immediately clears the draft form values (clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM)), leaving the mountedConfirmationscreen underneath with empty form values.Successstep (CollectDepositAccount/index.tsx:58-61), tapping Continue (or the back button) invokesonFinished(goBack):Navigation.goBack()is called without a target route or modal dismissal, it only pops the topmostSuccessscreen off the RHP stack, exposing the cleared, emptyConfirmation("Check your info") screen underneath! Submitting that empty screen sends blank values to the backend, triggeringwalletPage.addBankAccountFailure.What changes do you think we should make in order to solve the problem?
In
src/pages/settings/Wallet/CollectDepositAccount/index.tsx(lines 58-61):onFinished) fromSuccess(or closing the flow), dismiss the entire RHP flow viaNavigation.closeRHPFlow()(orNavigation.dismissModal()) instead of calling a bareNavigation.goBack():onFinished: finishFlowtouseSubPageso completing theSuccessstep cleanly closes the entire Collect Deposit Account RHP stack whether the flow was launched fromAccount > Walletor from the Home page task.What alternative solutions did you explore? (Optional)
We also considered passing
shouldReplaceRoute: truewhen transitioning fromConfirmationtoSuccess, butCountryandBankAccountDetailswould still remain underneathSuccessin the RHP stack unlessNavigation.closeRHPFlow()is used on finish.