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-08-07] Expense - Rate list is blank when current distance expense uses personal rate #91876
Version Number: 9.3.84-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:#84382 Email or phone of affected tester (no customers):soidjnosnjdoijsioj@gmail.com Issue reported by: Applause Internal Team Bug source: Exploratory - Significant User Experience Deterioration Device used: Mac 26.5 / Chrome App Component: Money Requests
Action Performed:
Precondition:
Account has no workspace.
Go to staging.new.expensify.com
Go to self DM.
Create a distance expense.
Open the expense.
Click More > Split > Save.
Open any split.
Click Amount.
Click on the split.
Click Rate.
Click Upgrade > Confirm > Got it, thanks.
Enter rate and save it.
Expected Result:
Rate list will show workspace rates when the current distance expense uses personal rate.
Actual Result:
Rate list is blank when the current distance expense uses personal rate.
👋 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.
When editing the rate of a split child that uses a personal/P2P rate (FAKE_P2P_ID), all policy resolution paths in IOURequestStepDistanceRate.tsx:88-99 are short-circuited by the isP2PRate guard, resulting in policy = undefined. Then getMileageRates(undefined) returns an empty object (because !policy?.customUnits is true), so the SelectionList renders with no items — a blank rate list.
The resolution chain at line 99 coalesces four sources: policyForTransaction, policyByCustomUnitID, policyByCustomUnitRateID, and fallbackAvailablePolicy. For a user with no workspace and a P2P distance expense:
policyForTransaction = undefined — the split child report has no policyID, and the user isn't a member of any paid group policy.
policyByCustomUnitID = undefined — skipped because isP2PRate is true.
policyByCustomUnitRateID = undefined — skipped because distanceCustomUnitRateID === FAKE_P2P_ID.
fallbackAvailablePolicy = undefined — skipped because isP2PRate is true.
All four are undefined, so policy = undefined, and the rate list is blank.
What changes do you think we should make in order to solve the problem?
The fallbackAvailablePolicy lookup at line 98 should not be gated on !isP2PRate. When a P2P distance expense is split, the user has already gone through the upgrade flow (step 10 in the repro), which means they now have a workspace. The rate selector should show that workspace's rates so the user can pick one.
Remove the !isP2PRate guard from the fallbackAvailablePolicy condition so it reads:
This allows the component to fall back to the user's available paid policy (which exists post-upgrade) and display its mileage rates, even when the original expense used a P2P rate.
What alternative solutions did you explore? (Optional)
Prevent navigation to the rate screen for P2P splits — this would avoid the blank list but would block the user from changing the rate after upgrading, which defeats the purpose of the upgrade flow.
Use useSplitEffectivePolicy hook (which SplitExpenseEditPage already uses) instead of the inline resolution chain — this would work but is a larger refactor. The minimal fix of removing the !isP2PRate guard from fallbackAvailablePolicy is less invasive and addresses the specific gap.
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 - Rate list is blank when current distance expense uses personal rate[/-][+][Due for payment 2026-08-07] Expense - Rate list is blank when current distance expense uses personal rate[/+]on Jul 31, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.4.46-10 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-08-07. 🎊
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]. If no checklist is needed for this issue, you can click: [no checklist button]
Activity
applause-bot commentedon May 27, 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/bfad7c7e14f7492fb9f9523a0ea5fd4013f7e7b3b4474203c180368202ab7901
melvin-bot commentedon May 27, 2026
You have been assigned to this deploy blocker because you recently merged this PR: #84382
melvin-bot commentedon May 27, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon May 27, 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:
MelvinBot commentedon May 27, 2026
Proposal
What is the root cause of that problem?
When editing the rate of a split child that uses a personal/P2P rate (
FAKE_P2P_ID), all policy resolution paths inIOURequestStepDistanceRate.tsx:88-99are short-circuited by theisP2PRateguard, resulting inpolicy = undefined. ThengetMileageRates(undefined)returns an empty object (because!policy?.customUnitsistrue), so theSelectionListrenders with no items — a blank rate list.The resolution chain at line 99 coalesces four sources:
policyForTransaction,policyByCustomUnitID,policyByCustomUnitRateID, andfallbackAvailablePolicy. For a user with no workspace and a P2P distance expense:policyForTransaction=undefined— the split child report has nopolicyID, and the user isn't a member of any paid group policy.policyByCustomUnitID=undefined— skipped becauseisP2PRateistrue.policyByCustomUnitRateID=undefined— skipped becausedistanceCustomUnitRateID === FAKE_P2P_ID.fallbackAvailablePolicy=undefined— skipped becauseisP2PRateistrue.All four are
undefined, sopolicy = undefined, and the rate list is blank.What changes do you think we should make in order to solve the problem?
The
fallbackAvailablePolicylookup at line 98 should not be gated on!isP2PRate. When a P2P distance expense is split, the user has already gone through the upgrade flow (step 10 in the repro), which means they now have a workspace. The rate selector should show that workspace's rates so the user can pick one.Remove the
!isP2PRateguard from thefallbackAvailablePolicycondition so it reads:This allows the component to fall back to the user's available paid policy (which exists post-upgrade) and display its mileage rates, even when the original expense used a P2P rate.
What alternative solutions did you explore? (Optional)
useSplitEffectivePolicyhook (whichSplitExpenseEditPagealready uses) instead of the inline resolution chain — this would work but is a larger refactor. The minimal fix of removing the!isP2PRateguard fromfallbackAvailablePolicyis less invasive and addresses the specific gap.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.lakchote commentedon May 28, 2026
Since we've added the guard to hide the selfDM splits feature in production in the PR #91932, I'm going to remove the deploy blocker label @mountiny
29 remaining items
mitarachim commentedon Jul 29, 2026
Deploy Blocker #97395 was identified to be related to the PR #92055 that attempted to fix this issue.
melvin-bot commentedon Jul 30, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.
jponikarchuk commentedon Jul 30, 2026
Deploy Blocker #97424 was identified to be related to the PR #92055 that attempted to fix this issue.
melvin-bot commentedon Jul 30, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.
lakchote commentedon Jul 30, 2026
Original issue is not reproducible by QA anymore, see https://expensify.slack.com/archives/C09V78U42D8/p1785396519081229?thread_ts=1785394378.160169&cid=C09V78U42D8
mitarachim commentedon Jul 30, 2026
Deploy Blocker #97436 was identified to be related to the PR #92055 that attempted to fix this issue.
melvin-bot commentedon Jul 30, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.
[-]Expense - Rate list is blank when current distance expense uses personal rate[/-][+][Due for payment 2026-08-07] Expense - Rate list is blank when current distance expense uses personal rate[/+]melvin-bot commentedon Jul 31, 2026
@ZhenjaHorbach
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.4.46-10 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-08-07. 🎊
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]. If no checklist is needed for this issue, you can click: [no checklist button]
melvin-bot commentedon Aug 19, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.