You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Due for payment 2026-05-28] [Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable #91057
Version Number: 9.3.76-0 Reproducible in staging?: Yes Reproducible in production?: N/A - new feature, doesn't exist in prod If this was caught during regression testing, add the test name, ID and link from BrowserStack:#90411 Email or phone of affected tester (no customers):sdsdjoijdoisnjodis@gmail.com Issue reported by: Applause Internal Team Bug source: Exploratory - Significant User Experience Deterioration Device used: Mac 26.2 / Chrome App Component: Money Requests
Action Performed:
Precondition:
Enable Rules in workspace settings.
Set Billable default to Billable in Rules settings.
Go to staging.new.expensify.com
Go to workspace chat.
Create a non-reimbursable, billable expense.
Open the report.
Expected Result:
Billable row will be present in the expense report.
Actual Result:
Billable row is not present in the expense report when expense is not reimbursable. It is present only when the expense is reimbursable.
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
Identify the pull request that introduced this issue and revert it.
Classification: Frontend bug Causing PR: #90411 - "Hide redundant Reimbursable rows; show '· Non-reimbursable' on Amount" by @mukhrr (High confidence) Related Issues: #89548 (the issue that PR #90411 was fixing)
Recommendation: REVERT
PR #90411 introduced a logic regression that hides the Billable breakdown row when an expense is simultaneously non-reimbursable and billable. Reverting this PR will restore the correct behavior immediately.
Assigned: @mukhrr (PR author), @hoangzinh (approving reviewer), @rlinoz (approving reviewer) Labels: DeployBlockerCash kept (App PR is the cause). No label changes made.
Detailed Analysis
Evidence
The bug is staging-only and not reproducible in production, consistent with it being introduced by a PR in the current staging cycle.
The melvin-bot also identified this PR as the cause.
The issue specifically manifests with a workspace that has "Billable default" set to Billable in Rules — precisely the scenario that involves a non-zero billableTotal.
Verification
The affected file is src/components/ReportActionItem/MoneyReportView.tsx.
PR #90411 modified this file (confirmed via gh pr view 90411 --json files).
The !isSingleNonReimbursableExpense guard short-circuits the entire shouldShowBreakdown expression to false when the report has exactly one non-reimbursable transaction — even when billableTotal is non-zero (i.e., the expense is also marked as billable).
The original intent of the PR was to avoid showing redundant "Out of Pocket" and "Company Spend" breakdown rows when a report contains only a single non-reimbursable expense (since the total row already conveys that information). However, the guard was applied too broadly: it also suppresses the Billable row, which provides distinct and non-redundant information.
The fix should scope the isSingleNonReimbursableExpense guard to only suppress the non-reimbursable/reimbursable split rows, not the Billable row. However, since reverting is simpler and safer, that is the recommended action.
When the expense is a single non-reimbursable transaction, shouldShowBreakdown is forced to false regardless of whether a billable amount exists. This hides the entire breakdown block (lines 261-294) — including the Billable and Tax rows, which should still be visible.
The intent was to suppress only the redundant "Out of pocket" / "Company spend" rows, but the condition is too broad.
What changes do you think we should make in order to solve the problem?
Move the isSingleNonReimbursableExpense guard so it only suppresses the out-of-pocket/company-spend rows, not billable or tax.
This preserves the PR #90411 intent (hide redundant reimbursable breakdown for single non-reimbursable expenses) while keeping billable and tax rows visible.
Next Steps for Contributor+ team: Reply with @MelvinBot implement this to create a draft PR, @MelvinBot <your feedback> to refine this analysis, or explain why you are rejecting Melvin's proposal.
changed the title [-]Expense - Missing Billable row when expense is non-reimbursable[/-][+][Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable[/+]on May 19, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.3.77-3 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
@hoangzinh The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the BugZero Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.3.78-1 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
changed the title [-][Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable[/-][+][Due for payment 2026-05-28] [Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable[/+]on May 21, 2026
@hoangzinh The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the BugZero Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]
Activity
melvin-bot commentedon May 19, 2026
You have been assigned to this deploy blocker because you recently merged this PR: #90411
melvin-bot commentedon May 19, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon May 19, 2026
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
OSBotify commentedon May 19, 2026
Investigation Summary
Classification: Frontend bug
Causing PR: #90411 - "Hide redundant Reimbursable rows; show '· Non-reimbursable' on Amount" by @mukhrr (High confidence)
Related Issues: #89548 (the issue that PR #90411 was fixing)
Recommendation: REVERT
PR #90411 introduced a logic regression that hides the Billable breakdown row when an expense is simultaneously non-reimbursable and billable. Reverting this PR will restore the correct behavior immediately.
Assigned: @mukhrr (PR author), @hoangzinh (approving reviewer), @rlinoz (approving reviewer)
Labels:
DeployBlockerCashkept (App PR is the cause). No label changes made.Detailed Analysis
Evidence
StagingDeployCashchecklist (issue Deploy Checklist: New Expensify 2026-05-19 #91039) and was merged on 2026-05-18.billableTotal.Verification
The affected file is
src/components/ReportActionItem/MoneyReportView.tsx.PR #90411 modified this file (confirmed via
gh pr view 90411 --json files).The change introduced in
MoneyReportView.tsx:Before the PR,
shouldShowBreakdownwas:Root Cause
The
!isSingleNonReimbursableExpenseguard short-circuits the entireshouldShowBreakdownexpression tofalsewhen the report has exactly one non-reimbursable transaction — even whenbillableTotalis non-zero (i.e., the expense is also marked as billable).The original intent of the PR was to avoid showing redundant "Out of Pocket" and "Company Spend" breakdown rows when a report contains only a single non-reimbursable expense (since the total row already conveys that information). However, the guard was applied too broadly: it also suppresses the Billable row, which provides distinct and non-redundant information.
The fix should scope the
isSingleNonReimbursableExpenseguard to only suppress the non-reimbursable/reimbursable split rows, not the Billable row. However, since reverting is simpler and safer, that is the recommended action.MelvinBot commentedon May 19, 2026
Proposal
What is the root cause of that problem?
PR #90411 introduced
isSingleNonReimbursableExpenseatMoneyReportView.tsx:109-110and used it to gate the entireshouldShowBreakdown:When the expense is a single non-reimbursable transaction,
shouldShowBreakdownis forced tofalseregardless of whether a billable amount exists. This hides the entire breakdown block (lines 261-294) — including the Billable and Tax rows, which should still be visible.The intent was to suppress only the redundant "Out of pocket" / "Company spend" rows, but the condition is too broad.
What changes do you think we should make in order to solve the problem?
Move the
isSingleNonReimbursableExpenseguard so it only suppresses the out-of-pocket/company-spend rows, not billable or tax.At
MoneyReportView.tsx:110, changeshouldShowBreakdownto:At the breakdown items array (lines 264-265), add the guard to the individual
showconditions for the two reimbursable-related rows:This preserves the PR #90411 intent (hide redundant reimbursable breakdown for single non-reimbursable expenses) while keeping billable and tax rows visible.
Related issues
Next Steps for Contributor+ team: Reply with
@MelvinBot implement thisto create a draft PR,@MelvinBot <your feedback>to refine this analysis, or explain why you are rejecting Melvin's proposal.hoangzinh commentedon May 19, 2026
@mukhrr, are you available to pick up this DB?
5 remaining items
m-natarajan commentedon May 19, 2026
Not repro, Xiaomi Redmi Note 10 / Android 12, Chrome / v9.3.77-3 (Waiting for validation in iOS)
bandicam.2026-05-19.23-38-20-165.mp4
Screenrecorder-2026-05-19-23-35-00-731.mp4
[-]Expense - Missing Billable row when expense is non-reimbursable[/-][+][Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable[/+]melvin-bot commentedon May 19, 2026
Reviewinglabel has been removed, please complete the "BugZero Checklist".melvin-bot commentedon May 19, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.3.77-3 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-05-26. 🎊
For reference, here are some details about the assignees on this issue:
melvin-bot commentedon May 19, 2026
@hoangzinh The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the BugZero Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]
hoangzinh commentedon May 20, 2026
We can close this issue. No payment required
melvin-bot commentedon May 21, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.3.78-1 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-05-28. 🎊
For reference, here are some details about the assignees on this issue:
[-][Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable[/-][+][Due for payment 2026-05-28] [Due for payment 2026-05-26] Expense - Missing Billable row when expense is non-reimbursable[/+]melvin-bot commentedon May 21, 2026
@hoangzinh The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the BugZero Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]