[Payment due @hoangzinh] Add Paid by search filter UI, table column, sorting, and export - #98326
Conversation
The payer filter is now shown in the advanced filters and filter bar as a multi-select user filter, and a Payer column is available on expense report search views. The column is derived from the actor of the latest payment report action returned in the search snapshot, matching how First approver is derived, and is sortable and exportable.
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
Matches the backend gate on report status, so canceled or reopened reports fall back to having no payer column value.
The payer filter keeps its existing responsible-payer meaning (hidden from the filters UI as before) and the payment-actor work moves to a new paidBy filter key, table column, and translations. The paid-by syntax also accepts paid-by: like the other multi-word keys.
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx bun ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
…r-search-filter # Conflicts: # src/libs/SearchParser/autocompleteParser.js # src/libs/SearchParser/searchParser.js
…a/670393-payer-search-filter
|
@hoangzinh Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
@hoangzinh the pr is ready for rereview. |
|
@c3024, can you check this bug? Screen.Recording.2026-08-28.at.18.22.43.mov |
|
Other than that, I believe we're all set. |
Screen.Recording.2026-08-28.at.5.25.38.PM.movFixed. |
…serSearchQueryPreservingComma
|
@hoangzinh can you hit another review please? |
|
🎯 @hoangzinh, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
all yours @JS00001 |
|
🚧 JS00001 has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/JS00001 in version: 9.4.65-0 🚀
|
|
Yes — help site changes were required. Draft PR: #99963 This PR added a What the docs PR changes
Keywords in both articles were extended so "paid by" searches reach them. No new article — both changes extend existing lists, so the one-workflow-per-article rule in UI verificationRan the web tester against the live app to confirm exact labels before writing.
Evidence (5)Columns picker on the Reports view showing the Paid by entry
Filters panel on the Reports view showing the Paid by row
Paid by filter sub-page with a user selected
Paid by filter applied as a chip in the search bar
paid-by: typed and accepted in the Reports search bar
Two pre-existing doc inaccuracies I left aloneBoth are unrelated to this PR, so they are out of scope for the docs PR — flagging in case you want them fixed separately:
@c3024, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
Deploy Blocker #99968 was identified to be related to this PR. |
|
Deploy Blocker #99969 was identified to be related to this PR. |
|
No reason. I didn’t check the position closely. Moved it below “Paid status” in this PR. |
|
Agree with that Tom! |
|
🚀 Deployed to production by https://github.com/francoisl in version: 9.4.65-3 🚀
Bundle Size Analysis (Sentry): |
|
🤖 Payment issue created: #100091 |






Explanation of Change
paidBy:filter (also typable aspaid-by:, likeexpense-type:) to the advanced filters and filter bar as a multi-select user filter for expense, expense report, invoice, and trip searches. It matches the user who actually paid a report. The existingpayer:filter (the responsible payer, powering the Pay to-do) is unchanged and stays hidden from the filters UI, per the Slack naming decision.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/670393
PROPOSAL:
Tests
Screen.Recording.2026-08-18.at.4.54.26.PM.mov
Offline tests
NA
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-08-18.at.4.54.26.PM.mov