Add DualEntry support for vendor matching - #100678
Conversation
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@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] |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
@Beamanator ready for review now! |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f27f58c496
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
hmm failing jest tests don't seem related, eh? I"ll retry them |
dylanexpensify
left a comment
There was a problem hiding this comment.
Looks good from Product 👍
|
@lakchote @Beamanator do you need C+ review for this PR? |
|
@hoangzinh thank you but i think we're good here! |
|
🤖 Web test steps verification results: DualEntry vendor matching could not be fully tested: the feature requires a real DualEntry account API key that Melvin's test environment cannot obtain, even after enabling both required betas and upgrading the workspace to Control plan. Verified that the Vendors row and Vendor field correctly stay hidden without a live connection; all steps that require an active DualEntry connection are blocked, not passed. view run · no recording available |
Beamanator
left a comment
There was a problem hiding this comment.
This is testing well and looking great!
|
🚧 Beamanator has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/Beamanator in version: 9.4.78-0 🚀
|
|
🤖 Yes, help site changes are required. Draft PR: Expensify/App#101141 There was no help site coverage for DualEntry vendor matching. What the docs PR does
Behavior from this PR that the article documents
On UI label verification Labels came verbatim from
I could not exercise these screens in the live UI — both the DualEntry connection and the Vendors row are beta-gated, so neither renders on a standard account. Everything above is read from the diff and The article is marked @lakchote, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
Hi @lakchote. We have several questions:
bandicam.2026-09-15.10-35-29-441.mp4
delete.vendor.mp4 |
|
@IuliiaHerets these changes are made in DualEntry, under Money Out > Vendors. The recordings show Expensify’s vendor list.
|
|
@lakchote we don't have access to Dual entry. When I go to vendor on the workspace settings they are not editable. Can you help please? |
|
🚀 Deployed to production by https://github.com/luacmartins in version: 9.4.78-3 🚀
Bundle Size Analysis (Sentry): |
|
@kavimuru @IuliiaHerets the Vendors page in Expensify is read-only. Vendors are imported from DualEntry, so deactivating a vendor or changing You should go there: https://app.dualentry.com/home/records/vendors |
|
@lakchote Actually we don't have account/credentials to login to https://app.dualentry.com/home/records/vendors. We have API key to connect the integration |
@m-natarajan you should have access with applausetester+dualentry@applause.expensifail.com |





Explanation of Change
DualEntry now supports the expense vendor picker, Vendors page, merchant rules, and vendor-name lookup. These features use the same eligible vendors as export. DualEntry follows Rillet in the source order and requires the
vendorMatchingbeta and a configured connection.This PR extends the vendor-matching support from the merged Rillet PR #100542. Current
mainis merged into this branch.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/679020
PROPOSAL:
Tests
Prerequisite: Use a workspace with the
vendorMatchingbeta enabled, DualEntry connected and configured, and at least one active vendor available to the selected company.More Features page
Manual vendor selection and search
Automatic vendor matching
Inactive-vendor error
Credit Card Misc fallback on export
Prerequisite: a DualEntry workspace with no default vendor set under Accounting > Export, and no vendor named
Credit Card Miscin DualEntry.Credit Card Miscvendor with no company set, and that the exported expense uses it. The workspace default vendor stays empty.Credit Card Miscvendor and no second one gets created.Offline tests
NA
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)myBool && <MyComponent />.src/languages/*files and using the translation methodWaiting for Copylabel for a copy review on the original GH to get the correct copy.STYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)/** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG))Avataris modified, I verified thatAvataris working as expected in all cases)ScrollViewcomponent to make it scrollable when more elements are added to the page.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