Skip to content

Rules

Rules automate changes to transactions in Actual Budget. Actual Bench gives you a full condition/action builder that shows resolved entity names instead of raw IDs, plus power tools — templates, formulas, duplicate merging, and CSV round-trip — that the native rule editor doesn’t offer. To find problems across your rule set, use the separate Rule Diagnostics linter.

Open Rules from the Data Management sidebar section.

  • Resolved entity names everywhere — payees, categories, and accounts show as readable chips, and search matches them by name, so you never hunt through raw IDs.
  • Handlebars templates and Excel-style formulas with dedicated editor affordances.
  • Bulk-merge duplicate and near-duplicate rules into one.
  • CSV import and export of your entire rule set for bulk edits and backup.
  • A read-only linterRule Diagnostics — that flags missing references, shadowed rules, duplicates, and more.

A rule has conditions (when it applies) and actions (what it changes), and runs at a stage. Actual Budget applies rules when a transaction is created or imported.

Rules run in three stages, in order: pre, default, then post. Use stages to control which rules run before others (for example, normalize an imported payee in pre, then categorize in default).

  1. On the Rules page, create a rule to open the editor.
  2. A new rule starts with a guided default condition (Payee is) and a default action row.
  3. Set the condition field, operator, and value.
  4. Add an action.
  5. Save to stage the rule.

Validation stays neutral until you edit rows or attempt to save, then required fields are flagged, with inline warnings for risky catch-all or destructive combinations. Closing the drawer with unsaved edits prompts for confirmation.

  • Conditions support fields such as payee, imported payee, category, account, amount, and notes.
  • Combine them with AND / OR logic (conditions_op).
  • Operators include is, is not, contains, matches, lt, lte, gt, gte, and oneOf, among others. The matches operator shows a regex syntax hint.
  • Entity-reference values (payee, category, account) show as blue chips; plain string values show as green chips — so you can tell an ID reference from literal text at a glance.

Common actions include set payee, set category, set account, set amount, set notes, and link schedule.

Toggle the {} button on an action to enter template mode (Handlebars), for example {{regex imported_payee 'foo' 'bar'}}. Templates render as an amber monospace chip in the rules table.

Toggle the ƒ button on a notes or payee_name action to enter an Excel-style formula evaluated by HyperFormula, for example =IF(ISBLANK(notes), imported_payee, notes). Formulas must start with =. Template and formula modes are mutually exclusive per action row.

  • Duplicate a rule with one click.
  • Filter the list by stage, payee, or category.
  • Search resolves entity names — searching “Groceries” finds rules whose oneOf condition references that payee or category by ID. Resolved names are shown throughout (no raw IDs).
  • Links from the Payees and Categories pages filter the rules list to that entity automatically.
  1. Select the rules to combine.
  2. Choose Merge to open the merge dialog (it shares the main editor’s sections and validation).
  3. Review the merged result; the Delete originals checkbox is pre-ticked for full duplicates and unticked for near-duplicates.
  4. Confirm to stage the merge.

Merging from a Rule Diagnostics finding returns you to the diagnostics report afterward so cleanup flows naturally.

Rules created by schedules (those with a link-schedule action) are shown read-only on the Rules page and are excluded from bulk selection and merge. Manage them from the Schedules page.

Rules import/export uses a long CSV format — one condition or action per row, grouped by a rule_id. Key columns: rule_id, stage, conditions_op, row_type (condition/action), field, op, and value (use | to separate multi-value oneOf values). Formula values are exported with a leading ' so spreadsheets don’t evaluate them; the prefix is stripped on re-import.

A few practical patterns (use your own payees and categories):

  • Categorize by payee — condition Payee is "Fresh Market", action set category "Groceries".
  • Normalize imported text — a pre-stage template action on payee_name: {{regex imported_payee 'SQ \*' ''}}.
  • Fall back to imported payee — a formula on notes: =IF(ISBLANK(notes), imported_payee, notes).
  • Route by amount — condition amount gt 100000, action set category "Large Purchases".
  • Because Actual Budget runs rules on transaction create, a saved rule can change a transaction differently than you expect if other rules also apply. Use stages to order them.
  • A rule doesn’t run — check its stage and whether an earlier-stage rule already changed the field.
  • AND/OR confusion — verify conditions_op; AND requires all conditions, OR any.
  • A regex isn’t matching — check the matches syntax hint.
  • A template/formula won’t save — formulas must start with =; template and formula modes are mutually exclusive per row.
  • A schedule-linked rule can’t be edited — manage it from the Schedules page.