Surface "Create a rule" prompt on expense edits to drive merchant rule adoption in-situ - #99164
Conversation
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
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 |
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
…ations Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
🤖 Web test steps verification results: ✅ pass I ran a web regression pass on Regressions found1. 🟠 The callout covers and swallows taps on the "New messages" pillWhile the callout is up on a narrow layout, the floating "New messages" counter is painted underneath it and its tap target is intercepted — along with whatever report action sits in the top ~60–70px of the list. Both are absolutely positioned siblings anchored at
Trigger: narrow layout → single-expense report on a Control workspace with Rules + Your style comment says the stacking is deliberate, so the painting order may be an accepted trade-off. The tap-blocking half is not deliberate: the wrapper at 2. 🟡 Extra Onyx write on every expense edit, including workspaces that can never show it
Verified clean — the areas I expected to breakI checked each of these line by line and they preserve existing behavior:
Adjacent, not a regression, worth a cheap check: Runtime test resultsCoverage caveat: the callout itself never rendered during the run — the test account is a single-member workspace, so the report is a self/owner report, which your own spec excludes, and I couldn't confirm Next Steps: Reply with view run · no recording available |
…g on Collect Signed-off-by: krishna2323 <belivethatkg@gmail.com>
Repro step:
rule.mov |
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
@situchan still can't repro that bug: Monosnap.screencast.2026-09-10.11-24-43.mp4 |
ok then let's see if QA will find and report this |
Signed-off-by: krishna2323 <belivethatkg@gmail.com>
|
🚧 JS00001 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/JS00001 in version: 9.4.76-0 🚀
|
|
Yes, help site changes were required. Draft PR: #100907 This PR added a new way to create a Merchant Rule — the in-expense Create a rule prompt — and nothing under What the docs PR changes (all in
One thing to check. The prompt is gated behind the Why no other article needed a change
Prompt copy is @Krishna2323, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
Deploy Blocker #100922 was identified to be related to this PR. |
|
Deploy Blocker #100925 was identified to be related to this PR. |
|
Deploy Blocker #100927 was identified to be related to this PR. |
|
Deploy Blocker #100928 was identified to be related to this PR. |
|
Deploy Blocker #100936 was identified to be related to this PR. |
|
🚀 Deployed to production by https://github.com/mountiny in version: 9.4.76-1 🚀
Bundle Size Analysis (Sentry): |








Explanation of Change
Fixed Issues
$ #96354
PROPOSAL:
Tests
Prereqs
Control workspace with Rules, Categories, multi-level Tags, and Taxes enabled;
rulesRevampbeta; workspace admin; expense with a merchant (e.g. Uber); second non-admin account.A. Banner
✕, and "Create a rule to apply your changes to all expenses that match your criteria."Create a ruleis bold/blue in light and dark mode.B. Triggers
Banner appears for: Category, Tag, Tax, Description, Billable, Reimbursable.
Doesn't appear for: Merchant, Amount, Date.
C. Rule prefill
Don't change.D. Navigation
E. Dismissal
✕dismisses the banner for that expense for the session.F. Visibility
Banner should not appear for:
G. Existing flow
Offline tests
QA Steps
Same as tests
Verify that no errors appear in the JS console
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, 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.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_hybrid.mp4
Android: mWeb Chrome
android_mWeb.mp4
iOS: Native
ios_hybrid.mp4
iOS: mWeb Safari
ios_mWeb.mp4
MacOS: Chrome / Safari
web_chrome.mp4