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 – Extra expense displayed when deleting a split expense offline #91918
👋 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: #84382 - "Add splits for unreported expenses" by @ZhenjaHorbach (High confidence) Related Issues: None
Recommendation: REVERT
PR 84382 introduced a regression in offline split-expense deletion. The fix is contained within a single, identifiable line change in SplitTransactionUpdate.ts that directly maps to the reported symptom.
Assigned: @ZhenjaHorbach (PR author), @dmkt9, @lakchote (approving reviewers) from highest-confidence causing PR only Labels: DeployBlockerCash kept (Frontend bug — App PR caused the issue). DeployBlocker not present, no change needed.
Detailed Analysis
Evidence
The issue is staging-only (not reproducible in production), which aligns with the staging deploy containing PR 84382.
The bug is triggered by: create a manual expense in a workspace chat, split it, go offline, then delete one of the split expenses — an extra expense appears.
PR 84382 ("Add splits for unreported expenses") was merged on 2026-05-27 and is included in the current staging deploy (v9.3.83-3 / 9.3.84-0).
PR 84382 directly modifies src/libs/actions/IOU/SplitTransactionUpdate.ts, src/libs/actions/IOU/SplitExpenseItems.ts, src/libs/actions/SplitExpenses.ts, and src/hooks/useDeleteTransactions.ts — all the core split-expense code paths.
Verification
The affected file is /home/runner/_work/App/App/src/libs/actions/IOU/SplitTransactionUpdate.ts.
PR 84382 modifies this file and introduces the following change at line 1251:
The PR modifies src/libs/actions/IOU/SplitTransactionUpdate.ts (confirmed via gh pr view 84382 --json files).
The change at line 1251 directly controls offline split-deletion behavior.
The pre-existing comment directly above this line reads: "resulting in 3 transactions (deleted, undeleted, and original) being shown at the same time when offline. Since original transaction will be reverted and both splits will eventually be deleted, we remove the undeleted split entirely instead of marking it for deletion."
Root Cause
The updateSplitTransactions function has a known edge case in offline reverse-split operations: when a split expense is deleted, an "undeleted" split and the original transaction can temporarily both be visible at once, producing an extra phantom expense. The pre-existing code handled this by using forceDeleteSplitTransactionID to immediately remove the undeleted split from Onyx (force-delete) even while offline.
PR 84382 added the && !isOffline guard, disabling this force-delete when the device is offline. When isOffline is true, forceDeleteSplitTransactionID becomes undefined, so the undeleted split is no longer removed from Onyx. This means all three items — the deleted split, the undeleted split, and the original transaction — are visible simultaneously while offline, exactly matching the reported symptom of "an extra expense is displayed after deleting one of the split expenses while offline."
changed the title [-]Expense – Extra expense displayed when deleting a split expense offline[/-][+][Due for payment 2026-08-07] Expense – Extra expense displayed when deleting a split expense offline[/+]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
melvin-bot commentedon May 28, 2026
Triggered auto assignment to @yuwenmemon (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.melvin-bot commentedon May 28, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon May 28, 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 28, 2026
Investigation Summary
Classification: Frontend bug
Causing PR: #84382 - "Add splits for unreported expenses" by @ZhenjaHorbach (High confidence)
Related Issues: None
Recommendation: REVERT
PR 84382 introduced a regression in offline split-expense deletion. The fix is contained within a single, identifiable line change in
SplitTransactionUpdate.tsthat directly maps to the reported symptom.Assigned: @ZhenjaHorbach (PR author), @dmkt9, @lakchote (approving reviewers) from highest-confidence causing PR only
Labels:
DeployBlockerCashkept (Frontend bug — App PR caused the issue).DeployBlockernot present, no change needed.Detailed Analysis
Evidence
v9.3.83-3/9.3.84-0).src/libs/actions/IOU/SplitTransactionUpdate.ts,src/libs/actions/IOU/SplitExpenseItems.ts,src/libs/actions/SplitExpenses.ts, andsrc/hooks/useDeleteTransactions.ts— all the core split-expense code paths.Verification
The affected file is
/home/runner/_work/App/App/src/libs/actions/IOU/SplitTransactionUpdate.ts.PR 84382 modifies this file and introduces the following change at line 1251:
Before:
After:
src/libs/actions/IOU/SplitTransactionUpdate.ts(confirmed viagh pr view 84382 --json files).Root Cause
The
updateSplitTransactionsfunction has a known edge case in offline reverse-split operations: when a split expense is deleted, an "undeleted" split and the original transaction can temporarily both be visible at once, producing an extra phantom expense. The pre-existing code handled this by usingforceDeleteSplitTransactionIDto immediately remove the undeleted split from Onyx (force-delete) even while offline.PR 84382 added the
&& !isOfflineguard, disabling this force-delete when the device is offline. WhenisOfflineistrue,forceDeleteSplitTransactionIDbecomesundefined, so the undeleted split is no longer removed from Onyx. This means all three items — the deleted split, the undeleted split, and the original transaction — are visible simultaneously while offline, exactly matching the reported symptom of "an extra expense is displayed after deleting one of the split expenses while offline."44 remaining items
mitarachim commentedon Jul 29, 2026
Deploy Blocker #97403 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
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.
mitarachim commentedon Jul 30, 2026
Deploy Blocker #97436 was identified to be related to the PR #92055 that attempted to fix this issue.
[-]Expense – Extra expense displayed when deleting a split expense offline[/-][+][Due for payment 2026-08-07] Expense – Extra expense displayed when deleting a split expense offline[/+]melvin-bot commentedon Jul 31, 2026
@ZhenjaHorbach / @dmkt9
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.