Skip to main content

Tagging entities and categories.

~8 min read · The most important workflow in the app

Entity vs. Category — the mental model

CentProof tags every transaction along two independent axes:

  • Entity = WHO.The merchant, person, or business on the other end of the transaction. Examples: "Amazon", "Starbucks", "State Farm", "Client Acme", "Mom". Entities are nouns.
  • Category = WHAT.The kind of expense it was. Examples: "Software", "Coffee", "Insurance", "Travel", "Groceries". Categories are buckets — typically aligned with the tax-form lines that matter to you (e.g. Schedule C for 1099 freelancers).

The two are independent because one entity can have transactions in multiple categories. Amazon transactions could be Software (AWS bill), Office Supplies (printer ink), or Groceries (Whole Foods). Categorizing only by entity (e.g. just "Amazon") hides that distinction. Categorizing only by category (e.g. just "Software") hides which vendor you're paying.

Both axes are optional. You can tag entity but not category, or vice versa, or neither. Search and reports work on whatever you've tagged.

The three ways to tag

Click any transaction in the Transactions tab to expose three different tagging UIs:

  • Click the Entity column on a single row → opens Set entitydialog. Pick from the list or type a new name. Optional "Apply to all matching" toggle creates a correction rule.
  • Click the Category column on a single row → opens Set category dialog. Same shape, for the category axis.
  • Select multiple rows (checkbox) → Bulk Action Bar appears at the top of the Transactions view. Pick an entity or category to apply to all selected rows at once.

The single-row dialogs and the Bulk Action Bar behave differently in one important way: the dialogs can create a correction rule that applies to FUTURE imports too, while the Bulk Action Bar only updates the rows you explicitly selected. See Correction rules below.

Correction rules — "tag once, applies forever"

The single most valuable feature in CentProof is the correction-rule system. Here's the workflow:

  1. Click the Entity column on a STARBUCKS row → dialog opens.
  2. Pick "Starbucks" from the entity list (or type it to create new).
  3. The dialog auto-fills a Match pattern based on the row's description (e.g. STARBUCKS). You can edit it.
  4. The Apply to all matching checkbox is checked by default. Leave it checked.
  5. Click Save. CentProof:
    • Tags every existing transaction whose description contains "STARBUCKS" with the Starbucks entity (could be 50+ rows).
    • Saves a correction rule. Every FUTURE statement you import will auto-tag matching rows with Starbucks on commit — no manual action needed.

Do this for your top 20-30 recurring merchants over the course of a few imports and 80% of your transactions will auto-tag themselves going forward.

The combined "Also set category" workflow (v0.1.7)

Before v0.1.7, you had to open the Set entity dialog, save (creating the entity rule), then open the Set category dialog separately to save the category rule. It was easy to forget the second step — and a real user reported exactly this: their AUTOMATIC PAYMENT rows auto-tagged the entity on future imports, but the category stayed empty.

v0.1.7 adds an inline Also set a category for this pattern checkbox at the bottom of the Set entity dialog. When you check it, an inline category picker appears in the same dialog. On save, BOTH rules are created with the same match pattern. Future imports auto-tag both axes in one shot.

This is opt-in via the checkbox so the previous entity-only flow stays unchanged for users who want it.

Smart Tagging — what runs automatically on commit

When you commit a new statement, CentProof runs two passes on each new transaction:

  1. Deterministic correction sweep.Every correction rule you've created (entity rules AND category rules) is matched against the new transactions. Rules match on case-insensitive substring of the raw description; if you've also enabled fuzzy match on a rule, embedding-based semantic similarity catches near-matches too.
  2. Curated merchant dictionary (v0.1.7). CentProof ships with 286 hand-curated regex patterns for common US merchants (Amazon, Walmart, all major gas brands, Netflix, Spotify, Claude.ai, AWS, GitHub, etc.). Any row not covered by your rules but matching a dictionary pattern gets a suggestion instantly with no LLM call.
  3. AI suggestion pass (only when needed). For rows that aren't covered by your rules OR the dictionary, CentProof asks its local 3-billion-parameter language model to propose entity + category. Suggestions are stored as ghost badges (visually distinct from confirmed tags) until you accept them. See Ask CentProof for what the AI sees and what it doesn't.

The AI pass is skipped entirely on rows where both entity AND category were already set by a rule or the dictionary. That means after a few imports' worth of tagging, the AI suggestion phase on a new statement completes almost instantly — most rows have rules.

Renaming entities or categories (v0.1.7)

Sometimes you tag an entity quickly and want to clean up the name later — "amazon" → "Amazon" for capitalization, or "AT&T Wireless" → just "AT&T". The Entities tab (and Categories tab) has an Edit button on each row:

  1. Open the Entities or Categories tab from the left sidebar.
  2. Click Edit on the row you want to rename.
  3. A small dialog opens with the current name pre-filled and selected. Type the new name. Press Enter or click Save.
  4. Every transaction tagged with that entity / category immediately shows the new name. Correction rules continue to reference the same internal ID, so future imports work normally.

If the new name collides with an existing entity / category (e.g. you already have a separate "Amazon" and you're trying to rename "Amazon Inc" to "Amazon"), the dialog rejects the rename with a clear error. To merge two entities, delete the duplicate first, then rename. (Auto-merge with reassignment is planned for a future release.)

Removing a correction rule (Stop Rule)

Sometimes a rule turns out to be too broad — e.g.AMAZON matches both your Amazon Marketplace purchases AND your Amazon Web Services bill, and you'd rather they be tagged differently.

On the Entities or Categories tab, the Rules panel shows every saved correction rule. Each one has a Stop rule button. Clicking it:

  • Stops the rule from auto-tagging on future imports.
  • Does NOT untag any past transactions. Once tagged, they stay tagged — only future imports stop matching.

If you also want to clear the tag from past matching transactions, use the dialog's Clear and stop rule flow (opens via the Entity / Category cell click with empty selection).

Cleanup Inbox — bulk-tag in focused mode

The Cleanup Inbox is a dedicated view that surfaces untagged transactions one merchant at a time. It groups transactions by their cleaned-up merchant identifier and shows you: 47 untagged STARBUCKS rows, 23 untagged AWS rows, 12 untagged ARCO rows, etc.

You walk through merchant by merchant, picking an entity and category for each. Each acceptance creates a correction rule and clears all 47 / 23 / 12 rows at once. For an end-of-year cleanup where you have hundreds of untagged rows, the Cleanup Inbox is dramatically faster than tagging one row at a time.

Suggested practice: a tagging schedule

Best practice for a freelancer or anyone doing tax-time categorization:

  1. First import:tag the obvious top-20 merchants right after commit. Use "Apply to all matching" for each. Spend 10-15 minutes.
  2. Each monthly import: the Cleanup Inbox will surface any new merchants from this month. Tag them. Usually 5-10 minutes per month after the first import.
  3. Year-end cleanup:open the Cleanup Inbox in December and walk through anything that's still untagged. Set aside 30 minutes.
  4. Tax time: filter by category, export to CSV per Schedule C line. See Reports and exports.

Next: ask plain-English questions about your money

The local AI feature explained — what it does, what data it sees, and the questions that work best.

Ask CentProof →