Skip to content

Resurface Top Spenders insight for track-intent workspace users#88752

Draft
MelvinBot wants to merge 2 commits intomainfrom
claude-resurfaceTopSpendersForTrackIntent
Draft

Resurface Top Spenders insight for track-intent workspace users#88752
MelvinBot wants to merge 2 commits intomainfrom
claude-resurfaceTopSpendersForTrackIntent

Conversation

@MelvinBot
Copy link
Copy Markdown
Contributor

@MelvinBot MelvinBot commented Apr 24, 2026

Explanation of Change

Removes the hard exclusion of the Top Spenders insight for track-intent users. Previously, isTrackIntentUser unconditionally removed TOP_SPENDERS from the insights keys array, preventing it from ever appearing — even when the user had upgraded to a paid workspace with 2+ members.

The existing eligibility check (isPaidPolicy && (isAdmin || isAuditor || isUserApprover) && memberCount >= 2) already correctly gates Top Spenders visibility. Removing the redundant track-intent gate allows workspace owners who invite members and upgrade to a paid plan to see Top Spenders naturally.

Fixed Issues

$ https://github.com/Expensify/Expensify/issues/618934

PROPOSAL:

Tests

// TODO: The human co-author must fill out the tests you ran before marking this PR as "ready for review"
// Please describe what tests you performed that validates your changed worked.

  • Verify that no errors appear in the JS console

Offline tests

N/A — this change only affects menu visibility logic, no network calls involved.

QA Steps

  1. Log in as a track-intent workspace owner (a user whose workspace was created via the "track expenses" onboarding intent)
  2. Invite at least one member to the workspace
  3. Ensure the workspace is on a paid plan (Team or Corporate)
  4. Navigate to Search > Reports tab
  5. Verify that the Top Spenders insight appears in the Insights section
  6. Verify that Spend Over Time, Top Categories, and Top Merchants insights also still appear as expected
  7. Log in as a non-track-intent user on a paid workspace with 2+ members
  8. Navigate to Search > Reports tab
  9. Verify Top Spenders still appears (no regression)
  10. Log in as a user on a free/personal workspace
  11. Verify Top Spenders does NOT appear (eligibility check still works)
  • Verify that no errors appear in the JS console

AI Tests

Test Result
Prettier Passed (no changes needed)
ESLint Could not run (pre-existing dependency issue with eslint-config-airbnb-base)
TypeScript (typecheck-tsgo) Pre-existing type errors only (unrelated userSelect style issues)
Jest (SearchUIUtilsTest.ts) Could not run (pre-existing ESM module loading issue with @react-navigation/core)

All failures are pre-existing and unrelated to this change. CI will validate in its own environment.

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

MelvinBot and others added 2 commits April 24, 2026 19:19
The Top Spenders insight was unconditionally hidden for track-intent
users via a hard exclusion in the insightsSearchKeys array. The existing
eligibility check (isPaidPolicy && admin/auditor/approver && 2+ members)
already correctly gates visibility, making the track-intent exclusion
redundant. Removing it allows track-intent workspace owners who invite
members and upgrade to a paid plan to see Top Spenders naturally.

Co-authored-by: Daniel Gale-Rosen <dangrous@users.noreply.github.com>
…kspace

Verifies that track-intent users on a paid workspace with 2+ members
and admin role can see the Top Spenders insight in search menu sections.

Co-authored-by: Daniel Gale-Rosen <dangrous@users.noreply.github.com>
@MelvinBot MelvinBot requested a review from a team April 24, 2026 19:25
@dangrous
Copy link
Copy Markdown
Contributor

@MelvinBot please complete the checklist

for human reviewers - this looks good but I haven't manually tested yet, will do that before requesting a reviewer

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Checklist updated. Here's a summary:

Checked off (verified by AI review):

  • Code patterns — no new callbacks, comments, copy/text, files, CSS, or JSDocs changes (all N/A for this 1-line logic removal + test addition)
  • DRY, constants, function arguments — no issues
  • Review guidelines followed
  • Unit test added
  • New file / new CSS / new code pattern — all N/A

Left unchecked (requires human action):

  • Local testing steps in Tests section (still has TODO for human co-author)
  • Manual offline testing, High Traffic account testing
  • Screenshots/videos on all platforms
  • Console error verification
  • Testing other impacted components
  • Post-merge re-test

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants