Skip to content

[Rules Revamp] Release 1: Build the centralized Rules page foundation #92739

Closed

Description

@JmillsExpensify

Background

When companies adopt Expensify to enforce conditional spend policies, admins today have to learn individual, object-specific settings before they can understand what rules Expensify supports. New customers underestimate our capabilities, existing customers miss newly added controls, and both lose confidence as their policies grow.

This release builds the front-end foundation that makes existing rules easier to discover, understand, and configure, while setting us up for a more powerful deterministic rules engine. It does not add new rule capabilities yet; it reorganizes and re-presents what already exists into a single, consistent experience. Specifically, it introduces a General tab for common rules, a Card restrictions tab and an Expense defaults tab that use tables to scale to tens or hundreds of rules, and a single universal creation flow that covers the two supported custom rule types.

Scope

  • Support only rules that already live on the Rules page. No new enforcement behavior.
  • Keep the most common rules as configurable cards on a General tab.
  • Move Expensify Card rules into Card restrictions and workspace merchant rules into Expense defaults.
  • Use tables to display and find rules in Card restrictions and Expense defaults.
  • Add a universal New rule creation flow supporting only Restrict card spend and Apply expense defaults.

Product and design details

Tabs

The Rules page has three tabs in this release: General, Card restrictions, and Expense defaults. A + Rule button in the top-right opens the universal creation flow from any tab. Each table tab has a Find rule search field.

General tab

Image

Common, low-configuration rules render as tappable cards (not a table), grouped into sections:

  • Basic rules: Expenses older than, Expenses above amount, Receipt expectations, Accounting fields, etc..
  • We split card into two sections using a divider. The top focuses on common company policy settings, and the bottom more closely tracks to common product settings (e.g., reimbursable/billable settings, attendee tracking enablement, and eReceipts for USD transactions).

Each card opens the existing configuration surface for that setting. No behavior changes; this is a re-presentation of today's settings.

Default rules and the lock affordance

A row with a lock icon indicates a default rule that the admin cannot edit or delete. Clicking a locked row opens a centered modal explaining the feature. The modal is informational only (no edit controls). No new mocks are required for the modal because this functionality already exists; let's reuse the existing centered-modal pattern.

Card restrictions tab

Card restriction rules are shown in a table, split into two subsections when custom card restrictions exist in addition to the default rule.

  • Default: the locked, always-present All cards block rule (e.g. categories including adult services, ATMs, gambling). Locked row, opens the explainer modal.
Image
  • Custom: admin-created Restrict card spend rules, each editable.
Image

Subsection logic: if only the default rule exists (no custom rules), do not render the subsection headers; show a single flat list with just the default row. Subsection headers appear only once at least one custom rule exists.

Each row shows: Type (Block/Allow pill), Condition (single card, or a card plus an "and N more" summary), and Rule (plain-language summary, truncated with … when long). Clicking a row opens its edit flow.

Expensify Card gating / empty state:
Image

  • Card restrictions require the Expensify Card, and a locked All cards default block rule always exists for Expensify Card workspaces. Because that default is always present, there is no "no rules" empty state for workspaces with Expensify Cards.
  • For workspaces without the Expensify Card, the only empty state is the Expensify Card upsell. If a workspace is on Control and uses only third-party cards (no Expensify Card), the tab shows the existing Expensify Card upsell empty state ("Get the Expensify Card and control spend… 2% cash back") with a Get the card CTA; in that state no rule table or + Rule creation for card restrictions is shown.

Expense defaults tab

Expense default rules are shown in a table. Columns: Type, Condition (e.g. Merchant is "Figma"), and Rule (e.g. Category to "Meals and Entertainment").
Image

Label change: the Type pill for every expense-default rule reads Update or Rename, consistent with the existing logic today. The Rename label applies when the only rule is renaming the merchant.

Empty state: There is no empty state for expense defaults, as it won't be possible in Release 2. Accordingly, we won't add it in Release 1.

Universal creation flow (+ Rule)

Image
  • The + Rule button opens a New rule RHP titled "What do you want to do?". In R1 only two options appear:
  • Restrict card spend — "Block or limit spend at the point of sale." Configures: matching card(s); then permitted currencies, max spend amount, an Allow/Block toggle, blocked merchant, blocked merchant types, blocked currencies. Saves into Card restrictions.
  • Apply expense defaults — "Update fields without submitter doing anything." Configures: matching merchant (the "if any expense matches" condition); then defaults to apply: Category, Description, Tax. Saves into Expense defaults.

Each sub-flow ends with a Save rule button. After save, the user lands on the corresponding tab with the new rule visible and highlighted in the table.

Examples

  • A workspace with only the locked All cards block rule and no custom card rules: Card restrictions shows a single flat row, no subsection headers.
  • An admin adds a Restrict card spend rule: the Default and Custom rules subsection headers now appear.
  • A Control workspace using only third-party cards opens Card restrictions: they see the Expensify Card upsell empty state, not a rule table.
  • A workspace with no merchant default rules opens Expense defaults: they see the new empty state with a CTA to create the first default.
Issue OwnerCurrent Issue Owner: @mallenexpensify

Activity

  1. added
    InternalRequires API changes or must be handled by Expensify staff
    NewFeatureSomething to build that is a new item.
    on Jun 4, 2026
  2. melvin-bot commented on Jun 4, 2026

    @melvin-bot

    Triggered auto assignment to Design team member for new feature review - @dubielzyk-expensify (NewFeature)

  3. Krishna2323 commented on Jun 5, 2026

    @Krishna2323
    Contributor

    @Expensify/design, could I get a link to the Figma file, please?

  4. 59 remaining items

  5. melvin-bot commented on Jun 29, 2026

    @melvin-bot

    Payment Summary

    Upwork Job

    BugZero Checklist (@mallenexpensify)

    • I have verified the correct assignees and roles are listed above and updated the necessary manual offers
    • I have verified that there are no duplicate or incorrect contracts on Upwork for this job (https://www.upwork.com/ab/applicants//hired)
    • I have verified the PR was not reverted
    • I have applied any discounts due to bugs/regressions introduced by this PR
    • I have paid out the Upwork contracts or cancelled the ones that are incorrect
    • I have verified the payment summary above is correct
  6. changed the title [-][Due for payment 2026-06-30] [Rules Revamp] Release 1: Build the centralized Rules page foundation[/-] [+][Rules Revamp] Release 1: Build the centralized Rules page foundation[/+] on Jul 2, 2026
  7. removed their assignment
    on Jul 2, 2026
  8. added
    Skip PaymentSkips all the payment process steps for an issue. Use it for fixed-price projects.
    and removed
    Awaiting PaymentAuto-added when associated PR is deployed to production
    on Jul 2, 2026
  9. mallenexpensify commented on Jul 2, 2026

    @mallenexpensify
    Contributor

    Added Skip Payment label, please comment and tag me if/when payment is due, thx

  10. JS00001 commented on Jul 6, 2026

    @JS00001
    Contributor

    @Krishna2323 should we go ahead and close this one?

  11. Krishna2323 commented on Jul 6, 2026

    @Krishna2323
    Contributor

    Yes, we can close this one.

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

Metadata

Metadata

Labels

DailyKSv2InternalRequires API changes or must be handled by Expensify staffNewFeatureSomething to build that is a new item.Skip PaymentSkips all the payment process steps for an issue. Use it for fixed-price projects.

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions