Repository navigation
Description
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
Generaltab. - Move Expensify Card rules into
Card restrictionsand workspace merchant rules intoExpense defaults. - Use tables to display and find rules in
Card restrictionsandExpense defaults. - Add a universal
New rulecreation flow supporting onlyRestrict card spendandApply 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
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 cardsblock rule (e.g. categories including adult services, ATMs, gambling). Locked row, opens the explainer modal.
- Custom: admin-created
Restrict card spendrules, each editable.
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:

- Card restrictions require the Expensify Card, and a locked
All cardsdefault 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 cardCTA; in that state no rule table or+ Rulecreation 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").

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)
- The
+ Rulebutton opens aNew ruleRHP 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 cardsblock rule and no custom card rules:Card restrictionsshows a single flat row, no subsection headers. - An admin adds a
Restrict card spendrule: 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 Owner
Current Issue Owner: @mallenexpensifyMetadata
Metadata
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
melvin-bot commentedon Jun 4, 2026
Triggered auto assignment to Design team member for new feature review - @dubielzyk-expensify (
NewFeature)Krishna2323 commentedon Jun 5, 2026
@Expensify/design, could I get a link to the Figma file, please?
59 remaining items
melvin-bot commentedon Jun 29, 2026
Payment Summary
Upwork Job
BugZero Checklist (@mallenexpensify)
[-][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[/+]mallenexpensify commentedon Jul 2, 2026
Added
Skip Paymentlabel, please comment and tag me if/when payment is due, thxJS00001 commentedon Jul 6, 2026
@Krishna2323 should we go ahead and close this one?
Krishna2323 commentedon Jul 6, 2026
Yes, we can close this one.