Skip to content

[Due for payment 2026-08-07] Expense - Rate list is blank when current distance expense uses personal rate #91876

Closed

Description

@applause-bot

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!


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.
  1. Go to staging.new.expensify.com
  2. Go to self DM.
  3. Create a distance expense.
  4. Open the expense.
  5. Click More > Split > Save.
  6. Open any split.
  7. Click Amount.
  8. Click on the split.
  9. Click Rate.
  10. Click Upgrade > Confirm > Got it, thanks.
  11. 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.

Workaround:

Unknown

Platforms:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome Safari

Screenshots/Videos

Bug7164515_1779905211883.3.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Julia Ponikarchuk
Bug ID: 7164515

Issue OwnerCurrent Issue Owner: @ZhenjaHorbach

Activity

  1. added
    DeployBlockerCashThis issue or pull request should block deployment
    BugSomething is broken. Auto assigns a BugZero manager.
    on May 27, 2026
  2. applause-bot commented on May 27, 2026

    @applause-bot
    Author

    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

  3. melvin-bot commented on May 27, 2026

    @melvin-bot

    You have been assigned to this deploy blocker because you recently merged this PR: #84382

  4. melvin-bot commented on May 27, 2026

    @melvin-bot

    💬 A slack conversation has been started in #expensify-open-source

  5. github-actions commented on May 27, 2026

    @github-actions
    Contributor

    👋 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:

    1. Identify the pull request that introduced this issue and revert it.
    2. Find someone who can quickly fix the issue.
    3. Fix the issue yourself.
  6. MelvinBot commented on May 27, 2026

    @MelvinBot
    Contributor

    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 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:

    1. policyForTransaction = undefined — the split child report has no policyID, and the user isn't a member of any paid group policy.
    2. policyByCustomUnitID = undefined — skipped because isP2PRate is true.
    3. policyByCustomUnitRateID = undefined — skipped because distanceCustomUnitRateID === FAKE_P2P_ID.
    4. 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:

    const fallbackAvailablePolicy = isEditingSplit && !policyForTransaction && !policyByCustomUnitID && !policyByCustomUnitRateID ? availablePaidPolicies.at(0) : undefined;
    

    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)

    1. 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.
    2. 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.

  7. lakchote commented on May 28, 2026

    @lakchote
    Contributor

    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

  8. 29 remaining items

  9. mitarachim commented on Jul 29, 2026

    @mitarachim

    Deploy Blocker #97395 was identified to be related to the PR #92055 that attempted to fix this issue.

  10. melvin-bot commented on Jul 30, 2026

    @melvin-bot

    ⚠️ Looks like this issue was linked to a Deploy Blocker here

    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.

  11. jponikarchuk commented on Jul 30, 2026

    @jponikarchuk

    Deploy Blocker #97424 was identified to be related to the PR #92055 that attempted to fix this issue.

  12. melvin-bot commented on Jul 30, 2026

    @melvin-bot

    ⚠️ Looks like this issue was linked to a Deploy Blocker here

    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.

  13. lakchote commented on Jul 30, 2026

    @lakchote
    Contributor
  14. mitarachim commented on Jul 30, 2026

    @mitarachim

    Deploy Blocker #97436 was identified to be related to the PR #92055 that attempted to fix this issue.

  15. melvin-bot commented on Jul 30, 2026

    @melvin-bot

    ⚠️ Looks like this issue was linked to a Deploy Blocker here

    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.

  16. 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
  17. melvin-bot commented on Jul 31, 2026

    @melvin-bot

    @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]

  18. melvin-bot commented on Aug 19, 2026

    @melvin-bot

    ⚠️ Looks like this issue was linked to a Deploy Blocker here

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

BugSomething is broken. Auto assigns a BugZero manager.DailyKSv2Engineering

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions