Using the app
Categories and rules
A category is where a transaction is filed. A rule is how it gets there without you.
Categories#
Each has a name, a kind, an optional icon and parent, and — once it has keywords — a priority.
Kinds#
The kind decides how the category's rows are read by every total. The most consequential field on the screen.
| Kind | Effect |
|---|---|
| expense | Money out. The default. |
| income | Money in. |
| transfer | Between your own accounts. Excluded from every total, unconditionally. |
| investment | Money out, into a brokerage or pension. Counted as spending, but the dashboard can exclude it — one lump sum otherwise dwarfs every other bar. |
Full consequences: What counts as spending.
Icons#
A category can also carry an icon — one emoji, shown wherever the category is named: the chips you assign rows to during review, the Transactions list, the category picker, the dashboard legend.
It stands where the colour dot stands, so no list gets wider, and the dot is what a category without an icon still shows. Nothing here is required, and nothing changes if you never set one.
Set it in the panel on the right: the slot beside the Name field opens the picker. It offers glyphs matched to the name you have typed — call a category Fuel or Paliwo and ⛽ is the first thing offered — and a search box for everything else. Search works in both languages regardless of which one the app is in, and pasting an emoji into it finds that one.
Two things on the count strip do it in bulk:
- suggest N more gives every category with no icon the one its name suggests. Categories the list has no opinion about are left alone rather than filled with something generic.
- undo: N appears straight after and takes back exactly those N. It never touches an icon you chose yourself.
Every starter category carries an icon, so a database created here starts with the ones you kept already marked. A database that existed before icons did starts with none — nothing is guessed at behind your back — and suggest N more is the one press that changes that.
Parents#
A parent makes a category a subcategory. The dashboard's Main categories toggle folds subcategories into their top-level parent, so Car → Fuel and Car → Insurance read either as two lines or as one.
What a new database starts with#
Whatever you picked on the first screen a new file shows you: step 1 of five, the categories.
It offers about twenty-five — Groceries, Eating out, Transport, Fuel, Health, Subscriptions, Travel, Salary, Investments and the rest — each with an icon and the keywords for the merchants a Polish account meets every month. All of them arrive ticked, because unticking the few you never spend on is less work than picking twenty in one by one.
Six of them divide the shopping: DIY (Castorama, Leroy Merlin), Home (IKEA, JYSK, Homla), Electronics (Media Expert, x-kom), Clothing (Reserved, Sinsay, CCC), Drugstore (Rossmann, Super-Pharm), and Shopping for the variety shops — Pepco, Empik. A hardware run and a new sofa are different decisions, so they get different bars. Housing is none of them: the rent and the building fees, not what you buy for the flat.
Tick the ones you spend on, and edit the lists in place: × on a chip drops a merchant you never pay, and the dashed field adds one you do — Enter commits it, and a name another category already claims is refused with that category named. Editing a list also ticks the category, because changing what it matches is a way of saying you want it.
Nothing reaches the file until Next: your accounts →. Three buttons above the list act on the whole set at once: Select all takes the lot; Reset suggestions returns the proposal as it first appeared and drops every keyword edit; Start with none unticks everything, and then the file genuinely starts empty — which is a supported way to begin, since any row in the import review can create a category on the spot. A category you keep with no keywords is legal too: it simply never auto-files, and you assign to it by hand.
What you keep is a starting point, not a scheme you are stuck with. Rename anything, delete what you don't spend money on, and add your own keywords as you meet them. The app writes the set once, when that step completes, and never touches it again — nothing here is re-created or restored later. A database you opened from disk, or one that already has transactions in it, is never seeded.
The keywords are chosen to be sure rather than complete: a row left uncategorized asks you a question, a row filed wrongly quietly answers it. So the obvious merchants are there and the ambiguous abbreviations are not, and the marketplaces on the never-match list below are deliberately absent.
A few large chains are missing for that reason alone. OBI sits inside ordinary Polish words, NETTO is how every invoice writes a net amount, and HEBE matches the surname Heberer — each would file more rows wrongly than rightly. Add them yourself if your statements spell them unambiguously: the review screen turns any row into a keyword in one press.
Editing#
- Merge repoints every transaction and rule into another category and deletes this one. The way to fold Jedzenie into Groceries without touching rows.
- Delete is refused while transactions carry the category — losing assignments has to be deliberate. Recategorize or merge first.
Rules#
A rule says: transactions whose field matches value get this category. The editor restates it in plain English as you type:
Every transaction whose title contains «BIEDRONKA» gets Groceries — unless a rule with a lower priority number matched first, or a never-match term blocked it.
Match types: keyword (the field contains this text), regex (a pattern), account (the counterparty's account number, compared IBAN-aware so spacing and a masked ending don't matter). Both keyword and regex are always case-insensitive.
Fields: title, counterparty name, or counterparty account.
How a category is chosen#
- The never-match stoplist wins over everything. A stoplisted term in the title or counterparty means no rule may fire, and the row lands in review marked with the term.
- Rules run in priority order, lower number first. The first match wins; the rest are not consulted. Ties are broken deterministically, so the same file always gives the same answer.
- Otherwise the row is uncategorized — a real bucket shown in gold, not a silent gap.
Whatever happens is recorded on the row as provenance, which is what lets every screen explain a category instead of asserting one.
The panel's Priority sets every keyword of the category at once. Per-rule priorities stay editable, and the panel warns when a category's keywords run at mixed priorities.
The list is grouped by that order rather than sorted by it: categories sit under a Priority 5 / 10 / 20 band that says what matching there means, and the categories no keyword reaches get their own No keywords heading at the bottom. Nothing auto-assigns to those — you pick them by hand in review or on the Transactions tab.
Every category is one line. Keywords shows as many of them as the column has room for and stops — hover the line for the rest — and Words counts them, so the whole set fits one screen and the columns line up down the page. A keyword is read here and edited in the panel on the right, which is where its hit count, its state and the way to change it live.
Managed rules — behind Internal transfer and Joint account — are maintained by the app from your account list. They run at priority 5, ahead of the keyword rules the picker writes at 20, because matching one of your own account numbers is stronger evidence than a word in a title. Leave them alone.
Rules that can never fire#
Keywords ignore case, so biedronka and BIEDRONKA are the same rule and the second is unreachable. Creating a duplicate is refused across all categories, naming the one already there. For duplicates that predate the check, the shadowed keyword is tagged shadowed in gold on its chip in the panel, the count strip tallies them all, and review them opens the banner that offers to remove them and keep the one that actually fires.
Each keyword carries its hit count on its chip in the panel, and one that has never matched says 0 hits instead. That is usually a typo. The count strip says how many of those there are across the whole file.
The never-match stoplist#
Some merchants sell everything, and a keyword rule for Allegro or Amazon would be confidently wrong most of the time. A transaction containing a stoplisted term is never auto-categorized and always lands in review.
The block is recorded like a rule match, so the screen says never-match «Allegro» rather than looking like the rules just missed. A new database is seeded with the obvious marketplaces.
Applying rules to existing rows#
Apply rules to N uncategorized runs the current rules over everything with no category yet, and reports the result. It only touches rows with no category, so it can never overwrite a manual assignment. The same operation is on the Transactions tab as Retry auto-categorization.