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-10-26] Merge-no system message shown after admin merging submitter's card & cash expense #104261
Version Number: v9.5.13-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:#102438 Email or phone of affected tester (no customers): N/A Issue reported by: Applause Internal Team Bug source: Pull Request QA execution Device used: Windows 11 / Chrome, iPhone 13 / iOS 27 Beta, Samsung Galaxy A52 / Android 14 App Component: Money Requests
Action Performed:
Preconditions:
Prepare 2 accounts (submitter & owner)
As submitter, import card transaction
As Owner, create a new WS and invite submitter to it
Steps:
[Submitter] Create 2 reports in the WS chat named as Report A & Report B
[Submitter] Add 2 manual expenses on Report B
[Submitter] go to self DM, open any imported card expenses -> More -> Move to Report -> Select Report A
[Owner] Navigate to submitter's WS chat
[Owner] Open the submitter's card expense in Report A -> More -> Merge -> Select any expense from Report B -> Select 2nd option on all details -> Continue -> Merge
[Submitter] Open Report B
Expected Result:
a system message from the admin shown and reads "merged expenses and moved one to Deleted"
Actual Result:
no system message shown after admin merging submitter's card & cash expense. it's also repro with a cash expense that is the only expense on its report (step 6 in PR)
👋 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.
Root cause (medium confidence): App never creates the MERGEDEXPENSEDELETED system message. It only displays it when the server sends it. So either:
(a) the server doesn't write the action for this flow, or writes it to the wrong report, or
(b) the server sends it with an empty message, and App hides it as "deleted". isDeletedAction only exempts a fixed list of action types, and MERGED_EXPENSE_DELETED isn't on it.
How to tell which: after the merge, check Report B's report actions in Onyx (or the MergeTransaction response). If no MERGEDEXPENSEDELETED action is there, it's (a) and needs a backend fix. If it's there with an empty message, it's (b), and the fix is one line in App: add the type to that exemption list.
Recommendation: Don't revert, because the merge itself works. Fix forward. If it's (a), consider demoting the blocker while the backend is fixed, unless product requires the audit-trail message at launch.
mergeTransactionRequest deletes the source transaction and report, moves the surviving IOU action, and calls API.write(MERGE_TRANSACTION). It doesn't build a system message for either report.
So offline, the message never shows until the request syncs. Online, it depends on the server response.
An empty-message action gets filtered out:
hasDeletedMessage treats an empty message array or empty html as deleted.
isDeletedAction then hides it unless its type is in the exemption list.
I couldn't inspect the server response or backend code, so I can't confirm whether it's (a) or (b).
changed the title [-]Merge-no system message shown after admin merging submitter's card & cash expense[/-][+][Due for payment 2026-10-26] Merge-no system message shown after admin merging submitter's card & cash expense[/+]on Oct 19, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.13-6 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-10-26. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ 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 Oct 16, 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/584897ae4f8e7eeba5f90ef6c8ada07373b86ac6aaa2f9c19ec8af494553802c
melvin-bot commentedon Oct 16, 2026
You have been assigned to this deploy blocker because you recently merged this PR: #102438
melvin-bot commentedon Oct 16, 2026
@stitesExpensify @daledah you have been assigned to this deploy blocker because you reviewed the offending PR: #102438
melvin-bot commentedon Oct 16, 2026
@youssef-lr you have been assigned to this deploy blocker because you authored the offending PR: #102438
melvin-bot commentedon Oct 16, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon Oct 16, 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:
youssef-lr commentedon Oct 16, 2026
Looking.
MelvinBot commentedon Oct 16, 2026
Deploy Blocker Investigation
Causing PR: [Payment due @daledah] Allow admins to merge card + cash expenses across draft reports. This is a gap in the new feature, not a regression. Production is unaffected.
Root cause (medium confidence): App never creates the
MERGEDEXPENSEDELETEDsystem message. It only displays it when the server sends it. So either:message, and App hides it as "deleted".isDeletedActiononly exempts a fixed list of action types, andMERGED_EXPENSE_DELETEDisn't on it.How to tell which: after the merge, check Report B's report actions in Onyx (or the
MergeTransactionresponse). If noMERGEDEXPENSEDELETEDaction is there, it's (a) and needs a backend fix. If it's there with an empty message, it's (b), and the fix is one line in App: add the type to that exemption list.Recommendation: Don't revert, because the merge itself works. Fix forward. If it's (a), consider demoting the blocker while the backend is fixed, unless product requires the audit-trail message at launch.
Investigation details
App checked at
9b90f4ab.App only defines and renders the action:
src/CONST/index.ts:1871definesMERGED_EXPENSE_DELETED.src/types/onyx/OriginalMessage.ts:1733types its payload asnever.SimpleMessageContent.tsx:105renders the text. App has no other use of the type.App doesn't create it optimistically:
mergeTransactionRequestdeletes the source transaction and report, moves the surviving IOU action, and callsAPI.write(MERGE_TRANSACTION). It doesn't build a system message for either report.An empty-message action gets filtered out:
hasDeletedMessagetreats an emptymessagearray or emptyhtmlas deleted.isDeletedActionthen hides it unless its type is in the exemption list.I couldn't inspect the server response or backend code, so I can't confirm whether it's (a) or (b).
view run
youssef-lr commentedon Oct 16, 2026
It's (b). Raising PR now.
[-]Merge-no system message shown after admin merging submitter's card & cash expense[/-][+][Due for payment 2026-10-26] Merge-no system message shown after admin merging submitter's card & cash expense[/+]melvin-bot commentedon Oct 19, 2026
@daledah
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.13-6 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-10-26. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ 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]